Java OpenGL元素不可见

Java OpenGL元素不可见,java,android,opengl-es,glsurfaceview,Java,Android,Opengl Es,Glsurfaceview,我正在尝试制作一个小的3D场景,其中有4个金字塔,用户可以旋转和放大/缩小 我编写了以下代码。它工作得很好,但当我将金字塔延迟到远处(-100个单位)时,它们不会被绘制出来。我不知道为什么。glTranslatef()有一些限制吗 公共类PrespectiveView扩展了GLSurfaceView实现了GLSurfaceView.Renderer { 主活动thiz; 空间坐标轴t=新空间坐标轴(); 公众透视图(主要活动a) { 超级(a); thiz=a; (本),; } 浮动宽度=320

我正在尝试制作一个小的3D场景,其中有4个金字塔,用户可以旋转和放大/缩小

我编写了以下代码。它工作得很好,但当我将金字塔延迟到远处(-100个单位)时,它们不会被绘制出来。我不知道为什么。glTranslatef()有一些限制吗

公共类PrespectiveView扩展了GLSurfaceView实现了GLSurfaceView.Renderer
{
主活动thiz;
空间坐标轴t=新空间坐标轴();
公众透视图(主要活动a)
{
超级(a);
thiz=a;
(本),;
}
浮动宽度=320,高度=462;
已创建曲面上的公共void(GL10 gl、EGLConfig arg1)
{
gl.glMatrixMode(GL10.gl_投影);
浮点数=0.01f*(浮点数)数学tan(数学toRadians(45.0)/2);
浮动比率=_宽度/_高度;
gl.GLFRUSTOMF(-size,size,-size/ratio,size/ratio,0.1f,100.0f);
gl.glMatrixMode(GL10.gl_MODELVIEW);
gl.glEnable(GL10.gl_深度_试验);
gl.glClearColor(0.5f、0.8f、0.8f、1f);
gl.glEnable(GL10.gl_CULL_面);
gl.glEnableClientState(GL10.gl_顶点数组);
gl.glEnableClientState(GL10.gl\u颜色\u数组);
}
表面上的公共无效已更改(GL10 gl、int arg1、int arg2)
{
_宽度=arg1;
_高度=arg2;
gl.glViewport(0,0,arg1,arg2);
}
float[]transArr={-1f,1f,0f},{1f,1f,-1f},{-1f,-1f,-2f},{1f,-1f,-3f};
公共框架(GL10 gl)
{
gl.glClear(GL10.gl_颜色_缓冲_位| GL10.gl_深度_缓冲_位);
gl.glLoadIdentity();
gl.glTranslatef(0f,0f,-50f+Cameradit);
gl.glRotatef(摄像头、1f、0f、0f);
gl.glRotatef(摄像头、0f、1f、0f);
对于(int i=0;i<4;i++)
{
gl.glPushMatrix();
gl.glTranslatef(transArr[i][0],transArr[i][1],0);
t、 绘图(gl);
gl.glPopMatrix();
}
写(““+Cameradit”);
}
布尔上下;
浮点CameraAX=0,CameraAY=0,camerradist=0,tempX,tempY;
@覆盖公共布尔onTouchEvent(MotionEvent e)
{
如果(e.getAction()==MotionEvent.ACTION\u DOWN)
{
tempX=e.getX();
tempY=e.getY();
UpDown=e.getY()>_宽度/2;
返回true;
}
如果(向上向下)
{
cameray-=(tempX-e.getX())/5;
CameraAX-=(tempY-e.getY())/5;
}
其他的
{
Cameradit-=(tempY-e.getY())/2;
}
tempX=e.getX();
tempY=e.getY();
返回true;
}
}
//三轴牵引
公共作废提款(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.GLD元素(GL10.gl_三角形,12,GL10.gl_无符号_短,s);
}

感谢您的帮助。

您正在将棱锥体平移到查看平截头体的远剪裁平面(gl.gl.glFrustumf(-size,size,-size/ratio,size/ratio,size/ratio,0.1f,100.0f);行定义了这一点)

如果希望远剪裁平面更清晰可见,请增加远剪裁平面(当前为
100.0f
),但请注意,如果您进行过任何类型的深度测试,则越远,深度值的精确度越低。如果注意到任何z形格斗,请在不剪裁世界中的对象的情况下尽可能增加“近剪裁平面”(当前
0.1f

    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);
}