opengl - 如何反转四元数的两个轴
问题描述
我必须从我正在使用的两个不同的 API 转换姿势(坐标 + 旋转四元数)。更具体地说,我得到对象相对于相机本地位置的坐标。
我的检测库(用于检测这些对象)具有相机的坐标系,Z 朝向相机的视线方向,X 位于相机的右侧,Y 位于相机下方(如果您从相机本身)。我将在这里使用 ACII Art 来说明我的意思:
Symbols:
+------+
| | = camera from the back
+------+
+--+
| +-+
| | = camera from the right side (imagine the front part as the lens)
| +-+
+--+
Detection Coordinate System from the back of the camera
+--------> x
|
| +------+
| | |
V y +------+
Detection Coordinate System from the right side of the camera
+--------> z
| +--+
| | +-+
| | |
V y | +-+
+--+
然而,我使用对象姿势的库的 X 方向相同,但 Y 和 Z 都是倒置的。所以 Z 指向与相机的观察方向相反的方向,而 Y 指向正上方。更多 ASCII 草图:
Usage Coordinate System from the back of the camera
^ y +------+
| | |
| +------+
|
+--------> x
Usage Coordinate System from the right side of the camera
+--+
| +-+ ^ y
| | |
| +-+ |
+--+ |
z <--------+
所以现在我在检测坐标系中获得对象姿势(包括旋转),但想在使用坐标系中使用它们。我知道我可以通过反转 y 和 z 的值来转换坐标,但是如何转换四元数以进行旋转?我尝试了一些组合,但似乎都没有。
解决方案
在这种情况下,您的基础更改只是轴的排列,因此要从一个转换为另一个,您只需在四元数的虚向量中复制相同的排列。
即,如果您的四元数是 (w,x,y,z) 并且基本排列是 (z,y,x),那么您的新四元数是 (w,z,y,x)。
推荐阅读
- nginx - 使用 Nginx 的多个域(反向代理)
- c - 处理指向数组的指针时发现意外行为
- python - 一列的差异基于另一列的差异,熊猫
- azure - 在 Azure 搜索中合并 blob
- c# - Linq to SQL 使用 Lambda 语法左外连接并连接 2 列(复合连接键)
- node.js - 如何使用 webpack url-loader 运行 mocha 测试?
- matplotlib - 如何在 Jupyter Notebook 的同一个单元格中绘制多个散点图?
- python-3.x - 性能不佳的keras lstm
- c# - ActionFilter Response.StatusCode 始终为 200
- php - 我如何检查 SoapClient 是否使用缓存的 wsdl?