Android OpenGL ES 2.0读取z-buffer用于gluunproject /或calc raycollision与near far coords

时间:2011-12-06 12:59:01

标签: android opengl-es glu

我知道即使在stackoverflow上有很多关于这个主题/问题的东西,但我真的无法得到它。我现在在这个问题上待了几个小时。

public Vector select(float x, float y) 
{

int viewport[] = { 0, 0, width , height};

float realY = ((float) ( height) - y);
float near[] = { 0.0f, 0.0f, 0.0f, 0.0f };
float far[] = { 0.0f, 0.0f, 0.0f, 0.0f };

GLU.gluUnProject(x, realY, 0, mg.mModelView, 0, mg.mProjection , 0, viewport, 0, near, 0);
GLU.gluUnProject(x, realY, 1, mg.mModelView, 0, mg.mProjection, 0, viewport, 0, far, 0);

float xr = near[0] / near[3];
float yr = near[1] / near[3];
float zr = near[2] / near[3];

return new Vector(xr,yr,zr);
}

/**
GLU.gluLookAt( gl, me.position.x, me.position.y, me.position.z, me.position.x, 0, me.position.z+1, 0, 1, 0 );
**/

1)是否有可能用

读取z缓冲区
    glReadPixels(winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, winZ);

GL11Extension类为glReadPixels实现GL_DEPTH_COMPONENT常量还是什么? http://developer.android.com/reference/javax/microedition/khronos/opengles/GL11ExtensionPack.html#GL_DEPTH_COMPONENT

2)或者是否可以用我的glulookat位置计算z-Buffer manuel?

3)或如何计算与近处和远处位置的碰撞。

感谢您阅读:)

1 个答案:

答案 0 :(得分:4)

unProject的z部分是近视剪裁平面上的z位置/视锥体的“前”。如果您知道眼睛位置,则可以使用两个3D点来制作光线/矢量。

然后使用光线计算它通过的任何内容。在我自己的游戏中,我将光线转换为我自己的游戏坐标系,然后重新使用我已有的碰撞检测算法。 (即“子弹与hitbox相交”代码)。

如果你没有碰撞检测,计算每个模型的边界框或边界球是相当简单的,你只需要做一次(所以你可以将它作为属性添加到模型文件中) )。然后,您可以为每个模型快速传递以查找用户选择的模型,在模型位置上进行相机距离测试以找到前景中的哪个模型,或者从每个模型中获取多边形并准确计算哪个模型poly被选中

编辑:我在这里找到了一个有效的例子:enter link description here。解释是俄语,但代码对我有用

enter image description here