Java libGDX三维跟随和面向对象
我有两个模型实例Java libGDX三维跟随和面向对象,java,3d,libgdx,Java,3d,Libgdx,我有两个模型实例modelsinstance1和modelsinstance2 modelInstance1 - position Vector3(0,0,0) modelInstance2 - position Vector3(10,10,10) 如何将modelInstance1旋转到modelInstance2,并在更新方法中移动此方向 回答后的问题: 我试图回答基本xoppa的立方体教程,但有些不好。请问怎么了 @Override public void create() {
modelsinstance1
和modelsinstance2
modelInstance1 - position Vector3(0,0,0)
modelInstance2 - position Vector3(10,10,10)
如何将modelInstance1旋转到modelInstance2,并在更新方法中移动此方向 回答后的问题: 我试图回答基本xoppa的立方体教程,但有些不好。请问怎么了
@Override
public void create() {
environment = new Environment();
environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f));
environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f));
modelBatch = new ModelBatch();
cam = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
cam.position.set(10f, 10f, 10f);
cam.lookAt(0,0,0);
cam.near = 1f;
cam.far = 300f;
cam.update();
ModelBuilder modelBuilder = new ModelBuilder();
model = modelBuilder.createBox(5f, 5f, 10f,
new Material(ColorAttribute.createDiffuse(Color.GREEN)),
Usage.Position | Usage.Normal);
instance1 = new ModelInstance(model);
instance2 = new ModelInstance(model);
instance2.transform.translate(10,0,10);
camController = new CameraInputController(cam);
Gdx.input.setInputProcessor(camController);
}
渲染和更新方法
@Override
public void render() {
Vector3 position1 = new Vector3(), position2 = new Vector3(), direction = new Vector3();
instance1.transform.getTranslation(position1);
instance2.transform.getTranslation(position2);
direction = (position2).sub(position1).nor();
instance1.transform.setToRotation(direction, Vector3.X);
instance2.transform.translate(0.05f, 0, 0.05f).rotate(0, 1, 0, 10*Gdx.graphics.getDeltaTime()).translate(0, 0, 0);
camController.update();
Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
modelBatch.begin(cam);
modelBatch.render(instance1, environment);
modelBatch.render(instance2, environment);
modelBatch.end();
}
我尝试将setToRotate方法更改为:
instance1.transform.setToLookAt(position1, position2, new Vector3(0,1,0));
但同样的问题..在伪代码中面对类似的问题:
modelInstance1.direction(from matrix) = (modelInstance2.position).sub(modelInstance1.position).nor();
modelInstance1.setRotation(modelInstance1.direction, Vector3.Y);
更新:
在本例中,方向向量应用于对象的Vector3.Y轴。如果你的场景可以有另一个轴系统,那么有时候你需要尝试不同对象的轴来找到目标轴。最后……就是这样 当有人知道相同的代码做得更好时,请让我知道 我希望这对其他人有帮助。:)
“跟踪”的约束条件是什么?将modelInstance1旋转到modelInstance2,并移动此方向。您是否尝试将第一个modelInstance的矩阵乘以指向第二个modelInstance的lookAtMatrix?不,您可以发布简单的示例吗?我更改了一个帖子,你能告诉我怎么了吗?instance2.transform.translate应该在方向计算之前(如果预期的instance1显示在instance2上)。这只是面向部分。好的,那么每次查看移动的实例2时,如何执行实例1?您使用的代码应该足够了,但您可以尝试以下参数:instance1.transform.setToRotation(direction,Vector3.X或Vector3.Y或Vector3.Z);你得到的实际输出是什么?我可以建议两种变体:1)你已经有了方向向量,所以在计算之后:direction.set(-direction.x,-direction.y,-direction.z)2)或instance1.transform.setToRotation(direction,new vector(-1,0,0)或new vector(0,-1,0)或new vector(0,0,-1));
Vector3 position1 = new Vector3(), position2 = new Vector3(), direction = new Vector3();
instance2.transform.translate(0.5f, 0, 0.5f).rotate(0, 1, 0, 45*Gdx.graphics.getDeltaTime()).translate(0, 0, 0);
instance1.transform.getTranslation(position1);
instance2.transform.getTranslation(position2);
direction = (position2).sub(position1).nor();
direction.set(-direction.x, -direction.y, -direction.z);
Quaternion quaternion = new Quaternion();
Matrix4 instanceRotation = instance1.transform.cpy().mul(instance1transform);
instanceRotation.setToLookAt(direction, new Vector3(0,-1,0));
instanceRotation.rotate(0, 0, 1, 180);
instanceRotation.getRotation(quaternion);
instance1.transform.set(position1, quaternion);