2

次のコードは、トーラスがゆっくりと回転して表示されることを示しています。

package com.objloader.example;

import ...
public class ObjLoaderProg implements ApplicationListener{
    String torus;
    Mesh model;
    private PerspectiveCamera camera;
    @Override
    public void create() {
        InputStream stream=null;
        try {
            stream = new FileInputStream(Gdx.files.internal("data/torus.obj").path());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        model = ObjLoader.loadObj(stream, true);
        Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
        Gdx.gl10.glTranslatef(0.0f,0.0f,-3.0f);
    }

    @Override
    public void dispose() {
    }

    @Override
    public void pause() {
    }

    protected int lastTouchX;
    protected int lastTouchY;
    protected float rotateZ=0.01f;
    protected float increment=0.01f;

    @Override
    public void render() {
        Gdx.gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        camera.update();
        camera.apply(Gdx.gl10);
        Gdx.gl10.glTranslatef(0.0f,0.0f,-3.0f);
        Gdx.gl10.glRotatef(rotateZ, rotateZ, 5.0f, rotateZ);
        model.render(GL10.GL_TRIANGLES);

         if (Gdx.input.justTouched()) {
              lastTouchX = Gdx.input.getX();
              lastTouchY = Gdx.input.getY();
            } else if (Gdx.input.isTouched()) {
              camera.rotate(0.2f * (lastTouchX - Gdx.input.getX()), 0, 1.0f, 0);
              camera.rotate(0.2f * (lastTouchY - Gdx.input.getY()), 1.0f, 0, 0);

              lastTouchX = Gdx.input.getX();
              lastTouchY = Gdx.input.getY();
            }
         rotateZ+=increment;
         System.out.println(""+rotateZ);
    }

    @Override
    public void resize(int arg0, int arg1) {
        float aspectRatio = (float) arg0 / (float) arg1;
        camera = new PerspectiveCamera(67, 2f * aspectRatio, 2f);
        camera.near=0.1f;
        camera.translate(0, 0, 0);
    }

    @Override
    public void resume() {
    }
}

データフォルダに保存されているトーラスオブジェクトをレンダリングし、画面をクリックしてドラッグすることで、ユーザーはカメラを回転させることができます。

これはデスクトップでは正常に機能しますが、Androidで実行しようとすると、次の場所でNullPointerExceptionが発生します。

model.render(GL10.GL_TRIANGLES);

torus.objをアセット内、およびアセット/データ内に配置してみました。libgdx0.9.2を使用しています。

4

1 に答える 1

6

を指していると思いますmodel.render(GL10.GL_TRIANGLES);。あなたには2つの問題があると思います。まず、FileNotFoundException をキャッチして無視しているため、モデルは null です。今すぐ FileNotFoundException をキャッチせずにクラッシュさせ、スタック トレースを確認することをお勧めします。これにより、これが失敗した理由をよりよく示すことができます。e.printStackTrace() は Android でのデバッグには役に立たないことに注意してください。gdx ログを使用してみてください。

2 番目の問題は、パス/ストリームが実際には間違った場所に移動していると思われることです。FileInputStream を作成する代わりに、FileHandle.read() 関数を使用します。ObjLoader.loadObj() に渡すことができる java.io.InputStream を返します。

in = Gdx.files.internal("data/torus.obj").read();
model ObjLoader.loadObj(in);
in.close();

これとあなたのコードの違いは、libgdx の Android バックエンドの FileHandle.read() が Android AssetManagerを使用して、プログラムにバンドルされているファイルを開くことです。

最後に、torus.obj ファイルを <YourAndroidProject>/assets/data/torus.obj にコピーします。

余談ですが、行番号を指定する場合は、完全なファイルを提供してください。そうしないと、行がオフになります。あなたが提供したコードの 52 行目は次のとおりlastTouchY = Gdx.input.getY();です。コードの先頭にある "import ..." に注意してください。これらのインポートは行番号に影響します。

于 2011-09-26T16:16:57.393 に答える