IOS openGL使用touchesMoved旋转Sphere的最佳方法

时间:2013-06-05 09:11:43

标签: iphone ios opengl-es

我使用OpenGL绘制Globe对象,我可以用手指触摸旋转它,但在某些情况下它不能很好地工作,因为我使用x和y之间的差异旋转

    Rotation3D rot = sphere.currentRotation;
rot.x += diffX ;
rot.y += diffY ;
rot.z += 10 ;
sphere.currentRotation = rot; 

当你将手指从右上角移动到左下方时,它的效果不佳。

有什么想法吗?

由于 彼得·加布拉

2 个答案:

答案 0 :(得分:0)

要随意旋转对象,最简单的方法是将当前方向存储为变换矩阵并操纵元素。我详细解释了这一点here

唯一的区别在于,在另一个问题中,OP想要从两个控件(水平和垂直)应用旋转,而在基于拖动的旋转之后。该技术基本相同,但不是围绕X轴或Y轴旋转,而是需要根据触摸的增量矢量计算任意旋转轴,如下所示:

axis = [0, 0, 1] ⨯ [diffX, diffY, 0]

=“跨产品”)

然后围绕轴旋转U,V和W向量(如我的另一个答案中所述),与delta向量的长度成比例:

M = rotation(k * length([diffX, diffY, 0]), axis)
U = M * U
V = M * V
W = M * W

如果您发现物体的旋转方向与您预期的相反,则有三种可能性:

  1. 如果只是垂直旋转方向错误,则需要否定diffY。由于OpenGL和UIKit坐标系之间的不一致,这是我犯的一个常见错误。
  2. 如果它是全部旋转,您可以交换产品中的参数或使用[0,0,-1]。这通常是因为左手和右手坐标系之间的混淆。
  3. 如果只是水平旋转,请进行两次调整。 (不要否定diffX,没有人使用从左到右的X坐标。)

答案 1 :(得分:0)

如果你正在使用欧拉角:我建议不要使用欧拉角来模拟旋转。使用四元数。看起来它可能会使您的代码更复杂,但是当您使用Quaternions时,旋转效果很好。这有一些好处:

  • 将用户交互应用于当前轮换状态非常简单
  • gimbal lock problems
  • 重复旋转后无需进行矩阵漂移调整
  • 您可以轻松插入旋转

请注意,Apple会为您提供使用的四元数类型:GLKQuaternion。无需编写自己的Quaternion类。

另见: