1

我正在使用 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)取消投影它们。

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

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

看来,为了回答我的最后一个问题,我需要更好地了解我定位它的位置。

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

4

1 回答 1

1

您可以:

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

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

我希望这有帮助。

于 2011-04-16T16:48:14.270 回答