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的主要内容,如果未能解决你的问题,请参考以下文章