Math THREE.js:为什么我的对象在沿着样条线移动时会翻转?

Math THREE.js:为什么我的对象在沿着样条线移动时会翻转?,math,three.js,spline,Math,Three.js,Spline,在我最初的帖子中,我仍然有一个问题,即对象在路径上的某些点翻转 查看此小提琴上发生的情况: 函数moveBox(){ if(counter回答标题中的why问题。其发生的原因是,在曲线上的某些点上,向量up(1,0,0)和切线平行。这意味着它们的叉积为零,四元数的构造失败 你可以按照WestLangley的建议。你真的希望上升方向是轨道所在平面的法线 四元数旋转很难理解setFromAxisAngle函数围绕轴旋转给定角度 如果轨迹位于X-Y平面内,则我们希望绕Z轴旋转。若要查找角度,请使用Ma

在我最初的帖子中,我仍然有一个问题,即对象在路径上的某些点翻转

查看此小提琴上发生的情况:

函数moveBox(){

if(counter回答标题中的why问题。其发生的原因是,在曲线上的某些点上,向量
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 );


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

回答标题中的“为什么”问题。发生这种情况的原因是,在曲线上的某些点上,向量向上(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 );


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

回答标题中的“为什么”问题。发生这种情况的原因是,在曲线上的某些点上,向量向上(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 );


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

回答标题中的“为什么”问题。发生这种情况的原因是,在曲线上的某些点上,向量向上(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 );


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

看看这是否对您有效:。效果很好。我看到您删除了一些发生翻转的向量。这很好,但在我的最后一个应用程序中,这些值是在运行时动态创建的。我删除了所有使用数组并基于为简洁起见,请选择轨迹片段。是否有任何方法可以在不删除任何矢量的情况下工作,因为最终将有大量动态创建的轨迹!感谢您到目前为止的时间。我非常感谢。您必须重做演示并将轨迹放置在XZ平面上,Y向上。如您所知,
up
指向po中的点正x方向。长方体的
向上
在正y方向。这是一个混乱。如果你做得正确,切线将始终在XZ平面上,向上将在y方向上,叉积将得到很好的定义。此外,一个更简单的方法可能是确定长方体的方向,使长边点在正z方向。这样,所有y轴我们需要做的是
box.lookAt(点)
,其中点是轨迹上更远的一个位置。Ooooo这是一个有趣的方法。我也会尝试一下!看看这是否对您有效:。效果很好。我看到您删除了一些发生翻转的向量。这很好,但在我的最后一个应用程序中,这些值是在运行时动态创建的。我删除了所有函数为简洁起见,使用数组并基于轨迹片段创建矢量的ons。是否有任何方法可以在不删除任何矢量的情况下工作,因为最终将有大量动态创建的轨迹!感谢您到目前为止的时间。我非常感谢。您必须重做演示并使用Y向上。现在,
up
指向正x方向。长方体的
up
指向正Y方向。这是一个混乱。如果你做得正确,切线将始终在XZ平面上,向上将在Y方向上,叉积将得到很好的定义。此外,更简单的方法可能是确定长方体的方向,使长的side指向正z方向。这样,您所需要做的就是
box.lookAt(点)
,其中点是轨迹上更远的一个位置。Ooooo这是一种有趣的方法。我也会尝试一下!看看这是否对您有效:。效果很好。我看到您删除了一些发生翻转的向量。这很好,但在我的最后一个应用程序中,这些值是在运行时动态创建的。我