将对象定位在3D场景中,然后确定用户点击的内容

时间:2011-04-16 14:36:14

标签: iphone c++ opengl-es opengl-es-2.0

我正在使用OpenGL ES 2.0构建一个C ++的跨平台游戏。目标是iPhone。我是编码游戏的新手,但不是编码的新手。

我对如何构建游戏感到困惑。 但具体来说,我问的是如何设置在场景中定位模型所需的对象。

我有一个代表场景的对象。有5个场景。一次只显示一个场景。场景就像游戏关卡。每个场景都有渲染,游戏逻辑,鼠标和键盘处理的所有代码。触摸屏处理就像点击鼠标一样处理。

每个场景都有: 它是自己的投影矩阵。 它自己的“视图”矩阵 - 当前未使用 - 始终设置为单位矩阵 要呈现的模型列表

每个模型都有: 顶点列表 一个GLSL程序来渲染自己 纹理 一个“模型”矩阵

我使用正交投影矩阵。

由于我们使用GLES 2,我必须手动完成所有事情。包括矩阵。所以我不使用glPushMatrix,glPopMatrix,glTranslate等。它们不可用。相反,我有自己的函数,它们在我自己的Matrix对象上运行。

好的,这对我来说很奇怪。

1)设置投影矩阵(使用正交矩阵)

_math_matrix_ortho(&this->ProjectionMatrix, 0.0, 1.0, 0.0, (float)height / (float)width, -1.0f, 1.0f);

2)将视图矩阵保留为单位矩阵

3)加载每个模型

4)每个模型的“模型”矩阵默认为单位矩阵

5)我现在缩放每个模型,使它们成为彼此成比例的右侧。缩放功能调整模型的“模型”矩阵。

model->modelMatrix.Scale(0.25, 0.25, 0.25);

6)将每个模型移动到位

model->modelMatrix.Translate(2.0, 0.0, 0.0);

7)渲染每个模型

{
    glUseProgram(this->_program.program);
    GL_CHECK_ERROR();

    glVertexAttribPointer(_positionLoc, 3, GL_FLOAT, GL_FALSE, 0, _vertices );
    GL_CHECK_ERROR();

    glVertexAttribPointer(_texCoordLoc, 2, GL_FLOAT, GL_FALSE, 0, _texCoords);
    GL_CHECK_ERROR();

    glEnableVertexAttribArray(_positionLoc);
    GL_CHECK_ERROR();

    glEnableVertexAttribArray(_texCoordLoc);
    GL_CHECK_ERROR();

    glBindTexture ( GL_TEXTURE_2D, _texture->getGLID() );
    GL_CHECK_ERROR();

    glUniform1i ( _texLoc, 0 );
    GL_CHECK_ERROR();

    glUniformMatrix4fv(_pMatrixLoc, 1, GL_FALSE, SceneManager::getInstance().getCurrentScene().ProjectionMatrix.m);
    GL_CHECK_ERROR();

    glUniformMatrix4fv(_vMatrixLoc, 1, GL_FALSE, this->_vMatrix.m);
    GL_CHECK_ERROR();

    glUniformMatrix4fv(_mMatrixLoc, 1, GL_FALSE, this->_mMatrix.m);
    GL_CHECK_ERROR();

    glDrawArrays ( GL_TRIANGLE_STRIP, 0, 4);
    GL_CHECK_ERROR();
}

对我来说似乎很奇怪:翻译模型的矩阵是否合适?

当我尝试glUnProject鼠标/触摸屏坐标时,冒险部分出现了。

1)获取鼠标/触摸屏坐标

2)取消投影。

现在我有相对于View矩阵的坐标。哪个是单位矩阵。这意味着x,y坐标转换为坐标系,其中最大垂直和水平范围恰好为1.0。

如何确定点击了哪个对象?

似乎为了回答我的上一个问题,我需要更好地了解我的位置。

我想我已经过度设计了这个。帮助

1 个答案:

答案 0 :(得分:1)

你可以:

1。计算与模型的线交点,这取决于模型的复杂程度。

2。在屏幕外像素图中渲染标签图像:不使用光线和纹理绘图,而是使用作为对象标签的平面颜色。选择指向的像素,该值给出了对象。您必须为要检测的对象分配标签,并为所有其他对象和背景分配默认值。

我希望这会有所帮助。