【问题标题】:Orthographic projection of 3D shape libgdx3D 形状 libgdx 的正交投影
【发布时间】:2014-06-09 13:13:20
【问题描述】:

我正在实施这个简单的教程
blog.xoppa.com/basic-3d-using-libgdx-2/
但试图用正交相机代替透视相机。

但是,我在理解相机位置的工作原理方面存在一些问题:
我加了

cam2 = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
cam2.setToOrtho(true, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
cam2.position.set(0,0,10);
cam2.lookAt(0, 0, 0);
cam2.update()

我得到一个非常小的正方形。如果我改变位置。

    cam2.position.set(0,0,100);

我什么都看不到,我想知道为什么正交相机应该忽略 z。
基本上我需要的是创建一个 3D 形状并同时在两个不同的视图中显示它,一个使用透视图,另一个使用正交相机。

谢谢!

这是完整的代码

public class MyGdxGame implements ApplicationListener {
//  public PerspectiveCamera cam;
public OrthographicCamera cam2;

public ModelBatch modelBatch;
public Model model;
public ModelInstance instance;

@Override
public void create() {
    modelBatch = new ModelBatch();

//      cam = new PerspectiveCamera(67, Gdx.graphics.getWidth()/2, Gdx.graphics.getHeight()/2);
    cam2 = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    cam2.setToOrtho(true, 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();

    cam2.position.set(0, 0,0);
    cam2.lookAt(0, 0, 0);
    cam2.update();

    ModelBuilder modelBuilder = new ModelBuilder();
    model = modelBuilder.createBox(50f, 50f, 50f,
            new Material(ColorAttribute.createDiffuse(Color.GREEN)),
            Usage.Position | Usage.Normal);
    instance = new ModelInstance(model);
}

@Override
public void render() {
    cam2.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(instance);
//      modelBatch.end();
//      
//      Gdx.gl.glViewport(Gdx.graphics.getWidth()/2, 0, Gdx.graphics.getWidth()/2,
//              Gdx.graphics.getHeight()/2);
//      
    modelBatch.begin(cam2);
    modelBatch.render(instance);
    modelBatch.end();
}

@Override
public void dispose() {
    modelBatch.dispose();
    model.dispose();
}

@Override
public void resize(int width, int height) {
}

@Override
public void pause() {
}

@Override
public void resume() {

}
} 

【问题讨论】:

    标签: 3d libgdx 2d perspectivecamera orthographic


    【解决方案1】:

    在 OrthographicCamera 上使用缩放代替。

    【讨论】:

    • 我知道我可以使用缩放,但是根据许多类似github.com/libgdx/libgdx/wiki/Projection,-viewport,-%26-camera“正交相机,它基本上忽略了 z 坐标。”的教程...所以为什么通过改变 z 位置我得到一个不同的看法?
    • 如果位置相同且尺寸差异很大,这可能是错误,我也注意到在lookAt之前或之后设置位置很重要。
    • 我什么都没做:我先编译应用程序设置 cam2.position.set(0,0,10);然后使用 cam2.position.set(0,0,100) 或 cam2.position.set(0,0,200);我什么也没得到...然后根据官方 wiki github.com/libgdx/libgdx/wiki/Orthographic-camera 相机的位置应该是 (WIDTH / 2, HEIGHT / 2, 0) [视口中心] 但我不工作...跨度>
    • 可能在你的代码中你有错误的地方,还要检查render()或update()方法,我对libgdx中的相机没有问题。
    • 将lookat 和position 都设为0 是不好的
    【解决方案2】:

    正交相机(幸运的是)不会忽略 z。简单地说,它基本上是一个不同的投影,即它有一个平截头体而不是金字塔。查看这篇文章以获得更深入的解释:http://www.badlogicgames.com/wordpress/?p=1550

    请注意,默认情况下,相机近值 = 1f,远值 = 100f。在您的情况下,您将 100f 单位从模型中移开。换句话说:模型在远平面上。根据各种因素,您会看到部分模型(如果有的话)。

    现在,当你这样做时:

    new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    

    您基本上是在说您的世界中的一个单位应该映射到一个像素。因此,您的模型(一个 50x50x50 的盒子)将是大约 50 像素宽/高。如果您想将一个世界单位映射到例如两个像素,你可以这样做:

    new OrthographicCamera(Gdx.graphics.getWidth() /2f, Gdx.graphics.getHeight() / 2f);
    

    等等。如果您想对此进行更好的控制,可以考虑使用视口,请参阅:https://github.com/libgdx/libgdx/wiki/Viewports

    还要注意不要将你的相机放在你的模型中,正如丹尼尔所说,不要lookAt你的position,它会导致你的direction为零。

    【讨论】:

      猜你喜欢
      • 2015-03-07
      • 2011-11-25
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 2016-01-04
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多