5.4 定义正侧投影(Defining an Orthographic Projection)
我们使用包android.opengl 下面的Matrix类定义一个正侧投影,在Matrix中有一个方法orthoM()将会为我们生存一个正侧投影矩阵,在这里我们将会使用这个投影来改变坐标空间,正如我们将会看到的,一个正侧投影矩阵与平移矩阵非常像。
下面来仔细看看orthoM()的方法参数:
orthoM(float[] m, int mOffset, float left, float right, float bottom, float top, float near, float far)
float[] m | 目标矩阵数组--为了能存储正交投影矩阵这个数组的长度至少应该是16. |
int mOffset | m数组中从哪个位置开始写入生存的矩阵数据 |
float left | 最小的x坐标 |
float right | 最大的x坐标 |
float bottom | 最小的y坐标 |
float top | 最大的y坐标 |
float near | 最小的z坐标 |
float far | 最大的z坐标 |
当我们调用这个方法的时候,将会生存如下投影矩阵:
不要被矩阵里面的参数吓倒了,其实它就是一个平移矩阵。这个投影矩阵将会把位于left/right、bottom/top、near/far中的坐标映射到规范化设备坐标系中的[-1,+1],所有在这个区间中的事物将会得到显示。
最大的区别是z轴有一个负号,这将会反转z坐标。这意味着物体越远,z坐标将会越小;为什么这样呢?这个原因主要是历史及习惯。
5.4.1 左手坐标系及右手坐标系(Left-Handed and Right-Handed Coordinate Systems)
要更好的理解z轴问题,我们需要理解左手坐标系及右手坐标系;如何判断一个坐标系是哪个坐标系呢?拿出你的一只手,让大拇指指向x轴正向,食指指向y轴正向。
现在用你的中指指向z轴正向;如果你可以使用左手做到这个动作,则说明这是一个左手坐标系,如果你可以使用右手做到这个动作,则说明你使用的是右手坐标系。
如下图1是一个左手坐标系、图2是一个右手坐标系:


选择左手坐标系或者右手坐标系并不是一个关键的问题,只是一个简单的转换。虽然在早期版本的OpenGL中规范化设备坐标使用左手坐标系,但是默认的坐标系还是右手坐标系(物体越远Z轴越小),这就是为什么Android的Matrix类默认会产生一个反转的z轴坐标。
假如你想不仅仅是在规范化设备坐标系中使用左手坐标系,那你只需要不反转z轴(orthoM())就可以了。
现在我们已经对矩阵运算一个基本的概念,下一节我们将会在项目中增加正侧投影。