iphone - iOS openGL触摸触摸旋转球体的最佳方法

标签 iphone ios opengl-es

我使用OpenGL绘制了Globe对象,并且可以用手指触摸来旋转它,但是在某些情况下它无法正常工作,因为我使用x和y之间的差值进行旋转

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

当您将手指从右上移到左下时,效果不好。

有任何想法吗 ?

谢谢
彼得·加布拉

最佳答案

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

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

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

( =“商品交叉”)

然后,将U,V和W向量(如我的其他答案所述)围绕轴旋转一定角度,与增量向量的长度成比例:
M = rotation(k * length([diffX, diffY, 0]), axis)
U = M * U
V = M * V
W = M * W

如果发现对象以与预期相反的方向旋转,则有三种可能性:
  • 如果只是垂直旋转的方向错误,则需要否定diffY。由于OpenGL和UIKit坐标系之间的不一致,这是我经常犯的错误。
  • 如果全部旋转,则可以在叉积中交换参数,也可以使用[0,0,-1]。这通常是由于左手坐标系和右手坐标系之间的混淆。
  • 如果只是水平旋转,请进行两个调整。 (不要否定diffX,没有人使用从左到右的X坐标。)
  • 关于iphone - iOS openGL触摸触摸旋转球体的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16935905/

    相关文章:

    iphone - iPhone 中的加速计范围

    iphone - Objective-C - 数组子集的快速枚举?

    ios - UIImageView - 如何获取分配的图像的文件名?

    iOS:将图像按钮的值传递给类中函数的好方法

    android - OpenGL 与源和目标 alpha 混合

    iphone - 如何使用CIStarShineGenerator?

    ios - 关于应用程序图标

    ios - Swift:在 TableView 单元格中创建 UILabel

    android - (OpenGL ES) 远离 View 中心的对象被拉伸(stretch)

    java - OpenGL ES 着色器似乎被删除