如何在 opengl 中创建翻译功能?

问题描述 投票:0回答:0

这里是一个代码,它只是在 X、Y、Z 上构建一个金字塔,具有规模、旋转能力,我不会尝试进行平移转换,但它甚至没有显示金字塔的相同内容。 我的老师让我不要使用 gltranslatef(X,Z,Y) 方法!

我的尝试在这里只是我想要的翻译功能:

// Translate,rotation,scale a pyramid

#include <GL/glut.h>
#include <cmath>

double X = -180, Y = 0 ;
double ANGLEY = 0, ANGLEZ = 0;

struct point3D { double x, y, z; };

struct matrix3x3
{
    double  a, b, c,
            d, e, f,
            g, h, i;
};

point3D C[5];


void set_identity_matrix(matrix3x3 &m)
{
    m.a = 1; m.b = 0; m.c = 0;
    m.d = 0; m.e = 1; m.f = 0;
    m.g = 0; m.h = 0; m.i = 1;
}

void mult(matrix3x3 m, point3D &p)
{
    point3D temp;
    temp.x = m.a * p.x + m.b * p.y + m.c * p.z;
    temp.y = m.d * p.x + m.e * p.y + m.f * p.z;
    temp.z = m.g * p.x + m.h * p.y + m.i * p.z;
    p = temp;
}

void rotateY(point3D &p, double degrees)
{
    matrix3x3 temp;
    set_identity_matrix(temp);
    double sinTheta = sin(degrees * M_PI / 180);
    double cosTheta = cos(degrees * M_PI / 180);
    temp.a = cosTheta;
    temp.c = sinTheta;
    temp.g = -sinTheta;
    temp.i = cosTheta;
    mult(temp, p);
}

void rotateZ(point3D &p, double degrees)
{
    matrix3x3 temp;
    set_identity_matrix(temp);
    double sinTheta = sin(degrees * M_PI / 180);
    double cosTheta = cos(degrees * M_PI / 180);
    temp.a = cosTheta;
    temp.b = -sinTheta;
    temp.d = sinTheta;
    temp.e = cosTheta;
    mult(temp, p);
}


void draw_line(double x1, double y1, double x2, double y2)
{
    glBegin(GL_LINES);
    glVertex2d(x1, y1);
    glVertex2d(x2, y2);
    glEnd();
}

void setup_pyramid()
{
    C[0].x = -0.5; C[0].y = -0.5; C[0].z = -0.5;
    C[1].x = -0.5; C[1].y = -0.5; C[1].z = 0.5;
    C[2].x = 0.5;  C[2].y = -0.5; C[2].z = 0.5;
    C[3].x = 0.5;  C[3].y = -0.5; C[3].z = -0.5;
    C[4].x = 0.0;  C[4].y = 0.5;  C[4].z = 0.0;

}

void scale_pyramid(double s)  
{
    int i;

    for( i = 0; i < 5; i++ )
    {
        C[i].x *= s;
        C[i].y *= s;
        C[i].z *= s;
    }
}

void draw_pyramid()
{
    int i;

    for( i = 0; i < 4; i++ )
    {   
        draw_line(C[i].x, C[i].y, C[(i + 1) % 4].x, C[(i + 1) % 4]. y);   
        draw_line(C[i].x, C[i].y, C[4].x, C[4]. y);    
    }
      
}

void draw_axes()  
{
    glPushAttrib(GL_ALL_ATTRIB_BITS);
    glColor3ub(0, 0, 0);
    glBegin(GL_LINES);
    glVertex2d(-240, 0);
    glVertex2d( 240, 0);
    glVertex2d(0, -180);
    glVertex2d(0, 180);
    glEnd();
    glPopAttrib();
}

// here is my problem ?

void translate_pyramid(int X,int Y, int Z)
{

     while( 1 )
     {
      X=X+1;
      Y=0;
      Z=0;

     }

}


void display()
{
   int i;
   
    
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    draw_axes();
    
    
    translate_pyramid( X, Y, 0);
    
    for( i = 0; i < 5; i++ )
       rotateZ(C[i], -ANGLEZ);
         
    for( i = 0; i < 5; i++ )
       rotateY(C[i], -ANGLEY);
   
    glColor3ub(0, 0, 255);
      draw_pyramid();
    
    for( i = 0; i < 5; i++ )
       rotateY(C[i], ANGLEY);
        
    for( i = 0; i < 5; i++ )
       rotateZ(C[i], ANGLEZ);
        
    translate_pyramid( -X, Y, 0);
   
   //  X +=1;
    ANGLEY += 1;
    ANGLEZ += 1;

    glFlush();
}

void timer(int value)
{
    display();
    glutTimerFunc(1000.0 / 90.0, timer, 0);
}


int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(640, 480);
    glutInitWindowPosition(100, 100);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutCreateWindow("OpenGL Lab");
    gluOrtho2D(-240, 240, -180, 180);
    glutDisplayFunc(display);
    timer(0);
    setup_pyramid();
    scale_pyramid(100);
    glutMainLoop();
    return 0;
}
c opengl transformation translate
© www.soinside.com 2019 - 2024. All rights reserved.