我一直试图通过修补绘制三个三角形的最基本的例子来学习OpenGL -
http://www.learnopengles.com/android-lesson-one-getting-started/#comment-2164
在xy平面中定义了三个三角形,z = 0.0
final float[] triangle1VerticesData = {
// X, Y, Z,
// R, G, B, A
-0.5f, -0.25f, 0.0f,
1.0f, 0.0f, 0.0f, 1.0f,
0.5f, -0.25f, 0.0f,
0.0f, 0.0f, 1.0f, 1.0f,
0.0f, 0.559016994f, 0.0f,
0.0f, 1.0f, 0.0f, 1.0f};
视锥体已被裁剪为z = 1.0和z = 10.0
public void onSurfaceChanged(GL10 glUnused, int width, int height)
{
// Set the OpenGL viewport to the same size as the surface.
GLES20.glViewport(0, 0, width, height);
// Create a new perspective projection matrix. The height will stay the same
// while the width will vary as per aspect ratio.
final float ratio = (float) width / height;
final float left = -ratio;
final float right = ratio;
final float bottom = -1.0f;
final float top = 1.0f;
final float near = 1.0f;
final float far = 10.0f;
Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far);
}
所以三角形存在于外面,视锥体,对吧?它们也没有在视锥体内翻译。
public void onDrawFrame(GL10 glUnused)
{
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
// Do a complete rotation every 10 seconds.
long time = SystemClock.uptimeMillis() % 10000L;
float angleInDegrees = (360.0f / 10000.0f) * ((int) time);
// Draw the triangle facing straight on.
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.rotateM(mModelMatrix, 0, angleInDegrees, 0.0f, 0.0f, 1.0f);
drawTriangle(mTriangle1Vertices);
...
}
更重要的是,当我将三角形顶点的z坐标更改为1.0时,它们将不再可见。 1.0等于近平面,因此它应该包含在视锥体中。这是怎么回事?我忽略了一些重要的细节吗?原谅这个简单化的问题,我对这个基本问题如此坚持,然后我发现自己无法在没有解释的情况下前进。
答案 0 :(得分:1)
您忘记了自己的观看矩阵:mViewMatrix
视图矩阵将相机定位在(0,0,1.5)处,朝负Z方向(0,0,-1)。 视锥体在观察方向。所以近平面位于(0,0,0.5),远平面位于(0,0,-8.5)
这就是为什么z = 0处的三角形可见而z = 1处的三角形不是。