为了方便没有准备好梯子的同学,我把项目在CSDN上打包下载,不过更新会慢一些
在第三章我们用OpenGL画了一个没有纹理的球,现在我们需要通过纹理映射将视频贴到球上。
这个和画个矩形贴平面视频有任何的区别吗?
。。。。。。
好像没有
带纹理映射的Sphere类
直接贴代码吧,在之前的Sphere基础上,我们加入纹理映射的部分,将3D点和2D点对应起来。
PS:
有一个需要注意的问题是,当用户旋转手机时,球应该朝着反方向旋转,但是传感器的旋转矢量矩阵刚好是model矩阵的逆矩阵,所以现在刚好不需要改变纹理的顺序。
准确的说,在使用旋转矩阵之前应该求逆,而旋转矩阵的转置就是它的逆矩阵,刚巧旋转矩阵是行主序,而OpenGL的矩阵是列主序,所以刚好不用求逆(多么美好的巧合。。)
上面段话看不懂完全不影响,具体原理在第四章和下一节都有介绍
package com.martin.ads.panoramaopengltutorial;
import android.opengl.GLES20;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer;
import static com.martin.ads.panoramaopengltutorial.ShaderUtils.checkGlError;
/**
* Created by Ads on 2016/11/5.
*/
public class Sphere {
private static final int sPositionDataSize = 3;
private static final int sTextureCoordinateDataSize = 2;
private FloatBuffer mVerticesBuffer;
private FloatBuffer mTexCoordinateBuffer;
private ShortBuffer indexBuffer;
private int mNumIndices;
/**
* modified from hzqiujiadi on 16/1/8.
* original source code:
* https://github.com/shulja/viredero/blob/a7d28b21d762e8479dc10cde1aa88054497ff649/viredroid/src/main/java/org/viredero/viredroid/Sphere.java
* @param radius 半径,半径应该在远平面和近平面之间
* @param rings
* @param sectors
*/
public Sphere(float radius, int rings, int sectors) {
final float PI = (float) Math.PI;
final float PI_2 = (float) (Math.PI / 2);
float R = 1f/(float)rings;
float S = 1f/(float)sectors;
short r, s;
flo