我正在实施这个简单的教程
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() {
}
}
答案 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
另外请注意不要将相机放在模型中,正如daniel所说,不要lookAt
position
,这会导致direction
为零。
答案 1 :(得分:0)
在OrthographicCamera上使用缩放。