【发布时间】:2014-09-19 17:57:24
【问题描述】:
从我原来的帖子 Three.JS Object following a spline path - rotation / tangent issues & constant speed issue 开始,我仍然遇到对象在路径上的某些点翻转的问题。
在这个小提琴上查看这个发生的事情:http://jsfiddle.net/jayfield1979/T2t59/7/
function moveBox() {
if (counter <= 1) {
box.position.x = spline.getPointAt(counter).x;
box.position.y = spline.getPointAt(counter).y;
tangent = spline.getTangentAt(counter).normalize();
axis.cross(up, tangent).normalize();
var radians = Math.acos(up.dot(tangent));
box.quaternion.setFromAxisAngle(axis, radians);
counter += 0.005
} else {
counter = 0;
}
}
上面的代码是沿着定义的样条路径(在本例中为椭圆)移动我的对象的原因。 @WestLangley 提到:“警告:如果两个向量平行,则叉积的定义不明确。”。
如你所见,从路径的形状来看,我会遇到很多平行向量。我能做些什么来防止这种翻转发生吗?
【问题讨论】:
-
看看这是否适合你:jsfiddle.net/T2t59/8.
-
效果很好。我看到您已经删除了一些发生翻转的向量。这很好,但在我的最终应用程序中,这些值是在运行时动态创建的。为了简洁起见,我删除了所有采用数组并根据轨道片段创建向量的函数。有什么方法可以在不删除任何矢量的情况下工作,因为最终会有很多动态创建的轨道!感谢您到目前为止的时间。我很感激。
-
您必须重做您的演示并将轨道放置在 XZ 平面上,Y 向上。正如你所拥有的,
up指向正 x 方向。该框的up位于正y 方向。这是一团糟。如果操作正确,切线将始终在 XZ 平面上,向上将在 Y 方向上,并且叉积将得到明确定义。 -
另外,一个更简单的方法可能是定位你的盒子,使长边指向正z方向。这样一来,您所需要做的就是
box.lookAt( point ),其中的点是沿轨道更远的位置。 -
哇哦,这是一个有趣的方法。也会试试看的!