c++ - 俯仰偏航,角度独立

标签 c++ opengl transformation jogl angle

我正在努力弄清楚如何使俯仰偏航和滚动在它们之间独立。 一旦我在 z 轴(俯仰)上旋转某些东西,第二次旋转(yaxis 偏航)取决于第一次和第三次旋转(x 轴,滚动)的结果取决于其他两个。因此,我没有独立的俯仰、偏航和滚动,而是混合了这三个,很难看。

我希望可以将对象角度存储在数组 [pitch,yaw,roll] 中,然后在转换过程中解码这些角度,以便偏航将对象置于给定位置,然后采用与沥青,但不是两者的复合物......

我看到过对“任意轴旋转矩阵”的引用。得到想要的结果会有用吗??? 1) 应用偏航 (gl.glRotatef(beta, 0.0f, 1.0f, 0.0f);) 2) 得到手动旋转 vector (1.0f,0.0f,0.0f) around beta 的结果轴 3) 使用 2 中得到的轴应用间距 {and for roll...如果 1,2,3 是正确的} 4) 将 2 中的轴绕其 x 旋转一圈 5)使用4中得到的轴应用滚动

它会起作用吗?有更好的解决方案吗?我想以 [pitch,yaw,roll] 格式保持我的对象局部方向。

我已经为此苦苦挣扎了好几天,我想尽可能避免使用四元数。 3D 对象相对于 0,0,0 存储并沿 {1,0,0} 方向观察并在每一帧转换到它们的目的地和角度,因此应该很容易避免万向节锁定问题。

换句话说,我的相机工作正常,正确制作了世界坐标,但我不知道应该如何或在何处应用基于偏航、髓心、滚动的对象局部变换。

结果应从数组 [y,p,r] 中读取,并且它们的组合不应重叠

实际上我的转换是:

gl.glLoadIdentity(); 
float[] scalation = transform.getScalation();
gl.glScalef(scalation[0], scalation[1], scalation[2]); 
float[] translation = transform.getTranslation();
gl.glTranslatef(translation[0], translation[1], translation[2]);
float[] rotation = transform.getRotation();
gl.glRotatef(rotation[0], 1.0f, 0.0f, 0.0f);
gl.glRotatef(rotation[1], 0.0f, 1.0f, 0.0f);
gl.glRotatef(rotation[2], 0.0f, 0.0f, 1.0f);

最佳答案

方向总是取决于角度顺序。你不能让他们独立。你旋转 vector 乘以矩阵,矩阵乘法是不可交换的。您可以选择一个顺序并与之保持一致。 对于这些问题,一个常见的选择是 ZYX 定向方法(先滚动,然后俯仰,最后偏航)。 我使用角度时的个人引用是 this document ,这对我帮助很大。

关于c++ - 俯仰偏航,角度独立,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11819644/

相关文章:

c++ - 两个坐标系之间的点CGAL变换

integer - 仅使用整数的 DCT

c++ - 禁用 GCC 自动并行化

c++ - 顶点着色器的定点算法

c - OpenGL Sprite 映射不起作用

opengl - glBindAttribLocation 无法按预期工作

ios - 为什么旋转 UIImageView 会影响其他 UI 元素?

c++ - 链接错误 CString

c++ - Xcode 4.2 创建 xcode 示例项目

C++ 重载解析查询