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

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

【问题讨论】:

    标签: c++ opengl matrix 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++ 重写它应该不难..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多