第一步:建立拾取射线
核心函数是GLU.gluUnProject,原型如下
static int gluUnProject(float winX, float winY, float winZ, float[] model, int modelOffset, float[] project, int projectOffset, int[] view, int viewOffset, float[] obj, int objOffset)
winZ取0得到射线近点,winZ取1得到远点。模型矩阵(model)和投影矩阵(project)比较麻烦,由于ES版本不提供获取模型和投影矩阵的方法,因此通过自行跟踪矩阵变换的方式来解决。具体实现由MatrixTrackingGL和MatrixGrabber以及MatrixStack三个类协作提供,这三个类可以在
<android SDK PATH>\samples\android-<version>\ApiDemos\src\com\example\android\apis\graphics\spritetext\
文件夹下找到。
视图矩阵是在render的onSurfaceChanged时提供的长宽构建的
@Override
public void onSurfaceChanged(GL10 gl, int width, int height){
viewPort = new int[]{
0,0,width,height}
}
最后是获取结果,obj参数被赋值为4元素数组,要用前三个除以第四个得到最终结果。下面是获取射线的代码
public class Ray {
public Ray(MatrixGrabber matrixGrabber,int[] viewPort,float xTouch, float yTouch){
float[] temp = new float[4];
float winy =(