沿着三个路径或样条曲线移动对象

时间:2016-02-19 01:39:20

标签: javascript three.js

我正在尝试沿Three.js中的路径移动对象。我想以“构造”的方式构建路径,使用Path这样的对象:

var path = new THREE.Path([
    new THREE.Vector2(0, 0),
    new THREE.Vector2(0, inDistance)
]);

path.arc(arcRadius, 0, arcRadius,
    Geo.rad(180), Geo.rad(90), true);

path.lineTo(arcRadius + outDistance, arcRadius + inDistance);

然后我可以使用path.getPoint(t)path.getTangent(t)来获取对象的更新位置:

    let position = path.getPoint(percentTraveled);
    let tangent = path.getTangent(percentTraveled);

    state.model.position.x = position.x;
    state.model.position.y = position.y;

这有两个问题:

  • 路径仅为2D
  • 无法将Path对象转换为对象的位置和方向,因此返回的位置/和切线是绝对位置。

我已阅读this question,其中讨论了如何使用SplineCurve3沿路径移动,但此解决方案未解释如何构建由一组线和弧构成的样条线

你是怎么做到的?

1 个答案:

答案 0 :(得分:12)

对于直线运动,我认为您需要的只是方向和速度,然后您可以将其用作变换(在矩阵中或应用对象位置)。优点是您可以在此过程中轻松更改方向和速度。

// direction vector for movement
var direction = new THREE.Vector3( 1, 0, 0 );

// scalar to simulate speed
var speed = 0.5;

var vector = direction.multiplyScalar( speed, speed, speed );
object.x += vector.x;
object.y += vector.y;
object.z += vector.z;

Here is a fiddle 来证明这一点并愚弄......

对于一个更像花哨的运动,比如你可以按照你的建议去做一条路。您可能遇到的一个问题是路径和形状总是在2D中定义。 因此,为了能够在计算中使用向量,您应该始终将它们设置为3D向量(只需设置z = 0)。 要使运动相对,您应该计算差异。最简单的方法是跟踪先前的位置和先前的角度,并使用delta x和delta y作为平移和delta角度进行旋转。

deltaX = point.x - previousPoint.x;
deltaY = point.y - previousPoint.y;
deltaAngle = angle - previousAngle;

Here a working fiddle 您所追求的目标。

我在相对移动的绝对路径上移动了一个框