来自大佬的简易方法
https://www.zhihu.com/question/288528062/answer/463195686
有来自DirectX坐标系的动作数据,需要转换到OpenGL/Vulkan坐标系下。
遂研究一番。
不想看太多,就只想看转换公式的话,如下就是。
T:XYZ平移向量
R:WXYZ旋转四元数
S:XYZ缩放分量
DirectX原始数据设为
T:(x1, y1, z1)
R:(w2, x2, y2, z2)
S:(x3, y3, z3)
转换后得到OpenGL坐标系的数据为
T:(x1, y1, -z1)
R:(w2, -x2, -y2, z2)
S:(x3, y3, z3)
图像版
文字版
T:XYZ平移向量
R:WXYZ旋转四元数
S:XYZ缩放分量
转换依据
即使是不同的坐标系,本质上还是NDC窗口坐标系为主,往右是X+,往上为Y+,往前为Z+。
转换后,观察到的新的结果在NDC窗口坐标系上与原来的结果在同一个NDC窗口坐标系上的一致,即可认为转换正确。
不同坐标系间的转换方法
1.平移分量或者平移坐标:
将老坐标系的空间中,画出老坐标系和新坐标系的轴向量,看老坐标系的轴对着新坐标系的哪个轴,把数值挪过去就行了,如果新轴跟老轴的反向的,再加个负号,把数值取反。例如老X轴对着新Z轴,方向还是反的,把[3, 0, 0]改成[0, 0, -3]就行了。左右手坐标系对这个没有影响
2.旋转四元数:
先按照平移向量那样对应调整四元数的X,Y,Z分量进行处理,然后如果新坐标系和老坐标系都是同手向的坐标系,那就结束了,如果是不同手的坐标系,那XYZ分量还要给他们加个负号。w分量始终不用改变
3.缩放分量
这个就更简单了,只需要把老轴的对应的数值挪到新轴的位置就行了,不用管方向,也不用管它的手性。