Unity解决VR画画问题

641次阅读
一条评论

一、画笔

画笔实现的功能就是从笔尖发射射线,碰到带有标签的画布之后,调用画布开始画画。

Unity 解决 VR 画画问题

需要一个发射点(launchPoint),以及射线发射的距离(maxDistance),LineRenderer 作为测试用,可以忽略。

切换颜色的效果可以在开头定义颜色,替换第二个参数 huaBu.SetPixel(hit.point, Color.blue);

二、画布

画布实现的是将画笔碰到画布的射线的世界坐标转为自身局部坐标,这样就可以得到一个点,在通过对这个点进行放大,就可以实现画画

Unity 解决 VR 画画问题

需要注意的是,画布的 RawImage 的类型需要为 ARGB32。这里用代码实例化一个 Texture2D,并且将他的类型改成了 ARGB32。然后再替换 RawImage 自身的 texture。这样在运行结束的时候,画不会被保存。

RawImage 本身需要有碰撞体,否则射线检测不到,碰撞体大小和画布一样大。

清除画布的实现就是遍历画布的长宽,将每个像素点都变成原始颜色。

public class HuaBu : MonoBehaviour
{
    public RawImage huaBu;  // 用原始图像
    public int brush_Size = 15; // 笔刷大小
    private int width, height;  // 画布的长宽
    private Texture2D huaBu_texture; // 新建 Texture2D 

    void Start()
    {Texture2D tex = (Texture2D)huaBu.mainTexture;

        huaBu_texture = new Texture2D(tex.width,tex.height,TextureFormat.ARGB32,false);
        width = huaBu_texture.width;
        height = huaBu_texture.height;

        huaBu_texture.Apply(); // 更新应用
        huaBu.texture = huaBu_texture;
    }

    public void SetPixel(Vector3 hitPosition, Color color) // 画笔触碰时调用
    {Vector3 InversePoint = huaBu.transform.InverseTransformPoint(hitPosition);
        for (int i = (int)InversePoint.x - brush_Size; i < InversePoint.x + brush_Size; i++)
        {for (int j = (int)InversePoint.y - brush_Size; j < InversePoint.y + brush_Size; j++)// 两次 for 进行笔刷放大
            {huaBu_texture.SetPixel(i + huaBu_texture.width / 2, j + huaBu_texture.height / 2, color);
            }
        }
        huaBu_texture.Apply();}

    public void ClearImagePixel()// 清除画布
    {for(int i=0;i< width;i++)
        {for(int j=0;j<height;j++)
            {huaBu_texture.SetPixel(i, j, Color.white);
            }
        }
        huaBu_texture.Apply();}

}

最后需要注意的是,画布的长宽根据白色图片分辨率而定,不能图方便设置成 1,1,。否则就是一个像素,要用缩放设置成合适大小。

Unity 解决 VR 画画问题

RawImage 作为子物体,填满画布就行。

Unity 解决 VR 画画问题
Unity 解决 VR 画画问题
正文完
 2
评论(一条评论)
一位 WordPress 评论者 评论达人 LV.1
2024-11-14 19:26:52 回复

您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar

     未知