Part I 空气曲棍球 Chapter6(6.6 Creating a Projection Matrix in Our Code)

6.6 创建一个投影矩阵(Creating a Projection Matrix in Our Code)

    现在准备在我们的项目中加入透视投影,Android的Matrix类中的方法frustumM()及perpectiveM()可以实现这一点;不幸的是frustumM()有一一个bug影响某些类型的投影,perspectiveM()仅仅在Android版本代号为Ice Cream Sandwich的版本之后才引入,所以在老版本中并不能使用这个方法;
我们可以仅仅兼容到Ice Cream Sandwich,但是老版本的Android设备将得不到支持。
    在这里,我们将会实现前一节中提到的矩阵;打开我们在这一章节开头创建的项目并且在包com.airhockey.android.util中添加类MatrixHelper,
我们将会实现一个与Android矩阵Matrix中的perspectiveM()类似的方法。

6.6.1 创建自己的perspectiveM方法(Creating Our Own perspectiveM)

    在MatrixHelper中添加如下签名的函数:
    

//AirHockey3D/src/com/airhockey/android/util/MatrixHelper.java
public static void perspectiveM(float[] m, float yFovInDegrees, float aspect,
float n, float f) {
}

6.6.2 计算焦距(Calculating the Focal Length)

    我们首先要做的是基于y轴的视角计算焦距,在刚刚添加的函数中添加如下代码:
    

//AirHockey3D/src/com/airhockey/android/util/MatrixHelper.java
final float angleInRadians = (float) (yFovInDegrees * Math.PI / 180.0);
final float a = (float) (1.0 / Math.tan(angleInRadians / 2.0));

    我们这里使用java的Math类计算角度的正切值,由于Math类的函数接受的是弧度值,因此需要把角度值转换成弧度值;然后按照前一节中描述方法计算焦距。

6.6.3 实现相应的矩阵(Writing Out the Matrix)

    现在我们可以计算矩阵的值了,最后在刚刚的方法中添加如下代码:    

//AirHockey3D/src/com/airhockey/android/util/MatrixHelper.java
m[0] = a / aspect;
m[1] = 0f;
m[2] = 0f;
m[3] = 0f;
m[4] = 0f;
m[5] = a;
m[6] = 0f;
m[7] = 0f;
m[8] = 0f;
m[9] = 0f;
m[10] = -((f + n) / (f - n));
m[11] = -1f;
m[12] = 0f;
m[13] = 0f;
m[14] = -((2f * f * n) / (f - n));
m[15] = 0f;

    上面这段代码把相应值写入至少有16个元素的float类型参数矩阵m中;OpenGL中存储矩阵是以列为优先的,这意味着每次是一列一列的写入而不是一行行的写入;前面四个值对应到第一列,第二组的4值对应到第二列等等。
    现在已经完成了方法perspectiveM()的编写,接下来准备在项目中使用这个方法;这个方法与Android源码中的方法非常相似,只是为了可读性加入了一点点改动。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值