【问题标题】:THREE.js: Why is my object flipping whilst travelling along a spline?THREE.js:为什么我的对象在沿着样条线移动时会翻转?
【发布时间】: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 ),其中的点是沿轨道更远的位置。
  • 哇哦,这是一个有趣的方法。也会试试看的!

标签: math three.js spline


【解决方案1】:

回答标题中的为什么问题。它发生的原因是在曲线上的某些点,向量up (1,0,0) 和切线是平行的。这意味着它们的叉积为零并且四元数的构造失败。

您可以遵循 WestLangley 的建议。你真的希望向上方向是轨道所在平面的法线。

四元数旋转很难理解 setFromAxisAngle 函数围绕轴旋转给定角度。

如果轨道位于 X-Y 平面,那么我们将要围绕 Z 轴旋转。要查找角度,请使用Math.atan2 查找切线的角度

var angle = Math.atan2(tangent.y,tangent.x);

把这些放在一起

var ZZ = new THREE.Vector3( 0, 0, 1 );

tangent = spline.getTangentAt(counter).normalize();
var angle = Math.atan2(tangent.y,tangent.x);    
box.quaternion.setFromAxisAngle(ZZ, angle);

如果轨道离开 X-Y 平面,事情会变得更加棘手。

【讨论】:

  • 谢谢。这将很好地满足我现在正在处理的应用程序的目的。轨道最终会离开 XY 平面,所以我必须牢记这一点。我确实接受@WestLangley 提出的观点。这个演示是一团糟。这很棘手,因为我正在使用本地几何体和从 3DS MAX 导入的网格的混合体,它只是喜欢弄乱上轴。我经常需要在 2 个平面配置中工作。我的目标是尽快解决这个问题。谢谢。
  • 你能再帮我一点吗.. 在我的演示中:jsfiddle.net/jayfield1979/T2t59/10 一切看起来都正确,但创建的盒子尺寸错误(x 是最长的边,而它应该是 y)。如果你看一下这个演示:jsfiddle.net/jayfield1979/uM8K9 它们现在是正确的尺寸(y 边是最长的),但它现在不遵循正确方向的轨道。如果不手动将每个盒子旋转 90 度或以错误的尺寸创建它们,我能做些什么吗?谢谢。
  • 抱歉第二个演示请参阅:jsfiddle.net/jayfield1979/uM8K9/1 更清楚地了解我的意思,请查看修订版 2:jsfiddle.net/jayfield1979/uM8K9/2 并且在没有调用 MoveBox 函数的情况下,框会沿着正确的平面添加/方向...
  • 或者甚至更好地查看:jsfiddle.net/jayfield1979/uM8K9/3 以演示框如何在前 3 秒内正确定向,直到调用 moveBox,然后它们不再朝向正确的方向。
  • 试试box.quaternion.setFromAxisAngle(up, angle-Math.PI/2);
猜你喜欢
  • 2014-06-25
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-16
  • 1970-01-01
相关资源
最近更新 更多