6

我正在尝试实现轨迹球/轨迹球旋转,但旋转中心有问题。无论如何,我希望中心成为我屏幕的中心。

让我解释一下我到目前为止所做的事情。

我创建了一个四元数(旋转轴:vector_start x vector_end,角度:vector_start * vector_end)

从那个四元数中,我创建了一个旋转矩阵,以便将它与 glMultMatrixf(matrix) 一起使用并获得所需的旋转。

问题是,虽然我的模型似乎是轨迹球旋转,但它应该始终围绕其本地原点旋转。无论其本地原点位于何处,如何使其围绕屏幕中心旋转?

我想该问题的解决方案可能是在屏幕中心平移整个旋转轴,然后应用旋转,但这可能吗?我在这里想念什么吗?

4

2 回答 2

1

您应该能够通过以正确的顺序应用旋转和平移矩阵来解决此问题。在您的代码中,您可以转换回原点 T(-pos_x, -pos_y, -pos_z),应用您的旋转,然后再次转换到对象中心 T(pos_x, pos_y, pos_z)。这通常应该有效,与您的旋转矩阵的构造方式无关。

于 2009-12-09T18:27:30.037 回答
0

这是我不久前为 3 级火箭发射查看器编写的一些代码。我从http://www.euclideanspace.com/maths/geometry/rotations获得了大部分信息

注意:偏航、俯仰和滚动可能会根据您设置坐标系的方式而改变

      // Assuming the angles are in radians.
            double p = curPitch * Math.PI/180.0 / 2.0;
            double y = curYaw * Math.PI/180.0 / 2.0;
            double r = curRoll * Math.PI/180.0 / 2.0;

            double sinp = Math.sin(p);
            double siny = Math.sin(y);
            double sinr = Math.sin(r);
            double cosp = Math.cos(p);
            double cosy = Math.cos(y);
            double cosr = Math.cos(r);

            Vector3 axis = new Vector3();

            //here's the important part: how you get your quaternion vector!
            axis.x = sinr * cosp * cosy - cosr * sinp * siny;
            axis.y = cosr * sinp * cosy + sinr * cosp * siny;
            axis.z = cosr * cosp * siny - sinr * sinp * cosy;

            //now normalize the vector in case we want to use it again later
            axis = Vector3.normalizeVector(axis);

            orientation[1] = axis.x;
            orientation[2] = axis.y;
            orientation[3] = axis.z;

            //w is omega: the angle to rotate about the quaternion
            double w = cosr * cosp * cosy + sinr * sinp * siny;

            w = Math.acos(w) * 2.0;

            orientation[0] = w;

            gl.glPushMatrix();

              //translate object first, then rotate it.
              gl.glTranslated(curDisplacement[0] + saveDisplacement[0], -curDisplacement[1] + saveDisplacement[2], curDisplacement[2] + saveDisplacement[1]);

              //this order might be messed up because I screwed up my coordinate system, but the idea is still there
              gl.glRotated(orientation[0]*180/Math.PI, orientation[2]*180/Math.PI, orientation[3]*180/Math.PI, orientation[1]*180/Math.PI);

             //place your objects
             gl.glPopMatrix();

希望这可以帮助!

于 2009-12-18T18:46:24.387 回答