我使用OpenGL绘制Globe对象,我可以用手指触摸旋转它,但在某些情况下它不能很好地工作,因为我使用x和y之间的差异旋转
Rotation3D rot = sphere.currentRotation;
rot.x += diffX ;
rot.y += diffY ;
rot.z += 10 ;
sphere.currentRotation = rot;
当你将手指从右上角移动到左下方时,它的效果不佳。
有什么想法吗?
由于 彼得·加布拉
答案 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
如果您发现物体的旋转方向与您预期的相反,则有三种可能性:
diffY
。由于OpenGL和UIKit坐标系之间的不一致,这是我犯的一个常见错误。diffX
,没有人使用从左到右的X坐标。)答案 1 :(得分:0)
如果你正在使用欧拉角:我建议不要使用欧拉角来模拟旋转。使用四元数。看起来它可能会使您的代码更复杂,但是当您使用Quaternions时,旋转效果很好。这有一些好处:
请注意,Apple会为您提供使用的四元数类型:GLKQuaternion。无需编写自己的Quaternion类。
另见: