libgdx:如何使用Othographic摄影机定位三维模型实例?

libgdx:如何使用Othographic摄影机定位三维模型实例?,libgdx,Libgdx,我有一个屏幕类,使用超视距相机,并希望把它的三维模型 @Override public void show() { .... mCamera = new OrthographicCamera(); mCamera.setToOrtho(false, width * sclWidth, height * sclWidth); .... //3d instance initialization modelBatch = new Mo

我有一个屏幕类,使用超视距相机,并希望把它的三维模型

@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) 摄像机投影:[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]

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

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

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

modelInstance.transform.set(mCamera.invProjectionView);
您肯定不希望应用摄影机的投影矩阵并将其用作模型的变换矩阵

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

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

因此,要在世界各地移动模型实例,您需要对其变换矩阵执行操作,例如
modelconstance.transform.translate(x,y,z)
。您通常不需要对其调用
set
。行
modelBatch.begin(mCamera)
负责
摄像头。在发动机罩下为您组合
矩阵


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

文档中对此进行了详细说明。是的,我看了大部分,但还是不明白。我想当我们设置屏幕宽度和高度的正交相机时,它会映射到屏幕的每个像素。但是,当放置0.5f、0.5f、0.5f的3d框时,它向我展示了一个大约300像素宽的大拉伸框。我不知道为什么。哇,非常感谢。我没有使用modelInstance.transform.set(mCamera.invProjectionView);,就解决了这个问题;。设置相机的x和y值给了我一个很大的提示,告诉我怎么做。再次感谢!顺便说一句,你知道这是怎么回事吗?我想弄明白为什么圆圈没有停下来。没有使用gdx.ai,抱歉。