libgdx:如何使用Othographic Camera定位3d模型实例?

时间:2016-03-31 09:59:47

标签: libgdx

我有一个使用Othographic Camera的Screen类,并希望在其上放置一个3d模型。

@Override
    public void show() {

    ....
    mCamera = new OrthographicCamera();
    mCamera.setToOrtho(false, width * sclWidth, height * sclWidth);
    ....

    //3d instance initialization
        modelBatch = new ModelBatch();
        ModelBuilder modelBuilder = new ModelBuilder();
        model = modelBuilder.createBox(0.5f,0.5f,0.5f, new Material(ColorAttribute.createDiffuse(Color.GREEN)), VertexAttributes.Usage.Position| VertexAttributes.Usage.Normal);

  modelInstance = new ModelInstance(model, 128,128,128);
  modelInstance.transform.set(mCamera.invProjectionView);
}



@Override
    public void render(float delta) {
        Gdx.gl.glClearColor(63 / 255f, 128 / 255f, 70 / 255f, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

        //mCamera.rotateAround(Vector3.Zero, new Vector3(0,1,0),1f);
        mCamera.update();
    mBatch.setProjectionMatrix(mCamera.combined);

    mBatch.begin();
    mBatch.draw(img, 128*10, 0);

    mBatch.end();

    modelBatch.begin(mCamera);

    modelBatch.render(modelInstance);

    modelBatch.end();

}

在2d视图中,我可以根据屏幕宽度和高度在屏幕上放置任何带有x和y的2d精灵。

然而,当做3D模型时,它完全不同。

根据相机屏幕拉伸3d模型并渲染在屏幕中央。我找不到3d模型setX或setY / SetZ函数。

如何定位3d模型以及我应该使用哪些功能?对教程的任何建议或指导都会感激不尽。

更新: 摄像头位置:(768.0,192.0,0.0) 相机投影:[0.0012019231 | 0.0 | 0.0 | -0.0] [0.0 | 0.0021378205 | 0.0 | -0.0] [0.0 | 0.0 | -0.02 | -1.0] [0.0 | 0.0 | 0.0 | 1.0]

1 个答案:

答案 0 :(得分:3)

首先,您在坐标128,128,128处实例化了模型实例。我不知道您的相机位于何处,但如果您想要一个居中的对象,则模型实例的X和Y应该与相机位置匹配。

此外,如果您希望整个模型可见,则需要将其沿Z方向移开。相机向下看-Z轴,因此模型实例的位置Z必须小于相机的Z位置才能看到。

你的主要问题是这一行,应删除:

modelInstance.transform.set(mCamera.invProjectionView);

您绝对不想应用相机的投影矩阵并将其用作模型的变换矩阵。

顶点位置通常(如在ModelBatch的默认着色器中)通过将其位置乘以一系列矩阵从世界坐标映射到屏幕坐标。 变换矩阵描述了ModelInstance的位置,旋转和缩放,因此它将原始模型的顶点位置转换为世界空间。 视图矩阵然后将顶点转换为它的相机相对位置(相机空间,也称为视图空间)。然后投影矩阵将顶点转换为屏幕空间(将其投影到矩形屏幕)。由于视图和投影矩阵都是由摄像机定义的,因此可以预先相乘并一次性传递给批处理(camera.combined)。

在着色器中,每个顶点位置乘以矩阵以使其进入屏幕空间。

因此,要在世界中移动模型实例,可以对其变换矩阵执行操作,例如modelInstance.transform.translate(x,y,z)。您通常不应该在其上调用set。第modelBatch.begin(mCamera);行为您负责camera.combined矩阵。

在2D中使用SpriteBatch时,您将精灵直接放置在世界空间中,因为没有定义顶点位置的源模型。这就是为什么在使用SpriteBatch时通常不需要使用变换矩阵(尽管它可以用于将整个精灵平面移动到3D世界空间中的某个位置)。