OpenGL glTranslate 和 glRotate

Posted

技术标签:

【中文标题】OpenGL glTranslate 和 glRotate【英文标题】:OpenGL glTranslate and glRotate 【发布时间】:2010-12-14 12:36:44 【问题描述】:

我需要一个将glTranslate() 之类的翻译应用于某个点的函数。 有人知道像glTranslate()glRotate() 这样的函数来修改和检索矩阵以进行乘法吗?

【问题讨论】:

【参考方案1】:

那里有成千上万的free matrix classes。搜索一下谷歌,然后你就可以在不使用 gl* 函数的情况下设置平移和旋转...

编辑:如果您真的只想创建矩阵而不使用更方便的矩阵类,那么您可以定义 glRotatef(angle, x, y, z) 如下:

const float cosA = cosf( angle );
const float sinA = sinf( angle );
float m[16] =  cosA + ((x * x) * (1 - cosA)), ((x * y) * (1 - cosA)) - (z * sinA), ((x * z) * (1 - cosA)) + (y * sinA), 0.0f,
                ((y * x) * (1 - cosA)) + (z * sinA), cosA + ((y * y) * (1 - cosA)), ((y * z) * (1 - cosA)) - (x * sinA), 0.0f,
                ((z * x) * (1 - cosA)) - (y * sinA), ((z * y) * (1 - cosA)) + (x * sinA), cosA + ((z * z) * (1 - cosA)), 0.0f,
                0.0f, 0.0f, 0.0f, 1.0f
               ;

取自wikipedia。

平移矩阵很容易创建:glTranslatef(x,y,z)定义如下:

float m[16] =  1.0f, 0.0f, 0.0f, 0.0f,
                0.0f, 1.0f, 0.0f, 0.0f,
                0.0f, 0.0f, 1.0f, 0.0f,
                   x,    y,    z, 1.0f
               ;

您可以很容易地查找矩阵乘法和矩阵向量乘法。

不过,为了让你的生活更简单,你可以下载一个矩阵类来为你做这一切......

【讨论】:

谢谢,但我不需要一个类来管理矩阵,只需要像上面写的2个opengl函数这样的代码 @ghiboz:更新了我的答案。但我强烈建议只使用矩阵类。 @Goz,您的矩阵缺少前导对角线 1。看我的回答。 顺便说一句-您的 M[16] 是否使用正确的约定(即,将矩阵乘以列向量)?我相信这是您展示的 DX-ish 矩阵,如果我们遵循 OpenGL 约定,它应该是它的转置。 @Kos:实际上 GL 和 DX 对它们的矩阵使用相同的浮点顺序(参见 9.005 @opengl.org/resources/faq/technical/transformations.htm)。也就是说,旋转可能仍会被调换。【参考方案2】:

Here 您可以找到有关使用矩阵进行转换的一般信息。

Here 您可以找到执行矩阵乘法(缩放、旋转或其他)的示例和完整函数。它是用目标 C 编写的,但用 c++ 重写它应该不难..

【讨论】:

以上是关于OpenGL glTranslate 和 glRotate的主要内容,如果未能解决你的问题,请参考以下文章

如何绘制一个可以在 OpenGL 中拾取物体的机械臂?

OpenGL:球体减慢帧速率

C++ Opengl - 使用聚光灯照明

在OpenGL中平移和移动相机的正确方法?

OpenGL 方向。 (从负 z 看的身份旋转)

使用 glRotatef() 时的 OpenGL 坐标问题