6.3 使用w分量创建透视效果(Adding the W Component to Create Perspective)
假如我们能在实践中看到w分量的效果,那么就能够更容易理解w分量的作用,因此我们把它加入到桌面顶点数据中并看看会产生什么效果。因为对于一个顶点我们将会指定x、y、z、w四个分量,因为我们将按照如下代码更新变量POSITION_COMPONENT_COUNT 的值:
//AirHockey3D/src/com/airhockey/android/AirHockeyRenderer.java
private static final int POSITION_COMPONENT_COUNT = 4;
我们需要确定给OpenGL传递了正确的分量数量,否则我将不会得到想要的结果或者将会直接导致应用崩溃。
下一步是按照如下代码更新顶点数据:
//AirHockey3D/src/com/airhockey/android/AirHockeyRenderer.java
float[] tableVerticesWithTriangles = {
// Order of coordinates: X, Y, Z, W, R, G, B
// Triangle Fan
0f, 0f, 0f, 1.5f, 1f, 1f, 1f,
-0.5f, -0.8f, 0f, 1f, 0.7f, 0.7f, 0.7f,
0.5f, -0.8f, 0f, 1f, 0.7f, 0.7f, 0.7f,
0.5f, 0.8f, 0f, 2f, 0.7f, 0.7f, 0.7f,
-0.5f, 0.8f, 0f, 2f, 0.7f, 0.7f, 0.7f,
-0.5f, -0.8f, 0f, 1f, 0.7f, 0.7f, 0.7f,
// Line 1
-0.5f, 0f, 0f, 1.5f, 1f, 0f, 0f,
0.5f, 0f, 0f, 1.5f, 1f, 0f, 0f,
0f, -0.4f, 0f, 1.25f, 0f, 0f, 1f,
0f, 0.4f, 0f, 1.75f, 1f, 0f, 0f
};
在顶点数组中增加了z、w两个分量,所有位于屏幕底部的顶点的w分量为1,位于位于屏幕顶部的顶点的w分量为2;我们同时更新了中心分隔线及两个球体(目前是两个点)拥有一个位于两者之间w分量。这将会有一种使得桌面顶部比桌面底部小的效果,就像是我们从一端看向另一端时所产生的效果一样。同时我们把所有的z分量设置为0,因为我们在z轴上并没有真正要显示的东西来获得一个透视投影的效果。
OpenGL将会自动使用w分量执行透视分割的操作,而我们现在的正交投影仅仅只是拷贝w分量而已;现在运行我们项目将会看到如下所示的效果:
现在看起来更有一种3D的感觉了,而我们做的仅仅只是加入了w分量而已;但是假如我们想让事情变得更复杂些呢,比如改变桌面的方向或者放大或者缩小呢?我们将不再直接写死w分量,而是使用矩阵为我们产生所需要的w分量。现在还原刚刚的所有修改,在下一节中我们将会学习如何使用透视投影矩阵自动产生所需要的w分量。