OpenGL使用glMultMatrixf进行矩阵变换

3

我正在尝试在不使用glTranslate()的情况下翻译一个对象。我已经在网上搜索并找到了一个函数glMultMatrixf()。我想使用这个函数来乘以我的平移矩阵,但我无法完成它。我感觉逻辑上我走在正确的道路上,但是用这种方式翻译一个对象是否可能呢?

我使用opengl和c++编写了代码。以下是代码:

#include <iostream>
#include <stdlib.h>
#include <math.h>

#ifdef __APPLE__
#include <OpenGL/OpenGL.h>
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

using namespace std;

float _angle = 0;

typedef GLfloat Matrix4x4 [4][4];
Matrix4x4 matTransl3D;

/* Construct the 4 x 4 identity matrix. */
void matrix4x4SetIdentity (Matrix4x4 matIdent4x4)
{
    GLint row, col;

    for (row = 0; row < 4; row++)
        for (col = 0; col < 4 ; col++)
            matIdent4x4 [row][col] = (row == col);
}

void translate3D (GLfloat tx, GLfloat ty, GLfloat tz)
{

    /*  Initialize translation matrix to identity.  */
    matrix4x4SetIdentity (matTransl3D);  

    matTransl3D [0][3] = tx;
    matTransl3D [1][3] = ty;
    matTransl3D [2][3] = tz;

}


void handleKeypress(unsigned char key, int x, int y) {
    switch (key) {
        case 27: //Escape key
            exit(0);
    }
}



void initRendering() 
{
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_NORMALIZE);

}

void handleResize(int w, int h) 
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0, (float)w / (float)h, 1.0, 200.0);
}

void drawScene() 
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);


    glLoadIdentity();

    translate3D(0.0f, 0.0f, -50.0f);
    glMultMatrixf(*matTransl3D);




    glBegin(GL_TRIANGLE_FAN);       // draw triangle

    glColor3f(1.0f,0.0f,0.0f);  // set color to red
    glVertex3f(  0.0f,  3.0f, 0.0f);
    glColor3f(0.0f,1.0f,0.0f);                  // set color to green
    glVertex3f(-5.0f, -5.0f, 5.0f);
    glColor3f(1.0f,1.0f,0.0f);                  // set color to yellow
    glVertex3f( 5.0f, -5.0f, 5.0f);
    glColor3f(0.0f,0.0f,1.0f);                  // set color to blue
    glVertex3f( 5.0f, -5.0f, -5.0f);
    glColor3f(1.0f,1.0f,1.0f);                  // set color to white
    glVertex3f( -5.0f, -5.0f, -5.0f);
    glColor3f(0.0f,1.0f,0.0f);                  // set color to green
    glVertex3f(-5.0f, -5.0f, 5.0f);
    glEnd();

    glBegin(GL_QUADS);     
    glColor3f(0.0f,1.0f,0.0f);                  // set color to green
    glVertex3f(-5.0f, -5.0f, 5.0f);
    glColor3f(1.0f,1.0f,1.0f);                  // set color to white
    glVertex3f( -5.0f, -5.0f, -5.0f);
    glColor3f(0.0f,0.0f,1.0f);                  // set color to blue
    glVertex3f( 5.0f, -5.0f, -5.0f);
    glColor3f(1.0f,1.0f,0.0f);                  // set color to yellow
    glVertex3f( 5.0f, -5.0f, 5.0f);
    glEnd();


    glutSwapBuffers();
}

//Called every 25 milliseconds
void update(int value) {
    _angle += 1.0f;
    if (_angle > 360) {
        _angle -= 360;
    }
    glutPostRedisplay();
    glutTimerFunc(25, update, 0);
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(400, 400);

    glutCreateWindow("Translation 3d");
    initRendering();


    glutDisplayFunc(drawScene);
    glutKeyboardFunc(handleKeypress);
    glutReshapeFunc(handleResize);
    glutTimerFunc(25, update, 0);

    glutMainLoop();
    return 0;
}
1个回答

13

OpenGL使用列主序矩阵,即索引为

0 4 8 c
1 5 9 d
2 6 a e
3 7 b f

无论你以何种顺序索引翻译矩阵

0 1 2 3
4 5 6 7
8 9 a b
c d e f

1
@Perex19:顺便提一句,如果你想节省编写所有矩阵操作的时间,我提供了一个小库 https://github.com/datenwolf/linmath.h - datenwolf
我会检查你的链接。我简直不敢相信这么容易。谢谢。 - Perex19
2
在OpenGL中,矩阵应该定义为float mat[16]而不是mat[4][4]。 - fen
1
@fen:如果你把它们放在堆栈或静态存储中,那只是品味问题。而且没有理由不把固定大小的对象放在那里。C和C++标准规定,静态和自动存储中的多维数组应紧密打包,后面的索引运行速度最快。 - datenwolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接