我正在使用 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 的坐标系。
如何确定单击了哪个对象?
看来,为了回答我的最后一个问题,我需要更好地了解我定位它的位置。
我想我已经过度设计了这个。帮助。