1

我知道即使在 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 手动?

3)或者如何计算近远位置的碰撞。

感谢您阅读:)

4

1 回答 1

4

unProject 的 z 部分是近剪裁平面上的 z 位置/视锥体的“前”。如果您知道眼睛的位置,您就有两个 3D 点,您可以从中生成光线/矢量。

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

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

编辑:我在这里找到了一个工作示例:在此处输入链接描述。解释是俄语的,但代码对我有用

在此处输入图像描述

于 2011-12-06T16:38:56.110 回答