我正在使用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。
如何确定点击了哪个对象?
似乎为了回答我的上一个问题,我需要更好地了解我的位置。
我想我已经过度设计了这个。帮助
答案 0 :(得分:1)
你可以:
1。计算与模型的线交点,这取决于模型的复杂程度。
2。在屏幕外像素图中渲染标签图像:不使用光线和纹理绘图,而是使用作为对象标签的平面颜色。选择指向的像素,该值给出了对象。您必须为要检测的对象分配标签,并为所有其他对象和背景分配默认值。
我希望这会有所帮助。