如何根据矩阵实现球在球体上的滚动?

How to implement rolling a ball on a sphere in terms of matrices?

目标: 有必要创建两个球体,其中一个可以用鼠标在另一个球体的表面上滚动,并实现一个可以使用键盘在这些球体周围移动的相机。

实施: 我启动了一个矩阵来存储滚动球旋转的当前状态。当用户拖动时,我会得到一系列鼠标移动事件,每次移动时,我都会计算当前 X 和 Y 周围的度数,当用户看到它们时,旋转发生了变化。然后我计算一个表示这两个旋转的矩阵,并以相反的顺序将原始球体旋转矩阵乘以它 - 需要相反的顺序,因为旋转是从相机的角度而不是从模型的角度发生的space.

问题: 但是通过这样的实现,第二个球体不会改变与第一个球体的接触点(它会沿着它滑动),如何分析地实现球接触点的旋转矩阵?

如果有人感兴趣,这里是代码:https://github.com/AndrewStrizh/spheres-with-webGL

您需要的是能够控制球体围绕两个(或更多)不同旋转轴的旋转。

处理复杂转换的正确方法是实现层次转换:

http://web.cse.ohio-state.edu/~wang.3602/courses/cse3541-2019-fall/05-Hierarchical.pdf

在这种情况下,您可以通过使 sphereB 成为第三个不可见对象的子对象来控制 sphereB 围绕 sphereA 的旋转 - 将其称为 Locator - 位于 sphereA 的中心。通过正确实施层次转换,旋转 Locator 也会围绕此 Locator 旋转 sphereB(因此,围绕 sphereA)。同时,你也可以让sphereB绕着自己的中心旋转,让它自转。

在实践中,实现真正的层次变换需要实现场景图,适当的节点遍历等。但主要思想是每个对象都有所谓的局部变换矩阵和世界变换矩阵。局部变换矩阵只保存该特定对象自身的变换(局部到它自己的原点),而世界变换矩阵是最终矩阵,是应用于该对象的所有层次变换(来自父级)的总和结果。 世界变换矩阵是用作“模型”矩阵的矩阵,与视图和投影矩阵相乘。节点的世界和局部变换矩阵是这样计算的(伪代码):

node.worldMatrix = node.localMatrix * node.parent.worldMatrix;

知道了,因为你只需要三个对象和两个层次变换,你不必实现整个场景图,你只需要通过乘以适当的矩阵来模拟这个原理来重现所需的行为。