【问题标题】:libGDX 3D following and facing objectlibGDX 3D 跟随和面对对象
【发布时间】:2014-10-31 14:07:34
【问题描述】:

我有两个模型实例modelInstance1modelInstance2

modelInstance1 - position Vector3(0,0,0)
modelInstance2 - position Vector3(10,10,10)

如何将 modelInstance1 旋转到 modelInstance2 并在 update 方法中移动这个方向?

回答后的问题:

我尝试回答基本的 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旋转到modelInstance2并移动这个方向。
  • 您是否尝试过将第一个模型实例的矩阵乘以指向第二个模型实例的lookAtMatrix?
  • 不,你能发布简单的例子吗?

标签: java 3d libgdx


【解决方案1】:

面对伪代码如下:

modelInstance1.direction(from matrix) = (modelInstance2.position).sub(modelInstance1.position).nor();
modelInstance1.setRotation(modelInstance1.direction, Vector3.Y);

更新: 在此示例中,方向矢量应用于对象的 Vector3.Y 轴。但是您的场景可能有另一个轴系统,因此有时您需要尝试不同对象的轴来找到目标轴。

【讨论】:

  • 我换了一个帖子,请问有什么问题吗?
  • instance2.transform.translate 应该在 direction 计算之前(如果预期 instance1 在 instance2 上查找)。而这只是面对的一部分。
  • 好的,每次在移动的instance2上怎么做instance1?
  • 您使用的代码应该足够了,但是您可以尝试以下参数: instance1.transform.setToRotation(direction, Vector3.X or Vector3.Y or Vector3.Z);你得到的实际输出是多少?
  • 我可以建议 2 个变体:1)您已经有了方向向量,所以在计算之后:direction.set(-direction.x, -direction.y, -direction.z) 2) 或 instance1 .transform.setToRotation(direction, new Vector(-1,0,0) OR new Vector(0,-1,0) OR new Vector(0,0,-1));
【解决方案2】:

终于....就这样了!!!!!!!!!!!!!!!!!!

如果有人知道相同的代码如何做得更好,请告诉我。

我希望对其他人有所帮助。 :)

    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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2016-06-06
    • 1970-01-01
    • 2021-01-06
    • 2013-06-03
    相关资源
    最近更新 更多