xzy,到xyz方向转换

时间:2014-04-10 04:14:43

标签: c++ opengl

我有一些代码,但矩阵方向不符合我的目的,有人可以教我如何转换它的方向,它目前设置为XZY,但我想它反映XYZ,有人可以请高亮必须做什么?

当我做vertex3f(100,100,10);例如,10值应反映我网格上的Z值。

这是我的代码:

#include <stdlib.h> 
#include <math.h>
#include <stdio.h> 
#include <Windows.h>
#include <glut.h>
#include <iostream>

using namespace std;

const float sensitivity = 0.005;
const float walk_speed = 0.5;

float cam_pos[3] = { 100.5, 10.0f, 50 };
float cam_view[3] = { -1.0f, 0.0f, 1.0f };

static int old_x, old_y, half_width, half_height;

int width = 1024, height = 768;

void updateKeys()
{
    if (GetAsyncKeyState('W')){
        cam_pos[0] += cam_view[0] * walk_speed;
        cam_pos[1] += cam_view[1] * walk_speed;
        cam_pos[2] += cam_view[2] * walk_speed;
    }
    if (GetAsyncKeyState('S')){
        cam_pos[0] -= cam_view[0] * walk_speed;
        cam_pos[1] -= cam_view[1] * walk_speed;
        cam_pos[2] -= cam_view[2] * walk_speed;
    }
    if (GetAsyncKeyState('A')){
        cam_pos[0] += cam_view[2] * walk_speed;

        cam_pos[2] -= cam_view[0] * walk_speed;
    }
    if (GetAsyncKeyState('D')){
        cam_pos[0] -= cam_view[2] * walk_speed;

        cam_pos[2] += cam_view[0] * walk_speed;
    }

    if (GetAsyncKeyState(VK_SPACE)){
        cam_pos[1] += walk_speed;
    }
}


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

    //3d camera
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    gluLookAt(
        cam_pos[0], cam_pos[1], cam_pos[2],
        cam_pos[0] + cam_view[0], cam_pos[1] + cam_view[1], cam_pos[2] + cam_view[2],
        0.0f, 1.0f, 0.0f);

    //render grid 
    glBegin(GL_LINES);
    for (int i = 0; i <= 100; i++) {
        if (i == 0) { glColor3f(.6, .3, .3); }
        else { glColor3f(.25, .25, .25); };
        glVertex3f(i, 0, 0);
        glVertex3f(i, 0, 100);
        if (i == 0) { glColor3f(.3, .3, .6); }
        else { glColor3f(.25, .25, .25); };
        glVertex3f(0, 0, i);
        glVertex3f(100, 0, i);
    };
    glEnd();

    glEnable(GL_POINT_SMOOTH);
    glPointSize(50.0f);
    glColor3f(1, 0, 0);
    glBegin(GL_POINTS);
    glVertex3f(0, 0, 0);


    //X, Z, Y
    glVertex3f(10, -10, 10);
    glEnd();

    updateKeys();
    glutSwapBuffers(); 
}

void normalize(float *v)
{
    float magnitude = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
    v[0] /= magnitude;
    v[1] /= magnitude;
    v[2] /= magnitude;
}

void rotate_view(float *view, float angle, float x, float y, float z)
{
    float new_x;
    float new_y;
    float new_z;

    float c = cos(angle);
    float s = sin(angle);

    new_x = (x*x*(1 - c) + c)       * view[0];
    new_x += (x*y*(1 - c) - z*s)    * view[1];
    new_x += (x*z*(1 - c) + y*s)    * view[2];

    new_y = (y*x*(1 - c) + z*s)     * view[0];
    new_y += (y*y*(1 - c) + c)      * view[1];
    new_y += (y*z*(1 - c) - x*s)    * view[2];

    new_z = (x*z*(1 - c) - y*s)     * view[0];
    new_z += (y*z*(1 - c) + x*s)    * view[1];
    new_z += (z*z*(1 - c) + c)      * view[2];

    view[0] = new_x;
    view[1] = new_y;
    view[2] = new_z;

    normalize(view);
}

void motion(int x, int y)
{
    float rot_x, rot_y;
    float rot_axis[3];

    x -= half_width;
    y -= half_height;

    rot_x = -(float)(x - old_x) * sensitivity;
    rot_y = -(float)(y - old_y) * sensitivity;

    old_x = x;
    old_y = y;

    rotate_view(cam_view, rot_x, 0.0f, 1.0f, 0.0f);

    rot_axis[0] = -cam_view[2];
    rot_axis[1] = 0.0f;
    rot_axis[2] = cam_view[0];

    normalize(rot_axis);

    rotate_view(cam_view, rot_y, rot_axis[0], rot_axis[1], rot_axis[2]);
}

void mouse(int button, int state, int x, int y)
{
    old_x = x - half_width;
    old_y = y - half_height;

    glutPostRedisplay();
}

void idle()
{
    glutPostRedisplay();
}

void keys(unsigned char c, int x, int y)
{
    glutPostRedisplay();


    cout << "camera view: :" << cam_view[0] << "," << cam_view[1] << "," << cam_view[2] << endl;
}

void reshape(int w, int h)
{
    width = w;
    height = h;

    half_height = w / 2;
    half_width = h / 2;

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0, (double)w / (double)h, 1.0, 10000.0);

    glViewport(0, 0, w, h);
}


//----------------------------------------------------------------------
// Main program  
//----------------------------------------------------------------------
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(width, height);
    glutCreateWindow("OpenGL");

    glutDisplayFunc(renderScene); 
    glutKeyboardFunc(keys);
    glutReshapeFunc(reshape);
    glutMouseFunc(mouse);
    glutMotionFunc(motion); 
    glutIdleFunc(idle);


    // OpenGL init
    glEnable(GL_DEPTH_TEST);

    // enter GLUT event processing cycle
    glutMainLoop();

    return 0; // this is just to keep the compiler happy
}

1 个答案:

答案 0 :(得分:1)

使用转换矩阵&#34;重新映射&#34;价值。您可以像往常一样在模型视图上推送该矩阵。

单位矩阵是:

(1, 0, 0; 0, 1, 0; 0, 0, 1)

你的矩阵将是:

(1, 0, 0; 0, 0, 1; 0, 1, 0)

我想你可以发现差异。您可以相应地扩展到4D矩阵以获得齐次坐标。