我正在尝试沿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;
这有两个问题:
我已阅读this question,其中讨论了如何使用SplineCurve3
沿路径移动,但此解决方案未解释如何构建由一组线和弧构成的样条线
你是怎么做到的?
答案 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 您所追求的目标。
我在相对移动的绝对路径上移动了一个框