1

ユーザーが回転およびズームイン/ズームアウトできる 4 つのピラミッドがある小さな 3D シーンを作成しようとしています。

私は次のコードを書きました。それはうまく機能しますが、ピラミッドを遠く (-100 単位) まで遅らせると、それらは描画されません。どうしてか分かりません。glTranslatef() に制限はありますか?

    public class PrespectiveView extends GLSurfaceView implements GLSurfaceView.Renderer
    {
        MainActivity thiz;
        Triag t = new Triag();
        public PrespectiveView(MainActivity a)
        {
            super(a);
            thiz = a;
            setRenderer(this);
        }

        float _width = 320, _height = 462;

        public void onSurfaceCreated(GL10 gl, EGLConfig arg1)
        {
            gl.glMatrixMode(GL10.GL_PROJECTION);
            float size = .01f * (float) Math.tan(Math.toRadians(45.0) / 2); 
            float ratio = _width / _height;
            gl.glFrustumf(-size, size, -size/ratio, size/ratio, 0.1f, 100.0f);
            gl.glMatrixMode(GL10.GL_MODELVIEW);
            gl.glEnable(GL10.GL_DEPTH_TEST);
            gl.glClearColor(0.5f, 0.8f, 0.8f, 1f);
            gl.glEnable(GL10.GL_CULL_FACE);
            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
            gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
        }

        public void onSurfaceChanged(GL10 gl, int arg1, int arg2)
        {
            _width = arg1;
            _height = arg2;
            gl.glViewport(0, 0, arg1, arg2);
        }

        float[][] transArr = {{-1f,1f, 0f},{1f,1f, -1f},{-1f,-1f, -2f},{1f,-1f, -3f}};
        public void onDrawFrame(GL10 gl)
        {
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
            gl.glLoadIdentity();
            gl.glTranslatef(0f, 0f, -50f+CameraDist);
            gl.glRotatef(CameraAX, 1f, 0f, 0f);
            gl.glRotatef(CameraAY, 0f, 1f, 0f);
            for(int i = 0; i < 4; i++)
            {
                gl.glPushMatrix();
                gl.glTranslatef(transArr[i][0], transArr[i][1], 0);
                t.draw(gl);
                gl.glPopMatrix();
            }
            thiz.write(""+CameraDist);
        }
        boolean UpDown;
        float CameraAX = 0, CameraAY = 0, CameraDist = 0, tempX, tempY;
        @Override public boolean onTouchEvent(MotionEvent e)
        {
            if(e.getAction() == MotionEvent.ACTION_DOWN)
            {
                tempX = e.getX();
                tempY = e.getY();
                UpDown = e.getY() > _width/2;
                return true;
            }

            if(UpDown)
            {
                CameraAY -= (tempX-e.getX())/5;
                CameraAX -= (tempY-e.getY())/5;
            }
            else
            {
                CameraDist -= (tempY-e.getY())/2;
            }
            tempX = e.getX();
            tempY = e.getY();

            return true;   
        }
    }

//Triag draw
public void draw(GL10 gl)
{
   gl.glColor4f(1, 1, 1, 1);
   gl.glVertexPointer(3, GL10.GL_FLOAT, 0, f);
   gl.glColorPointer(4, GL10.GL_FLOAT, 0, c);
   gl.glDrawElements(GL10.GL_TRIANGLES, 12, GL10.GL_UNSIGNED_SHORT, s);
}

手伝ってくれてありがとう。

4

1 に答える 1

2

ピラミッドを、視錐台の遠いクリッピング平面を越えて移動しています(gl.glFrustumf(-size, size, -size/ratio, size/ratio, 0.1f, 100.0f);線がこれを定義しています)。

遠方のクリッピング平面(現在100.0f)をさらに表示したい場合は増やしますが、何らかの深さテストを行うと、遠方に行くほど深さの値の精度が低下することに注意してください。Zファイティングに気付いた場合は、ワールド内のオブジェクトをクリッピングせずに、可能な限りニアクリッピングプレーンを増やします(現在0.1f)。

于 2012-07-28T22:38:17.913 に答える