0

この簡単なチュートリアル
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 形状を作成し、それを 2 つの異なるビューで同時に表示することです。1 つはパースペクティブ カメラを使用し、もう 1 つは正投影カメラを使用します。

ありがとう!

ここに完全なコードがあります

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() {

}
} 
4

2 に答える 2

2

正投影カメラは (幸いなことに) z を無視しません。簡単に言うと、基本的に別の投影法です。つまり、ピラミッドの代わりに箱錐台があります。詳細な説明については、この記事を確認してください: http://www.badlogicgames.com/wordpress/?p=1550

デフォルトでは、カメラの近辺の値 = 1f、遠方の値 = 100f であることに注意してください。あなたの場合、モデルから正確に 100f 単位離れています。つまり、モデルはファー プレーン上にあります。さまざまな要因に応じて、モデルが部分的に表示される場合もあれば、部分的に表示される場合もあります。

これを行うと、次のようになります。

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

あなたは基本的に、世界の 1 つの単位が 1 つのピクセルにマッピングされるべきだと言っています。したがって、モデル (50x50x50 ボックス) は幅/高さ約 50 ピクセルになります。1 つのワールド単位を 2 つのピクセルなどにマップする場合は、次のようにします。

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

などなど。これをより適切に制御したい場合は、ビューポートの使用を検討できます。https ://github.com/libgdx/libgdx/wiki/Viewports を参照してください。

また、モデル内にカメラを配置しないように注意してください。ダニエルが言ったように、を使用しないでlookAtくださいposition。これにより、directionがゼロになります。

于 2014-04-24T16:14:41.333 に答える
0

OrthographicCamera では、代わりにズームを使用してください。

于 2014-04-24T12:16:51.537 に答える