坐标转换
一个向量可以被表示为
基向量可写成矩阵的方式:
一个坐标系可以使用任意线性无关的基向量构成,如
使用由
即
最终得到了由基向量表示的结果,由此可见
如果把矩阵的行解释为坐标系的基向量,那么乘以该矩阵就相当于执行了一次坐标转换,若有
,我们就可以说, 将 转换到 。
从另一个角度看,x,y,z分量分别代表了向量在每个基向量方向上分别“走了多少个单位”,变换的只是基向量的方向,而在每个方向上走多远却没有改变。
旋转
使用单位且正交的基向量
可以发现,在矩阵变换向量的过程中,也完成了旋转。
应用
首先确定一个
float3 forward = direction;
half isParallel = step(0.999, forward.y);
float3 up = isParallel * float3(0, 0, 1) + (1 - isParallel) * float3(0, 1, 0);
float3 right = normalize(cross(up, forward));
up = normalize(cross(forward, right));
在
例如可以使用计算得到的三个基向量变换模型空间的顶点位置,以此达到旋转模型的目的:
float3 newPos = positionOS.x * right + positionOS.y * up + positionOS.z * forward;
或者构成矩阵用以旋转向量:
float3x3 rotationMatrix = float3x3(right, up, forward);
在实际使用过程中注意左乘和右乘的区别,即行向量与列向量的使用区别:
向量以行表示,则矩阵以行构建,向量以列表示,则矩阵以列构建。
在Unity Shader中, float3x3(right, up, forward) 表示将向量以行向量的方式组成矩阵,故变换向量时使用 mul(vector, rotationMatrix) 方式计算,若 rotationMatrix 以列向量方式存储,故变换向量时使用 mul(rotationMatrix, vector) 方式计算。
参考
《3D数学基础:图形与游戏开发》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律