【问题标题】:How do I determine the rotation angle of a 3-D object from a swipe gesture?如何通过滑动手势确定 3D 对象的旋转角度?
【发布时间】:2011-07-08 02:55:50
【问题描述】:

我正在创建一个 OpenGL ES 2.0 应用程序。我希望实现触摸控制,以便在我在屏幕上执行手势(如滑动)时旋转我的 3D 对象。

我有旋转相机和旋转物体的功能。我的问题是我需要知道必须将 X 和 Y 中的哪些旋转角度传递给旋转函数。

如果用户在特定方向上滑动,我如何计算 X 和 Y 方向的角度,以便将它们传递给旋转函数?

【问题讨论】:

  • 如果您阅读向下箭头上的工具提示,您可能会明白为什么有人将其否决。这不是对您的声誉的反映,而是对您提出问题的研究质量和努力的反馈。
  • 哦!谢谢(你的)信息。我应该对这个问题更清楚。无论如何,下面提供的答案对我有所帮助。从现在开始,我将确保发布更具体的细节。
  • 你看到这个可能有点晚了,但如果下面的答案有帮助,你应该点击“接受”这个答案。

标签: iphone ios opengl-es touch opengl-es-2.0


【解决方案1】:

您可以通过多种方式将触摸移动转换为 3-D 对象的旋转:设置轨迹球,或使用缩放的像素位移映射到旋转。

我在this OpenGL ES 2.0 sample application 中执行后者,其中我执行立方体旋转以响应手指在 X 和 Y 上的位移。在这种情况下,我使用触摸点坐标差异直接映射到旋转,使用代码如下:

    GLfloat totalRotation = sqrt(xRotation*xRotation + yRotation*yRotation);

    CATransform3D temporaryMatrix = CATransform3DRotate(currentCalculatedMatrix, totalRotation * M_PI / 180.0, 
                                                        ((xRotation/totalRotation) * currentCalculatedMatrix.m12 + (yRotation/totalRotation) * currentCalculatedMatrix.m11),
                                                        ((xRotation/totalRotation) * currentCalculatedMatrix.m22 + (yRotation/totalRotation) * currentCalculatedMatrix.m21),
                                                        ((xRotation/totalRotation) * currentCalculatedMatrix.m32 + (yRotation/totalRotation) * currentCalculatedMatrix.m31));

这大致将屏幕上一点的移动视为一个度数,这似乎很适合我的需要。您可以按比例放大或缩小以调整旋转的灵敏度。

我在这里使用的 CATransform3D 通过辅助函数转换为 OpenGL 模型视图矩阵,并作为矩阵统一传递到我的着色器中。

轨迹球是处理这种旋转的另一种方式,Bill Dudney 在他的核心动画示例here 中提供了一个示例。您可以解除他的轨迹球实现并执行我在应用程序中执行的相同 CATransform3D 转换,以从该代码生成适当的模型视图矩阵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-11
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 2012-01-23
    • 2023-03-20
    相关资源
    最近更新 更多