l3u*_*fly 6 c++ math directx camera quaternions
我正在构建自己的四元数相机.据我所知,你只需要一个四元数来完全指定相机的方向(如果我错了,请纠正我).那么,我将如何创建视图矩阵?顺便说一下,我正在使用C++作为编程语言.
任何帮助,将不胜感激.
Dav*_*men 11
首先是一些警告.你会在这个主题的网络和文献中看到许多明显相互矛盾的公式.大多数冲突只是明显的.一些是真正的冲突,但那是因为有人弄错了数学.问题是没有一种正确的方法可以做到这一点.您需要知道如何使用四元数和矩阵,源如何使用它们,以及如何纠正这些明显的差异.
旋转与变换
您的相机具有与之关联的参考系,底层空间也是如此.您的矩阵是表示摄像机从底层空间到摄像机方向的物理旋转,还是表示将底层空间中表示的矢量转换为摄像机框架的矩阵?(或其他东西;这里有四种选择.)这些选择是相关的; 变换矩阵是旋转矩阵的转置.转换和旋转是共轭操作.同样的概念适用于四元数.您使用转换四元数或旋转四元数吗?这些又是相关的概念; 一个是另一个的共轭.
左右四元数
给定单位四元数q来变换或旋转向量v,有些使用qvq *来变换/旋转向量,其他使用q *vq.哪种形式是正确的?两者都是.这两种形式的不同之处仅在于未共轭四元数是否是要变换/旋转的矢量的左(qvq *)或右(q *vq).
列与行向量
大多数人使用列向量,但有些人使用行向量.在这里,你遇到了矩阵的左右问题.列向量通过Mv进行变换/旋转,矩阵位于向量的左侧; 通过vM行向量,矩阵在右侧.
影响
你必须小心阅读文献.关于从四元数形成矩阵,您需要注意构造矩阵的非对角元素时的符号变化.一种制剂的加/减可以改变为另一种制剂中的减法/加法.
左变换四元数到行向量变换矩阵
我使用左变换四元数和变换矩阵,并且我将向量表示为行向量.我还将四元数q表示为包括实数标量部分q s和矢量虚部q v.给定这些表示,从四元数生成矩阵的计算是(伪代码):
// Compute the cosine of the rotation angle.
cost = 2.0*qs*qs - 1.0;
// Construct the diagonal of the matrix:
// T_ii = cost + 2qv_i^2
for (i = 0; i < 3; ++i) {
T[i][i] = cost + 2.0*qv[i]*qv[i];
}
// Construct off-diagonal transformation matrix elements:
// T_ij = 2 (qv_i qv_j - eps_ijk qs qv_k), where eps is the Levi-Civita symbol
for (k = 0; k < 3; ++k) {
i = (k+1)%3;
j = (i+1)%3;
T[i][j] = 2.0*(qv[i]*qv[j] - qs*qv[k]);
T[j][i] = 2.0*(qv[i]*qv[j] + qs*qv[k]);
}
Run Code Online (Sandbox Code Playgroud)
您可能希望扩展这些循环.第一个循环扩展为三个语句,后者为六个语句.你不需要在后一个循环的扩展中计算i和j ; 循环的扩展使它们成为固定数量.
替代陈述
上面的那些警告并不像它们看起来那么糟糕.您需要确保我的陈述与您的陈述一致.赔率是50-50而不是.如果不是,只需将分配交换到非对角元素.使用T[i][j]for 的计算,T[j][i]反之亦然.怎么说:
如果s的最终值是1,请使用我的公式.如果它是-1,只需将赋值交换为T[i][j]和T[j][i].或者你可以改变加法的加法,减法加法.
最后一个问题
当标量部分不接近零时,上述计算适用.如果我们有无限精度算术,它在任何地方都是有效的.您可能希望对非常接近零度或180度的旋转使用单独的计算.