首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >三维形核的正射投影

三维形核的正射投影
EN

Stack Overflow用户
提问于 2014-04-24 10:02:22
回答 2查看 2.7K关注 0票数 1

我正在实现这个简单的教程

Blog.xoppa.com/basic-3d-using libgdx-2/

但是试图用正字法来代替透视相机。

然而,在理解摄像机的位置是如何工作的过程中,我有一些问题:

我加了

代码语言:javascript
复制
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()

我得到一个很小的正方形。如果我改变立场。

代码语言:javascript
复制
    cam2.position.set(0,0,100);

我什么也看不见,我想知道为什么,因为正射相机应该忽略z。

基本上,我需要的是创建一个3D形状,同时在两个不同的视图中显示它,一个使用透视图,另一个使用正射相机。

谢谢!

这是完整的代码

代码语言:javascript
复制
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() {

}
} 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-24 16:14:41

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

注意,默认情况下,摄像机的近值= 1f和远值=100 F。在你的例子中,你正把100 F单位移离你的模型。换句话说,模型在遥远的飞机上。取决于各种因素,您将看到模型的一部分,如果有的话。

现在,当你这样做时:

代码语言:javascript
复制
new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

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

代码语言:javascript
复制
new OrthographicCamera(Gdx.graphics.getWidth() /2f, Gdx.graphics.getHeight() / 2f);

以此类推。如果您想更好地控制这一点,可以考虑使用Viewport,请参阅:https://github.com/libgdx/libgdx/wiki/Viewports

也要小心不要把你的相机放在你的模型内,正如丹尼尔所说,不要lookAt你的position,它会导致你的direction为零。

票数 2
EN

Stack Overflow用户

发布于 2014-04-24 12:16:51

在OrthographicCamera上使用缩放代替。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23265724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档