目标
在模型上实现喷涂功能,喷涂编辑时以摄像机视野为中心将图片喷绘到模型上,图片可进行缩放、移动、翻转等操作,喷涂完成后图片随模型的移动而动,随各子部件的旋转而转动。
思路
结合项目的实际情况,喷绘时模型是保持不动的,摄像机的x、y轴随手势转动,由此实现步骤如下:
- 通过固定参数计算出喷绘时摄像机相对于模型根物体的矩阵数据;
- 将第1步的矩阵转换为相对于各接受喷绘的子物体的矩阵后传入shader;
- shader中使用矩阵计算模型顶点在摄像机(虚拟)空间的位置;
- 将位置数据转换为uv;
- 对uv根据传入的参数进行缩放、旋转、平移等操作;
实现
一、通过固定参数计算出喷绘时摄像机相对于模型根物体的矩阵数据
在这一步的实现中,主要是对矩阵要有所理解,以前网上学习矩阵知识,多是基础理论的讲解、推导等,鲜有结合实际的说明,在这里总算是对矩阵有了进一步的理解,记录在这里,供参考。
所谓矩阵,其实就是包含了位置、旋转、缩放参数的数据,具体的数据含义这里不讲了,网上很多。具体到Unity中,比如一个子物体相对于世界的LocalPosition是(1,1,1),LocalEulerAngles是(0,0,0),LocalScale是(1,1,1),那么通过矩阵的SetTRS方法得到的结果就是该子物体的LocalToWorldMatrix,这个值的逆inverse就是该子物体的WorldToLocalMatrix,也就是世界