(iPhone) 我正在尝试让用户可以通过在屏幕上拖动手指来旋转对象。向左或向右拖动应围绕 Y 轴旋转,向上或向下拖动应围绕 X 轴旋转。这是我的原始代码:
glRotatef( yAmt, 0, 1, 0 );
glRotatef( xAmt, 1, 0, 0 );
旋转很疯狂,似乎是在随机方向。我很确定它与第二个语句依赖于第一个语句有关,但我试图用一些花哨的数学来否定它,但仍然无法正确处理。
好吧,我部分想通了,但是现在我遇到了一个新问题(如何对两个旋转求和?)。
我的解决方案:
假设您想将立方体向左旋转 90 度,然后向下旋转 90 度。您试试这个:
glRotatef( 90, 0, 1, 0 );
glRotatef( 90, 1, 0, 0 );
它不起作用。第二个函数的行为很奇怪,因为第一个函数交换了 X 轴和 Z 轴。所以你试试这个:
glRotatef( 90, 0, 1, 0 );
glRotatef( 90, 0, 0, 1 );
现在您有了想要的结果,但是如果您将第一个函数中的 Y 旋转量更改为 180 或 45 或其他任何值,它会再次失败。所需的旋转矢量取决于第一个函数的 Y 旋转量。期望的结果是这样实现的:
glRotatef( yAmt, 0, 1, 0 );
glRotatef( xAmnt, cos(yAmt), 0, sin(yAmt) );
现在如果你想先上下旋转然后从左到右怎么办?最后一个解决方案失败了,首先,函数的顺序错误,其次,Y 轴也依赖于 X 旋转。您必须考虑到这一点,并且您必须将这两个功能结合起来,从而导致:
glRotatef( totalAmt, xFactor*cos(yAmt), yFactor*cos(xAmt), xFactor*sin(yAmt) + yFactor*sin(xAmt) );
其中 xFactor 和 yFactor 加起来就是所需的旋转向量(1,0 表示上下,0,1 表示左右,sqrt(.5),sqrt(.5) 表示对角线旋转)。
我的问题:
当用户完成一个旋转并开始一个新的旋转时,问题就出现了。您必须记住并“重新启动”先前的旋转,否则您会得到不希望的“跳转”回 0 旋转。一个新的旋转很好,我可以实现 touchesEnded 来记住 glRotatef 的参数,然后将它们插入到一个新的旋转中,如下所示:
glRotatef( amt_old, x_old, y_old, z_old );
glRotatef( totalAmt, xFactor*cos(yAmt), yFactor*cos(xAmt), xFactor*sin(yAmt) + yFactor*sin(xAmt) );
但是在第二个新的轮换中,我现在有两个轮换可以“重新启动”。我不知道要为 amt_old、x_old、y_old 和 z_old 分配什么值。它归结为......你如何总结两个 glRotatef 旋转?