2

さて、これは説明するのが難しいでしょう。私はAndEngineを使用してAndroid用の非常に基本的な「疑似3d」レーシングゲームを作成しています(そして、openGL-私は思います)。AndEngineの使用は、この問題と実際には何の関係もないと思います。なぜなら、描画を完了するためにopenGL関数に直接アクセスしているからです。

とにかく、私は通常2d AndEngineが3dパースペクティブを持つことを可能にするいくつかのコードをコピーパスタしました(そのようなチュートリアルはここにあります。これはかなりうまく機能し、これが私の問題とあまり関係がないと思います、しかし私はopenGLを完全には理解していないので、言うのは少し難しいです。3DパースペクティブでカメラをセットアップするonLoadEngine(アプリの起動時に呼び出されます)からのコードは次のとおりです。

this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT) {
    //other methods...
    private void setFrustum(GL10 pGL) {
        // set field of view to 60 degrees
        float fov_degrees = 60;
        float fov_radians = fov_degrees / 180 * (float)Math.PI;                        

        // set aspect ratio and distance of the screen
        float aspect = this.getWidth() / (this.getHeight());
        float camZ = this.getHeight()/2 / (float)Math.tan(fov_radians/2);                              

        // set projection
        GLHelper.setProjectionIdentityMatrix(pGL);
        GLU.gluPerspective(pGL, fov_degrees, aspect, camZ/10, camZ*10); 

        // set view
        GLU.gluLookAt(pGL, 0,120f, camZ, 0, 0, 0f, 0, 1, 0); // move camera back+up
        pGL.glScalef(1,-1,1); // reverse y-axis
        pGL.glTranslatef(-CAMERA_WIDTH/2,-CAMERA_HEIGHT/2,0); // origin at top left
    }
};

その後、onLoadScene(描画が行われる場所)で、次のように一連の画像を描画します。

for (int n=0;n<=100;n++) {
    final int k = n;

    final Sprite line = new Sprite(0, 0,CAMERA_WIDTH,16f, [AndEngine texture holding road img]) {
    @Override
        protected void applyTranslation(GL10 pGL) {
            pGL.glTranslatef(this.mX, 120f, 15f*k); //16*k causes a sliver of a space between each segment
            pGL.glRotatef(90f, 1, 0, 0); //**MAY BE MY ISSUE**
        }           
    };
    scene.attachChild(line); //actually draws the image to the screen           
}

1つを除いて、これもかなりうまく機能します!それは私の画像のたわごとを歪めます。画像は単純なpngで、どちらもCAMERA_WIDTHと一致し、どちらも次のようになります。

そして、回転線なしで描画すると、次のようになります。 回転せずに

これはまともな直線の中央線を持っていますが(tbh私はこの方法でそれらに満足します)、道路の端は基本的にそれらが向いているはずの正反対の方向を向いていることがわかります。なぜそれらを裏返すだけではないのか考えましたか?x軸を中心に180度回転させる必要があると思いましたが、それでは消えてしまい、90度で動作することがわかりました(???)。とにかく、これが私が得るものです:

最終製品

そうそう。ここに私の問題があります-中央の車線の仕切りはがらくたとして歪んでいます!! 道路の端を示す線は見事に並んでいますが、どういうわけかそれは本当にその真ん中の線をいじっています。私は3Dの背後にある数学のほとんどを理解していますが、これをどうすればよいのか本当にわかりません...非常に鋭い角度で表示されているため、画像が圧縮されているようですが、実際にはわかりません単純にトップダウンビューにすることなく、どうすればそれを解決できるでしょうか。:S

とにかく...どんなアイデアやガイダンスも大歓迎です。申し訳ありませんが、これは非常に長く複雑な投稿です。問題がどこにあるのか本当にわからない場合は、大変です。

また、私はopenGLまたは3Dグラフィックスの経験がほとんどないか、まったくないこと、そしてそれらについて深く学ぶことにあまり興味がないことは注目に値するかもしれません。この問題に対するバンドエイドが必要です!

4

1 に答える 1

3

わかりましたので、解決策を見つけました!Perspective Correct Texturingと呼ばれるこの小さな問題があることが判明しました。これは基本的に、遠近法で描画されているときに画像を歪ませないようにするために OpenGL でオンにする必要がある単なるフラグです。

カメラの初期化コード内で、次の行をメソッド setFrustum(GL10 pGL) に追加しました。

pGL.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);

これが本質的に問題を解決したこと。行は今までと同じようにまっすぐです:)別のstackoverflowの投稿でこれを見つけました。この回答は実際には質問者が望んでいたものではありませんでしたが、たまたま私にとってはうまくいきました:D 私を答えに導いたスレッドはここにあります。

于 2012-12-02T21:45:38.020 に答える