【问题标题】:Move an object along a path or spline in threejs在threejs中沿路径或样条线移动对象
【发布时间】:2021-05-21 03:16:06
【问题描述】:

我正在尝试沿 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;

这样做有两个问题:

  • 路径只有二维
  • Path 对象无法转换为对象的位置和方向,因此返回的位置/切线是绝对位置。

我读过this question,其中讨论了如何使用SplineCurve3 沿路径移动,但该解决方案没有说明如何构建由一组直线和圆弧构成的样条线。

你是怎么做到的?

【问题讨论】:

  • 我的回答没有解决您的问题吗?有什么遗漏吗?
  • 对不起,第二个答案是我想的我需要的,买我还没有机会申请它。它在我的队列中,一旦我确认它对我有意义,我会接受答案!

标签: javascript three.js


【解决方案1】:

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

// 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 为你所追求的东西。

我让一个盒子在绝对路径上移动,另一个相对移动

【讨论】:

  • @user3112634 感谢您的通知。最新库中有一些重大更改,我更新了两个小提琴,所以现在它们应该又好了...
  • 没问题,这是一支带有型号和路径的笔:codepen.io/uiunicorn/pen/abJJKqw
  • 你能不能让它在所有 3 轴上工作?说曲线像过山车一样有高有低
  • @heroicsatsuma 也许结帐this example
猜你喜欢
  • 1970-01-01
  • 2014-06-25
  • 2011-09-03
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多