粒子效果 触屏点击设置位置

来源:互联网 发布:数据备份自动还原 编辑:程序博客网 时间:2024/06/03 09:17
物体显示大小与投影方式有关;
2D坐标转换在屏幕上点击效果与物体深度有关 。 
有关OpenGl 射线拾取 
屏幕 2D 坐标 转换 OpenGL世界3D坐标
屏幕 使用的笛卡尔(直角坐标系)是坐标系 以 屏幕左上角 为起点(0,0)
OpenGl视口坐标 原点处于左下角
OpenGLX = ScreenX;
OpenGLY = ViewportHeight – ScreenY;


/**
* 获得模型在OpenGL 世界中坐标x,y,z
*/
GLU.gluUnProject(winX, winY, winZ, model, modelOffset, project, projectOffset, view, viewOffset, obj, objOffset)
//设置 屏幕2D坐标 转换 OpenGL世界3D坐标
public float[] setXY(GL10 gl) {
  float[] ret = new float[4]; //OpenGL坐标 数组
  if (gl != null) {
   OpenGLX = PraticleX; //视口坐标 屏幕坐标换算 X
   OpenGLY = getWidthHeiht()[0]- PraticleY;//视口坐标 屏幕坐标换算 Y
   //获取 模型矩阵 投影矩阵
   int[] bits = new int[16];
   float[] model = new float[16];//模型矩阵
   float[] proj = new float[16];//投影矩阵
   gl.glGetIntegerv(GL11.GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES,
     bits, 0);
   for (int i = 0; i < bits.length; i++) {
    model = Float.intBitsToFloat(bits);
   }
   // GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES
   gl.glGetIntegerv(GL11.GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES,
     bits, 0);
   for (int i = 0; i < bits.length; i++) {
    proj = Float.intBitsToFloat(bits);
   }
   //根据 视图坐标 模型矩阵 投影矩阵  获取OpenGL世界3维坐标
   // new int[] { 0, 0, getWidth(), getHeight() } 视图窗口大小
   GLU.gluUnProject((float) OpenGLX, (float) OpenGLY, 0, model, 0,
     proj, 0, new int[] { 0, 0, getWidth(), getHeight() }, 0,
     ret, 0);
  }
  return ret;
}

添加 投影设置 之前必须调用 
  glMAtrixMocle();
  glLoadIdentity();
OpenGL 两种投影方式
正射投影 , 又叫平行投影 视景体是一个矩形的平行管道 不论物体距离相机多远, 投影后的物体大小尺寸都是不变的
void glOrtho();
void glOrtho2D(); 一个特殊的正射投影 是用于把二维图像投影到二维屏幕上
透视投影 , 即离视点越远物体越小 离视点越近物体越大 元到极致即为消失 成为光点
void glFrustum();
void gluPerspective();
0 0