在3D场景中定位对象,然后找出用户单击的内容 我在用C++构建一个跨平台的游戏,使用OpenGL ES 2。目前的目标是iPhone。我是游戏编码的新手,但不是编码的新手

在3D场景中定位对象,然后找出用户单击的内容 我在用C++构建一个跨平台的游戏,使用OpenGL ES 2。目前的目标是iPhone。我是游戏编码的新手,但不是编码的新手,iphone,c++,opengl-es,opengl-es-2.0,Iphone,C++,Opengl Es,Opengl Es 2.0,我对如何设计游戏感到困惑但具体来说,我想问的是如何设置在场景中定位模型所需的对象。 我有一个代表场景的对象。共有5个场景。一次只显示一个场景。一个场景就像一个游戏关卡。每个场景都有用于渲染、游戏逻辑、鼠标和键盘处理的所有代码。触摸屏操作就像鼠标点击一样 每个场景都有: 它是自己的投影矩阵。 它自己的“视图”矩阵(当前未使用)始终设置为标识矩阵 要渲染的模型列表 每种型号都有: 顶点列表 用于渲染自身的GLSL程序 质地 “模型”矩阵 我使用正交投影矩阵 因为我们使用的是GLE2,所以我必须手动完

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

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

每个场景都有: 它是自己的投影矩阵。 它自己的“视图”矩阵(当前未使用)始终设置为标识矩阵 要渲染的模型列表

每种型号都有: 顶点列表 用于渲染自身的GLSL程序 质地 “模型”矩阵

我使用正交投影矩阵

因为我们使用的是GLE2,所以我必须手动完成所有工作。包括矩阵。所以我不使用glPushMatrix、glPopMatrix、glTranslate等。它们不可用。相反,我有自己的函数,这些函数在我自己的矩阵对象上运行

好吧,这就是我觉得奇怪的地方

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

2) 将视图矩阵保留为标识矩阵

3) 加载每个模型

{
    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();
}
4) 每个模型的“模型”矩阵默认为单位矩阵

5) 我现在缩放每个模型,使其右侧与另一侧成比例。缩放功能调整模型的“模型”矩阵

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();
}
我觉得奇怪的是:翻译模型矩阵是否合适?

当我尝试用胶水投影鼠标/触摸屏坐标时,危险的部分出现了

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

2) 联合国计划它们

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

如何确定单击了什么对象?

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

我想我设计得太多了。帮助。

您可以:

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

二,。在屏幕外的pixmap中渲染标签图像:不使用灯光和纹理绘制,而是使用作为对象标签的平面颜色。拾取点像素,该值表示对象。必须为要检测的对象指定标签,并为所有其他对象和背景指定默认值

我希望这能有所帮助。

您可以:

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

二,。在屏幕外的pixmap中渲染标签图像:不使用灯光和纹理绘制,而是使用作为对象标签的平面颜色。拾取点像素,该值表示对象。必须为要检测的对象指定标签,并为所有其他对象和背景指定默认值


我希望这能有所帮助。

哇。这似乎需要做很多工作。有没有更简单的方法?那么模型和视图矩阵呢。我用对了吗?矩阵看起来还可以。对于clic,问题2对我来说更简单。这与正常的显示代码非常相似。使用它,您可以确定所选内容就是单击的内容。你不需要再计算了。哇。这似乎需要做很多工作。有没有更简单的方法?那么模型和视图矩阵呢。我用对了吗?矩阵看起来还可以。对于clic,问题2对我来说更简单。这与正常的显示代码非常相似。使用它,您可以确定所选内容就是单击的内容。您不需要更多的计算。感谢Apple提供的顶点数组对象和具有所有数学逻辑的GLKit。感谢Apple提供的顶点数组对象和具有所有数学逻辑的GLKit。
{
    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();
}