我需要在旋转它之后访问顶点对象的X,Y值(使用glRotate3f)。这怎么可能?我需要em来解决一个物体碰撞问题,其中碰撞将根据物体旋转度以角度相关的方向发送物体。
编辑::
好的,我接近找到了办法。让我们假设X和Y以及0度,90度,180度,270度。我设置一个点作为对象的中心,假设X = 30,Y = 70,X_size为60,Y_size为140.
如果我将new_X = X cos(角度) - Y sen(角度)和new_Y = X sen(角度)+ Y cos(角度),那么我将对象中心X和Y加到或减去new_X和new_Y我实际上到了新点,除非角度为180,我需要使用-new_X + X.
这是解决问题的方法吗?
答案 0 :(得分:1)
你误解了一些事情。
你没有通过调用glRotatef来旋转任何东西。当您调用glRotate时,您修改转换矩阵,对象数据保持不变。当渲染对象时,顶点数据通过顶点处理管道,乘以变换矩阵(每次渲染对象),从技术上讲,你不能得到计算结果 - 因为对象没有被改变。
好吧,如果你真的想要它,你可以尝试使用gl反馈缓冲区(参见glFeedbackBuffer),但我没有看到原因。我认为“OpenGL红皮书”可能有反馈缓冲区示例,但我不确定。反馈缓冲区可以提供您需要的功能,但我真的没有太多使用它们,所以我也不确定它。
此外,在系统内存和视频内存之间往返移动大量数据(当您的对象存储在视频内存中时)会导致性能下降,因此即使可以,也不应该这样做。
如果要在旋转后获得对象状态,则必须手动将其相乘 - 使用对象的矩阵并将副本存储在系统内存中。由于OpenGL将对象矩阵与视图矩阵相结合(当您调用glRotatef时),因此您需要单独存储旋转矩阵。
这是解决问题的方法吗?
也许只有你正在使用2D,并渲染一个或两个三角形。
通常,在进行转换时,可以构建组合旋转/平移矩阵,然后使用该矩阵将所需数据相乘 - 这将更有效,因为它允许将多个转换合并为一个。如果您使用非图形3D例程(碰撞检测),您可以自己在代码中进行矩阵乘法/向量转换。
AFAIK OpenGL不提供矩阵操作例程(类似于D3DX中的D3DXMatrixMultiply),但它们易于从头开始编写,并且可以从多个位置获取。如果您绝望(D3D矩阵具有相同的内存布局),您可以使用D3DX矩阵函数。此外,如果你真的想要使用3D,你最终还是要学习矩阵。
答案 1 :(得分:0)
不直接,您可以使用float modelview [16]检索模型视图矩阵; glGetFloatv(GL_MODELVIEW,modelview)并在矢量和模型视图矩阵之间手动进行矩阵乘法。
GL中没有其他方法可以做到。
答案 2 :(得分:0)
听起来就像你所追求的那样gluProject
。您提供对象的x,y和z坐标,当前矩阵(模型视图和投影)以及视口坐标,它会返回这些矩阵将由这些矩阵映射到的x,y坐标。如果您愿意自己完成,链接的文档包括作业的公式。