前言
最近在实现投影图片到模型上的效果的时候,掌握了一些知识点,特此记录,供以后参考。
知识点
空间坐标转换
1.用矩阵转换向量时,被转换的向量维度应与矩阵相同,比如模型空间转世界空间:
错误代码:
float3 pos = float3(x, y, z);
pos = mul(unity_ObjectToWorld, pos);
正确代码:
float3 pos = float3(x, y, z);
pos = mul(unity_ObjectToWorld, float4(pos, 1)).xyz;
求某向量到平面的投影向量
已知:
1.向量vec
2.平面法向量n
算法步骤:
1.归一化平面法向量n1 = normalize(n)
2.计算vec
在法向量上的投影vec1 = n1 * dot(n1, vec)
3.vec - vec1即为所求
构造UV的变换矩阵
注意点:
1.uv是二维的,所以构造的矩阵是float3x3
2.uv本身是[0, 1],而我们变换一般是以中心点为基准,所以应先变换到[-0.5, 0.5]
3.缩放因子应使用倒数
代码:
// 参数1为目标uv
// 参数2为控制参数,以四维向量表示,[x, y, z, w]=[横向平移, 纵向平移, 旋转, 缩放]
float2 TransformUV(float2 uv, float4 transformParam)
{
float2 finalUV = uv - float2(.5, .5);
float rot = radians(transformParam.z);
float scale = max(1 / transformParam.w, 0);
float sinVal = sin(rot) * scale;
float cosVal = cos(rot) * scale;
float3x3 myMatrix = float3x3(
cosVal, -sinVal, 0,
sinVal, cosVal, 0,
0, 0, 1
);
finalUV = mul(myMatrix, float3(finalUV + transformParam.xy,1)).xy;
finalUV += float2(.5, .5);
return finalUV;
}
矩阵
1.shader中的矩阵按可按索引获取坐标系的各轴向量,比如:
UNITY_MATRIX_V[0].xyz --> 摄像机x轴在世界空间下的值
UNITY_MATRIX_V[1].xyz --> 摄像机y轴在世界空间下的值
UNITY_MATRIX_V[2].xyz --> 摄像机z轴在世界空间下的值
2.c#中的Matrix的索引排列如下:
0 4 8 12 1 5 9 13 2 6