OpenGL-无法获得围绕正确轴和原点的累积旋转

问题描述 投票:2回答:1

我正在使用OpenTK和C#在几年前编写的现有项目中实现Arcball旋转,但遇到了最后的障碍。我已经花了几个小时(一天?)来尝试解决此问题,并且已经关闭-但没有雪茄。

这是“旧式”非着色器OpenGL。我有信心Arcball旋转正常工作,问题只是应用了结果矩阵。它应该相当简单,但无法解决问题。

我将Arcball旋转作为四元数(qCurrent),然后将其转换为矩阵。然后,我尝试了几种方法:

  1. 简单地将其作为附加旋转应用于现有场景:

    GL.PushMatrix();
    Matrix4 arcball_rot = Matrix4.CreateFromQuaternion(qCurrent);
    GL.MultMatrix(ref arcball_rot);
    ... render objects in scene
    GL.PopMatrix();
    

这将围绕正确的原点(相机目标)应用正确的旋转,但相对于世界坐标系,而不是相对于观察者。这是有道理的,因为我实际上以错误的顺序应用了旋转。

  1. 依次应用旋转,首先进行弧球旋转,这意味着从头开始。这里,rtn_complete是一个矩阵,用于存储在Arcball旋转之前初始化的模型视图矩阵:

    Matrix4 modelview = Matrix4.LookAt(camera.camerapos, camera.cameratarget, camera.cameraup);
    rtn_complete = modelview;
    

然后...

Matrix4 mm = Matrix4.CreateFromQuaternion(qCurrent) * rtn_complete;
GL.LoadIdentity();
GL.MultMatrix(ref mm);

这会向观看者施加正确的旋转,但围绕错误的旋转中心。离相机目标很远。

显然,这种方法需要在旋转的任一侧进行正向/反向平移,但是我已经尝试了几乎所有可能的组合,但都不起作用。

相机和目标位置如下:-

camera.camerapos =(-51.3,-67.9、37.7)和

camera.cameratarget =(0.0,0.6,7.3)

[当我添加如下所示的翻译(以及无数其他排列)时,场景仍然围绕错误的原点旋转。

GL.LoadIdentity();
GL.Translate(camera.cameratarget);
GL.MultMatrix(ref arcball_rot);
GL.Translate(-camera.cameratarget);
GL.MultMatrix(ref rtn_complete);

[我的感觉是问题的根源很可能是使用LookAt进行的翻译,在进行上述转换时我没有考虑。

但是,当我检查rtn_complete矩阵(这是LookAt之后的modelview矩阵)时,第四列不包含转换。矩阵如下所示:

0.80, 0.20, -0.56, 0.00
-0.60, 0.27, -0.75, 0.00
0.00, 0.94, 0.34, 0.00
0.38, -7.02, -92.8, 1.00

我原本希望在这里看到翻译。

我想念什么?

c# opengl rotation opentk arcball
1个回答
0
投票

最终找到了。我对使用Matrix4.LookAt()产生的翻译的怀疑是正确的。

我列出用于调试的矩阵的方式导致了转置,因此我可以看到翻译,但是我错过了它,但是它在第四行而不是第四列。转换为(0.38,-0.72,-92.8)在Arcball旋转的任一侧应用此转换会产生预期的旋转行为。

GL.LoadIdentity();
GL.Translate(0.38, -7.02, -92.8);
GL.MultMatrix(ref mm);
GL.Translate(-0.38, 7.02, 92.8);
GL.MultMatrix(ref rtn_complete);

我想我可以从这里开始其余的工作。

© www.soinside.com 2019 - 2024. All rights reserved.