Android。 LibGDX。如何沿样条线移动和定向 3D 对象
Android. LibGDX. How to move and orient 3D-object along a spline
我正在为我的 Android 应用程序使用 LibGDX。我需要沿着 spline.In 移动和定向 3D 对象 (ModelInstance) 我的例子是 CatmullRomSpline。我的运动正常,但在沿样条曲线定位 ModelInstance 时遇到问题。
我的代码:
public void update() {
float t = SPEED * Gdx.graphics.getDeltaTime();
elapsedTime = elapsedTime + SPEED * Gdx.graphics.getDeltaTime();
//Movement
catmull.valueAt(value, elapsedTime);
myObject3d.transform.setTranslation(value);
//Rotation
derivative = catmull.derivativeAt(derivative, t);
derivative = derivative.nor();
//Tried to bring object into default position before rotating
//Vector.X - is the default direction of my Object - facing right
//myObject3d.transform.rotate(Vector3.X, Vector3.X);
myObject3d.transform.rotate(derivative, Vector3.X);
}
改为 Matrix4#rotate method has two arguments, base
and target
. In your case the base vector should be Vector3.X
, while the target is derivative
. You need to swap the arguments for this. Also, the Matrix4#rotate method post-multiplies the rotation on top the existing rotation. Or in other words: this will accumulate the absolute rotation on every call. You probably want to use the Matrix4#setToRotation 方法,它会在每次调用时重置旋转(清除矩阵)。
myObject3d.transform.setToRotation(Vector3.X, derivative);
myObject3d.transform.setTranslation(value);
虽然这可能在大多数情况下都有效,但根据路径的不同,您可能会得到意想不到的结果。就像说的那样,有无限可能的旋转会导致这个方向。因此,最好使用两个额外的向量来指定向上 (Y) 和向右 (Z) 向量。
right.set(Vector3.Y).crs(derivative).nor();
up.set(right).crs(derivative).nor();
myObject3d.transform.set(derivative, up, right, position).rotate(Vector3.X, 180);
这里用叉积计算右向量和上向量,这里假设Vector3.Y
通常接近上向量。然后 Matrix4#set 方法用于设置矩阵以反映这些值。第一个参数指定 "new" X 轴,第二个参数指定 "new" Y 轴,第三个参数 "new" Z 轴,最后一个参数指定平移(位置)。
这是一个工作示例:https://gist.github.com/xoppa/7558c0c75e9534795e9f
虽然不相关,但请记住 path.valueAt 方法使用 0 <= t <= 1
。或者换句话说,t
(代码中的 elapsedTime
)不应低于 0 或高于 1。
我正在为我的 Android 应用程序使用 LibGDX。我需要沿着 spline.In 移动和定向 3D 对象 (ModelInstance) 我的例子是 CatmullRomSpline。我的运动正常,但在沿样条曲线定位 ModelInstance 时遇到问题。
我的代码:
public void update() {
float t = SPEED * Gdx.graphics.getDeltaTime();
elapsedTime = elapsedTime + SPEED * Gdx.graphics.getDeltaTime();
//Movement
catmull.valueAt(value, elapsedTime);
myObject3d.transform.setTranslation(value);
//Rotation
derivative = catmull.derivativeAt(derivative, t);
derivative = derivative.nor();
//Tried to bring object into default position before rotating
//Vector.X - is the default direction of my Object - facing right
//myObject3d.transform.rotate(Vector3.X, Vector3.X);
myObject3d.transform.rotate(derivative, Vector3.X);
}
改为 Matrix4#rotate method has two arguments, base
and target
. In your case the base vector should be Vector3.X
, while the target is derivative
. You need to swap the arguments for this. Also, the Matrix4#rotate method post-multiplies the rotation on top the existing rotation. Or in other words: this will accumulate the absolute rotation on every call. You probably want to use the Matrix4#setToRotation 方法,它会在每次调用时重置旋转(清除矩阵)。
myObject3d.transform.setToRotation(Vector3.X, derivative);
myObject3d.transform.setTranslation(value);
虽然这可能在大多数情况下都有效,但根据路径的不同,您可能会得到意想不到的结果。就像说的那样,有无限可能的旋转会导致这个方向。因此,最好使用两个额外的向量来指定向上 (Y) 和向右 (Z) 向量。
right.set(Vector3.Y).crs(derivative).nor();
up.set(right).crs(derivative).nor();
myObject3d.transform.set(derivative, up, right, position).rotate(Vector3.X, 180);
这里用叉积计算右向量和上向量,这里假设Vector3.Y
通常接近上向量。然后 Matrix4#set 方法用于设置矩阵以反映这些值。第一个参数指定 "new" X 轴,第二个参数指定 "new" Y 轴,第三个参数 "new" Z 轴,最后一个参数指定平移(位置)。
这是一个工作示例:https://gist.github.com/xoppa/7558c0c75e9534795e9f
虽然不相关,但请记住 path.valueAt 方法使用 0 <= t <= 1
。或者换句话说,t
(代码中的 elapsedTime
)不应低于 0 或高于 1。