我想制作一个逼真的 3D 演示,展示一个球沿着锥形螺旋路径滚动。可以在此处找到帮助我接近解决方案的参考。[我正在使用 Stage3D 在 Actionscript 3 中创建我的解决方案,但很乐意使用您可能更熟悉的其他 3D 框架以其他语言提供任何建议的编码解决方案。]
当我输入帖子的标题时,系统会向我指出大量“可能已经有你答案的问题”,这很有帮助,我确实检查了每个问题。不想劫持现有线程,我应该说这个线程包含大量关于一般主题的非常有用的评论,但没有涉及我无法解决的具体挑战。
使用引用的参考资料,我对这个跟踪我希望球遵循的路径的代码片段感到满意。[ NB我的参考文献和大多数其他基于数学的参考文献都将 Z 视为上下;然而,我的用法是 Y 的更常见的 3D 图形用于上下。]
为每一帧执行此代码。
ft += 0.01; // Where ft is a global Number.
var n:Number = Math.pow (0.5, (0.15 * ft));
// Where s is a constant used to scale the overall path.
obj.moveTo (
(s * n * Math.cos (2.0 * ft)),
(s * n),
(s * n * Math.sin (2.0 * ft))
);
球沿着一条漂亮的路径前进,并且由于照明和其他着色器代码,在场景中可以看到非常不错的效果。
我目前的实现的不好之处在于,当球从一个点移动到另一个点时,它似乎没有沿着该路径滚动。我没有使用任何物理引擎,也没有寻求任何处理碰撞的解决方案,但我希望球能够正确演示如果运动是由于球滚下轨道会发生什么。
因此,为了更清楚地说明挑战,假设球是一个台球,带有 #15 的条纹和标签。在这种情况下,视觉结果应该是数字 15 应该转过头来治愈,但是,正如您可能从我的obj.moveTo()函数的名称中推测的那样,这只会导致 3D 对象的位置发生变化,而不是它的方向。
最后,这让我想到了具体的问题/要求。我一直无法发现必须与每个位置变化同步哪些旋转变化才能正确演示如果台球从点 1 沿路径从点 2 滚动时的显示方式。
部分解决方案似乎是:
obj.setRotation ((Math.atan2 (Math.sin (ft), Math.cos (ft))), Vector3D.Y_AXIS);
但这仍然不正确。我希望有一些众所周知的公式可以添加到我的渲染代码中。