我必须通过UP和方向矢量(它们都相互垂直)找到相机的旋转轴和角度。我有旋转相机的UP和方向矢量的初始位置和最终位置。我想找到相机的旋转轴和角度。我正在为我的项目使用C#。我是这个3D旋转的新手。所以如果你发现他们很愚蠢,请原谅我的问题。从初始和最终旋转四元数获得旋转轴
1
A
回答
0
从方向(向前)载体˚F和向上矢量ü可以通过(F X US =)执行vector cross product得到侧向量小号。所有三个向量现在都是正交的。你也应该通过对它们中的每一个进行归一化来使它们正交。总之,这些矢量形成了一个标准正交基。
您现在有两个这样的基础:从最初的相机方向和最终的相机方向开始。这两个基础都可以表示为旋转矩阵。旋转矩阵是一个简单的3×3矩阵,其中的3行分别为:
- 正向矢量
- 向上矢量
- 侧向量
例如,基质:
[[1 0 0]
[0 1 0]
[0 0 1]]
可能是您的初始相机方向在启动时与其正向矢量,向上矢量和侧向矢量点g分别朝向正x轴,y轴和z轴。
现在,您可以使用此algorithm将这两个基准(M1和M2)转换为两个单位四元数(Q1和Q2),其中注意潜在的问题,如零除。
此时,您有两个单位四元数表示您的初始和最终摄像机方向。现在,您必须找到转换Q1到Q2的四元数qT的,那就是:
q2 = qT * q1
q2 * q1^-1 = qT * (q1 * q1^-1) = qT
=> qT = q2 * q1^-1
知道,一个单位四元数的倒数等于其conjugate:
q1^-1 = q1* iif ||q1|| = 1
qT = q2 * q1^-1 = q2 * q1*
有单步左:extracting the axis and angle from quaternion qT:
angle = 2 * acos(qw)
x = qx/sqrt(1-qw*qw)
y = qy/sqrt(1-qw*qw)
z = qz/sqrt(1-qw*qw)
该角度当然以弧度给出。计算x,y和z时要注意除以零。这种情况在没有旋转或非常小的情况下会发生,因此您应该测试角度> epsilon,在这种情况下,您会选择epsilon的角度非常小(例如1/10度),并且不计算向量是这样的。
相关问题
- 1. 四元数三轴旋转
- 2. Unity旋转和四元数
- 3. 四元数旋转x轴45度
- 4. 沿着轴旋转四元数
- 5. 拆分四元数到轴旋转
- 6. 四元数旋转误差
- 7. 四元数旋转opengl
- 8. 四元数 - 旋转到
- 9. 四元数对象旋转
- 10. 四元数的旋转?
- 11. 如何从Android中的旋转矩阵中获得四元数?
- 12. 从四元数到OpenGL旋转
- 13. 使用旋转四元数将3d矢量值旋转到单个轴
- 14. 基于四元数的旋转和枢轴位置
- 15. 旋转图像,并获得旋转
- 16. 从旋转矩阵获取有关y轴的旋转
- 17. 初始加载时旋转
- 18. WhirlyGlobe初始旋转偏移
- 19. UIImage旋转轴
- 20. 矩阵旋转到四元数
- 21. java四元数三维旋转实现
- 22. 旋转矢量与四元数
- 23. 相机与四元数的旋转
- 24. 关于glm四元数旋转
- 25. 用四元数旋转对象
- 26. 使用四元数去旋转矢量
- 27. 用四元数旋转模型
- 28. 如何缩放四元数的旋转
- 29. 用四元数来防止绕某个轴旋转
- 30. 在一个轴上旋转一个四元数?
非常感谢您的回复。这真的帮了我很多。算法将矩阵转换为四元数有一个小问题。我的软件相机产生了一些向上的和方向的向量,这给出了一个不到一个矩阵的轨迹。当旋转矩阵的轨迹小于1时,旋转轴和角度计算会给出奇怪的值。你知道如何解决这个问题吗? – user1304687 2012-04-06 07:43:57
请参阅第238行的函数:http://java.net/projects/vecmath/sources/svn/content/trunk/src/javax/vecmath/AxisAngle4f.java?rev = 144 如果解决了您的问题,请检查此答案是否合适。 – gsimard 2012-04-10 14:47:11