libgdx:如何使用Othographic Camera定位三维模型实例



我有一个Screen类,它使用Othographic Camera,并希望在上面放置一个三维模型。

@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精灵放在屏幕上。

然而,当做三维模型时,情况就完全不同了。

三维模型根据相机屏幕进行拉伸,并在屏幕中心进行渲染。我找不到三维模型setX或setY/SetZ函数。

3d模型应该如何定位,我应该使用什么功能?任何对教程的建议或指导都将不胜感激。

更新:相机位置:(768.0192.0,0.0)相机投影:[0001219231|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]

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

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

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

modelInstance.transform.set(mCamera.invProjectionView);

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

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

在着色器中,每个顶点位置都会乘以矩阵,从而进入屏幕空间。

因此,要在世界上移动模型实例,需要对其变换矩阵执行操作,例如modelInstance.transform.translate(x,y,z)。一般来说,你不需要在上面调用setmodelBatch.begin(mCamera);行在后台为你处理camera.combined矩阵。

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

最新更新