Android Training - 使用OpenGL ES(4) - 应用投影和摄像视图

投影和摄像视图让你展示绘制对象更加接近现实中眼中看到的物理对象。这种模拟物理视图使用数学转换绘制对象的坐标来完成:
  • 投影 - 基于GLSurfaceView的宽高来调整绘制对象的坐标。如果没有这个计算,对象在不对等的视图中会出现倾斜。一个投影转换通常在视图比例被创建或者通过onSurfaceChanged()修改比例时才会被计算。
  • 摄像视图 - 基于一个虚拟的摄像点来调整视图的坐标。需要注意的是,OpenGL ES没有定义一个真实的摄像对象,只是提供一些方法来模拟一个摄像头。一个摄像视图仅仅是当你创建GLSurfaceView时被计算一次,或者基于用户活动动态改变。
定义一个投影

用于投影转换的数据在onSurfaceChanged()方法中被计算:
@Override
public void onSurfaceChanged(GL10 unused, int width, int height) {
    GLES20.glViewport(0, 0, width, height);

    float ratio = (float) width / height;

    // this projection matrix is applied to object coordinates
    // in the onDrawFrame() method
    Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
}
定义一个摄像视图

完成转换绘制对象的过程中,需要添加一个摄像视图到绘制过程中。下面的例子中,使用Matrix.setLookAtM()来计算摄像视图转换,然后组合到先前投影矩阵中。合并后的转换矩阵被传递到绘制形状。
@Override
public void onDrawFrame(GL10 unused) {
    ...

    // Set the camera position (View matrix)
    Matrix.setLookAtM(mVMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

    // Calculate the projection and view transformation
    Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);

    // Draw shape
    mTriangle.draw(mMVPMatrix);
}
应用投影和摄像转换

修改先前的draw()方法:
public void draw(float[] mvpMatrix) { // pass in the calculated transformation matrix
    ...

    // get handle to shape's transformation matrix
    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");

    // Apply the projection and view transformation
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);

    // Draw the triangle
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
    ...
}
运行后的效果如图:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值