1

在我旋转它(使用 glRotate3f)之后,我需要访问顶点对象的 X、Y 值。这怎么可能?我需要 em 来解决对象碰撞问题,其中碰撞将根据对象旋转度在与角度相关的方向上发送对象。

编辑::

好的,我已经接近找到方法了。让我们假设 X 和 Y 度数为 0、90、180、270。我将一个点设置为对象的中心,假设 X=30,Y=70,X_size 为 60,Y_size 为 140。

如果我使 new_X = X cos(angle) - Y sen(angle) 和 new_Y = X sen(angle) + Y cos(angle) 如果然后我将对象中心 X 和 Y 添加或减去 new_X 和 new_Y 我实际上得到新点,除非角度为 180,我需要使用 -new_X + X。

这是解决它的方法吗?

4

3 回答 3

1

你对事情有点误解了。

你没有通过调用 glRotatef 来旋转任何东西。当您调用 glRotate 时,您修改了变换矩阵,对象数据保持不变。当您渲染对象时,顶点数据通过顶点处理管道,乘以变换矩阵(每次渲染对象),从技术上讲,您无法获得计算结果 - 因为对象没有改变。

好吧,如果您真的想要它,您可以尝试使用 gl 反馈缓冲区(请参阅 glFeedbackBuffer),但我看不出有什么原因。我认为“OpenGL 红皮书”可能有反馈缓冲区示例,但我不确定。反馈缓冲区可能会提供您需要的功能,但我真的没有使用太多,所以我也不确定。

此外,在系统内存和视频内存之间来回移动大量数据(当您的对象存储在视频内存中时)会导致性能损失,因此即使可以,也不应该这样做。

如果要在旋转后获取对象状态,则必须手动将其相乘 - 使用对象的矩阵并将副本存储在系统内存中。由于 OpenGL 结合了对象矩阵和视图矩阵(当您调用 glRotatef 时),所以您需要单独存储旋转矩阵。

这是解决它的方法吗?

也许只有当您使用 2D 并渲染一两个三角形时。

通常,当您进行转换时,您会构建组合的旋转/平移矩阵,然后使用该矩阵将所需的数据相乘 - 这将更有效,因为它允许将多个转换组合为一个。如果您使用非图形 3D 例程(碰撞检测),您可以自己在代码中进行矩阵乘法/向量转换。

AFAIK OpenGL 不提供矩阵操作例程(类似于 D3DX 中的 D3DXMatrixMultiply),但它们很容易从头开始编写,并且可以从多个地方获取。如果你很绝望,你可以使用 D3DX 矩阵函数(D3D 矩阵具有相同的内存布局)。此外,如果您认真对待 3D,您最终将不得不学习矩阵。

于 2010-05-27T02:37:14.943 回答
0

不是直接,您可以使用 float modelview[16] 检索模型视图矩阵;glGetFloatv(GL_MODELVIEW, modelview) 并在向量和模型视图矩阵之间手动进行矩阵乘法。

GL 中没有其他方法可以做到这一点。

于 2010-05-27T02:30:21.220 回答
0

听起来你所追求的是gluProject. 您提供对象的 x、y 和 z 坐标、当前矩阵(模型视图和投影)和视口坐标,它会返回 x、y 坐标,该点将被这些矩阵映射到该坐标。如果您更愿意自己动手​​,链接的文档包括作业的公式。

于 2010-05-27T02:49:36.253 回答