我正试图在Android 3 OpenGL (所以OpenGL es1.0)中构建一个不同颜色的立方体。(我是OpenGL编程的初学者)。我设法使它在一个固定的时间内旋转,但最大的问题是我不能把所有的脸都画出来。
的确,失踪的脸将不一样,无论
那么,最简单的纠正方法是什么呢?(我考虑过使用glClearDepth()和glCullFace(),但没有成功)。
下面是从GLSurfaceView.Renderer继承的我类的代码:
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLU;
import android.opengl.GLSurfaceView.Renderer;
public class MyGLRenderer implements Renderer {
public MyGLRenderer(){
buildCubeBuffers();
}
@Override
public void onDrawFrame(GL10 gl) {
gl.glRotatef(0.6f, 1.0f, 0.0f, 0.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glVertexPointer(COORDS_PER_VERTEX, GL10.GL_FLOAT, 0, cubeBuffer);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
//--- FRONT
gl.glColor4f(1.0f, 0.0f, 0.0f, 0.0f); //RED
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, VERTICES_NUMBER);
//--- RIGHT
gl.glColor4f(0.0f, 1.0f, 0.0f, 0.0f); // GREEN
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 4, VERTICES_NUMBER);
//--- BACK
gl.glColor4f(0.0f, 0.0f, 1.0f, 0.0f); // BLUE
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 8, VERTICES_NUMBER);
//--- LEFT
gl.glColor4f(1.0f, 1.0f, 0.0f, 0.0f); // YELLOW
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 12, VERTICES_NUMBER);
//--- TOP
gl.glColor4f(1.0f, 0.5f, 0.0f, 0.0f); // ORANGE
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 16, VERTICES_NUMBER);
//--- BOTTOM
gl.glColor4f(1.0f, 0.0f, 1.0f, 0.0f); // PURPLE
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 20, VERTICES_NUMBER);
//--
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
if (height == 0) height = 1;
if (width < height)
gl.glViewport(0, 0, width, width);
else
gl.glViewport(0, 0, height, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluLookAt(gl, 0.0f, 0.0f, 3.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
//////////////////////////////////////
/*
* If i comment next line :
* => Rotation on y axis
* yellow face is visible, red face is invisible
* Otherwise : yellow invisible and red visible !!!
* => Rotation on x axis
* purple face is visible, red face is invisible
* Otherwise : purple invisible and red visible !!!
* Why ???
*/
//////////////////////////////////////
gl.glEnable(GL10.GL_DEPTH_TEST);
}
private void buildCubeBuffers(){
final float cubeVertices[] = {
// front
-CUBE_UNITY_COORD, +CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 0 : Left-Top-Front
+CUBE_UNITY_COORD, +CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 1 : Right-Top-Front
-CUBE_UNITY_COORD, -CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 3 : Left-Bottom-Front
+CUBE_UNITY_COORD, -CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 2 : Right-Bottom-Front
// right
+CUBE_UNITY_COORD, +CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 1 : Right-Top-Front
+CUBE_UNITY_COORD, +CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 5 : Right-Top-Back
+CUBE_UNITY_COORD, -CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 2 : Right-Bottom-Front
+CUBE_UNITY_COORD, -CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 6 : Right-Bottom-Back
// back
+CUBE_UNITY_COORD, +CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 5 : Right-Top-Back
-CUBE_UNITY_COORD, +CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 4 : Left-Top-Back
+CUBE_UNITY_COORD, -CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 6 : Right-Bottom-Back
-CUBE_UNITY_COORD, -CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 7 : Left-Bottom-Back
// left
-CUBE_UNITY_COORD, +CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 4 : Left-Top-Back
-CUBE_UNITY_COORD, +CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 0 : Left-Top-Front
-CUBE_UNITY_COORD, -CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 7 : Left-Bottom-Back
-CUBE_UNITY_COORD, -CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 3 : Left-Bottom-Front
// top
-CUBE_UNITY_COORD, +CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 4 : Left-Top-Back
+CUBE_UNITY_COORD, +CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 5 : Right-Top-Back
-CUBE_UNITY_COORD, +CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 0 : Left-Top-Front
+CUBE_UNITY_COORD, +CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 1 : Right-Top-Front
// bottom
-CUBE_UNITY_COORD, -CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 3 : Left-Bottom-Front
+CUBE_UNITY_COORD, -CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 2 : Right-Bottom-Front
-CUBE_UNITY_COORD, -CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 7 : Left-Bottom-Back
+CUBE_UNITY_COORD, -CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 6 : Right-Bottom-Back
};
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(cubeVertices.length * FLOAT_CAPACITY_BYTES);
byteBuffer.order(ByteOrder.nativeOrder());
cubeBuffer = byteBuffer.asFloatBuffer();
cubeBuffer.put(cubeVertices);
cubeBuffer.rewind();
}
private final static float CUBE_UNITY_COORD = 0.5f;
private static FloatBuffer cubeBuffer;
private final static int FLOAT_CAPACITY_BYTES = 4;
private final static int COORDS_PER_VERTEX = 3;
private final static int VERTICES_NUMBER = 4;
}发布于 2011-03-17 01:25:28
我想你对矩阵栈的目的有点困惑。
投影应该从世界空间的一个固定位置映射到眼睛空间。
模型视图应该是所有相对于屏幕移动世界的东西的组合。所以,你通常会有某种变换,根据你在世界上的相机,它同样地移动整个世界,然后对于世界上的每一个物体,你会附加一个额外的转换,以模型视图来放置它相对于世界。
深度测试的效果取决于投影矩阵的结果,因此这种混淆很可能导致您描述的问题。
我建议你不要:
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluLookAt(gl, 0.0f, 0.0f, 3.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();你可能想要这样的东西:
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluPerspective(something suitable);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
GLU.gluLookAt(gl, 0.0f, 0.0f, 3.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);请参阅关于gluPerspective在这里的文档。这意味着你想要一个透视投影,然后切换到模型视图并设置一个摄像机位置。
您通常也不会像代码那样无限期地在模型视图上累积旋转,因为数值错误会很快地累积起来。但我敢打赌这只是一个简单的测试代码?
https://stackoverflow.com/questions/5327124
复制相似问题