Lab 9 - Bases de la programmation 3D

1. But de l'expérience

1. Familier avec la programmation de base en 3D
2. Familier avec le réglage et l'utilisation de la fonction d'observation du point de vue
3. Familier avec le réglage et l'utilisation de la fonction de transformation de projection
4. Familier avec le dessin des primitives 3D de base

2. Contenu expérimental

1. Lisez le programme d'objet 3D suivant et comprenez la signification de certaines nouvelles fonctions de dessin et fonctions de transformation de projection en combinaison avec le contenu de ce livre : 3D Cube.cpp (voir le programme de référence plus tard) est un cube 3D rotatif sous projection orthogonale , appuyez sur la souris La rotation dans différentes directions peut être obtenue, voir l'image expérimentale 9-1 pour le diagramme d'effet et analyser le code de programmation 3D et la structure du programme.
La figure 9-1
insérez la description de l'image ici
doit enregistrer différents rendus et modifier les paramètres correspondants pour les opérations suivantes :
1) Laisser le cube stationnaire tourner autour de l'axe Z en continu.
gluLookAt(0, 0, 3, 0, 0, 0, 0, 1, 0);//fonction de réglage du point de vue
insérez la description de l'image ici
2) Modifiez différents points de vue, gardez le point cible inchangé et observez l'effet d'affichage.
gluLookAt(3, 0, 0, 0, 0, 0, 0, 1, 0);//fonction de réglage du point de vue
insérez la description de l'image ici
3) Modifiez le point cible, maintenez le point de vue fixe et observez l'effet d'affichage.
gluLookAt(3, 3, 3, 0, 3, 0, 0, 1, 0);//fonction de réglage du point de vue
insérez la description de l'image ici
4) modifier le point de vue et le point cible en même temps, et regarder l'effet d'affichage.
gluLookAt(5, 0, 0, 3, 0, 0, 0, 1, 0); // Fonction de réglage du point de vue
insérez la description de l'image ici
5) Le point de vue et le point cible restent inchangés, modifiez la taille du volume d'observation et observez l'effet d'affichage .
gluPerspective(50, w / h, 10, 60); //Définissez la taille du volume de visualisation de la projection en perspective
insérez la description de l'image ici
6) Changez le volume de visualisation de la projection orthogonale en un volume de visualisation de la projection en perspective et définissez sa taille pour observer l'effet d'affichage.
gluPerspective (120, w / h, 10, 30);
insérez la description de l'image ici
La luminosité de la projection orthographique est plus sombre que celle de la projection en perspective et les détails manquent.
7) Remplacez le cube par une théière et regardez l'affichage.
Code de base :

void displaytadpot(void)  
{
    
      
    // 设置背景为白色  
    glClearColor(1.0, 1.0, 1.0, 1.0);  
    glClear(GL_COLOR_BUFFER_BIT);  
    glColor3f(1.0, 0.0, 0.0); //画笔红色  
    glLoadIdentity();  //加载单位矩阵    
    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);  
    glRotatef(angle, 0.0f, 1.0f, 0.0f);  
    glRotatef(0.0, 1.0, 0.0, 0.0);  
    glRotatef(0.0, 0.0, 1.0, 0.0);  
    glRotatef(0.0, 0.0, 0.0, 1.0);  
    glutWireTeapot(1.5);  
    //rote += roate;  
    //glRotatef(angle, 0.0, 1.0, 0.0);  
    //angle += 1.0f;  
    glEnd();  
    glutSwapBuffers();  
}  

insérez la description de l'image ici
8) Remplacez le cube par un anneau et regardez l'affichage.
Code de base :

//画圆环:  
void display()  
{
    
      
    // 设置背景为白色  
    glClearColor(1.0, 1.0, 1.0, 1.0);  
    glClear(GL_COLOR_BUFFER_BIT);  
    glColor3f(1.0, 0.0, 0.0); //画笔红色  
    glLoadIdentity();  //加载单位矩阵    
    //视角  
    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);  
    glRotatef(angle, 0.0f, 1.0f, 0.0f);  
    glRotatef(0.0, 1.0, 0.0, 0.0);  
    glRotatef(0.0, 0.0, 1.0, 0.0);  
    glRotatef(0.0, 0.0, 0.0, 1.0);  
    glutWireTorus(0.2, 1.5, 20, 40);  
    glEnd();  
    glutSwapBuffers();  
}  

insérez la description de l'image ici
2. Concevez et dessinez le programme de modélisation de la théière et de l'anneau Teapot Torus.cp Ajoutez un anneau parallèle à côté de la théière, et la théière et l'anneau continueront de tourner autour de l'axe central pour observer l'effet d'affichage.
Code de base :

void displayTeapot_Torus()  
{
    
      
    // 设置背景为白色  
    glClearColor(1.0, 1.0, 1.0, 1.0);  
    glClear(GL_COLOR_BUFFER_BIT);  
    glColor3f(1.0, 0.0, 0.0); //画笔红色  
    glLoadIdentity();  //加载单位矩阵    
    //视角  
    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);  
    glRotatef(angle, 0.0f, 1.0f, 0.0f);  
    glRotatef(0.0, 1.0, 0.0, 0.0);  
    glRotatef(0.0, 0.0, 1.0, 0.0);  
    glRotatef(0.0, 0.0, 0.0, 1.0);  
    glutWireTorus(0.2, 1.5, 20, 40);  
    glRotatef(90, 1, 0, 0);//旋转  
    glTranslatef(0, 0.9, 0);//平移  
    glutWireTeapot(1);  
    glEnd();  
    glutSwapBuffers();  
} 

insérez la description de l'image ici
3. Écrivez ou réécrivez le programme pour construire votre propre modélisation de scène d'objets 3D.
Code de base :

void displayTeapot_Torus()  
{
    
      
    // 设置背景为白色  
    glClearColor(1.0, 1.0, 1.0, 1.0);  
    glClear(GL_COLOR_BUFFER_BIT);  
    glColor3f(1.0, 0.0, 0.0); //画笔红色  
    glLoadIdentity();  //加载单位矩阵    
    //视角  
    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);  
    glRotatef(angle, 0.0f, 1.0f, 0.0f);  
    glRotatef(0.0, 1.0, 0.0, 0.0);  
    glRotatef(0.0, 0.0, 1.0, 0.0);  
    glRotatef(0.0, 0.0, 0.0, 1.0);  
    glutWireTorus(0.2, 1.5, 20, 40);  
    glRotatef(90, 1, 0, 0);//旋转  
    glTranslatef(0, 0.9, 0);//平移  
    glutWireTeapot(1);
	glColor3f(0.0, 0.0, 1.0);
	glRotatef(angle, 0.0f, 1.0f, 0.0f);  
    glRotatef(0.0, 1.0, 0.0, 0.0);  
    glRotatef(0.0, 0.0, 1.0, 0.0);  
    glRotatef(0.0, 0.0, 0.0, 1.0);  
    glutWireTorus(0.2, 1.5, 20, 40); 
    glEnd();  
    glutSwapBuffers();  
}  

insérez la description de l'image ici

3. Référence de fonction

1. Fonction de réglage du point de vue :

void gluLookAt(GLdouble eyex, GLdouble eyey,GLdouble eyezz GLdouble atx,GLdouble aty,GLdouble atz,GLdouble upx,GLdouble upy,GLdouble upz)

2. Fonction de réglage de transformation de projection orthogonale :

void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far)

3. Fonction de réglage de la transformation de la projection en perspective :

void gluPerspective(GLdouble fov, GLdouble aspect, GLdouble near,GLdouble far)

4. Fonction de dessin graphique de base en trois dimensions :
1) Fonction de dessin de cube :

void glutWireCube(GLdouble size) //线框模式
void glutSolidCube(GLdouble size)//实体模式

Fonction : Dessiner un cube filaire ou solide dont la longueur des côtés est la taille et le centre du cube est à l'origine.
2) Fonction de dessin à billes :


void glutWireSphere(GLdouble Radius, Glint slices,Glint stacks) ;//线框模式
void glutSolidSphere(GLdouble Radius, Glint slices,Glint stacks);//实体模式

Fonction : dessinez une structure filaire ou une boule solide avec un rayon de rayon, le point central de la boule est à l'origine, les tranches sont le nombre de longitudes de la boule et les piles sont le nombre de latitudes de la boule.
gluSphere(GLUquadricObj *obj, GLdouble radius, GLint slices, GLint stacks);
l'utilisation est la suivante :

GLUquadricObj *sphere;//定义二次曲面对象
sphere = gluNewQuadric();//生成二次曲面对象
gluSphere(Sphere,8,50,50);//半径为8,球心在原点,经线和纬线数目为50的小球

3) Fonction de dessin de théière :

void glutWireTeapot(GLdouble size);//线框模式
void glutSolidTeapot(GLdouble size);//实体模式

Fonction : Dessiner une théière filaire ou solide avec un rayon de taille, le centre de la théière est à l'origine.
Description du paramètre : la taille du paramètre est le rayon approximatif de la théière, et une sphère dont la taille correspond au rayon peut contenir complètement la théière.
4) Fonction de dessin en anneau :

void glutWireTorus(GLdouble innerRadius, GLdouble outerRadius,Glint slices,Glint 	stacks) ;	//线框模式
void glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius,Glint slices,Glint 	stacks) ;	//实体模式

Fonction : dessinez un filaire ou un tore solide avec un rayon de taille, le centre du tore est à l'origine et les diamètres intérieur et extérieur du tore sont spécifiés par les paramètres innerRadius et outerRadius.
Description du paramètre : innerRadius est le diamètre intérieur du tore ; outerRadius est le diamètre extérieur du tore ; slices est le nombre de méridiens du tore ; stacks est le nombre de latitudes du tore.
5) Fonction de dessin d'octaèdre :

void glutWireOctahedron (void) ;	// 线框模式
void glutSolidOctahedron (void);	//实体模式

Fonction : Dessiner un filaire ou un octaèdre solide dont le centre est à l'origine et dont le rayon est 1.
6) Fonction de dessin dodécaèdre :

void glutWireDodehedron (void) ;	// 线框模式
void glutSolidDodehedron (void);	//实体模式

Fonction : Dessiner un filaire ou un dodécaèdre solide dont le centre est à l'origine et dont le rayon est la racine carrée de 3.
7) Fonction de dessin d'icosaèdre :

void glutWirelcosahedron (void);	//线框模式
void glutSolidlcosahedron (void);	//实体模式

Fonction : Dessiner un filaire ou un icosaèdre solide dont le centre est à l'origine et dont le rayon est 1.
8) Fonction de dessin de tétraèdre régulier :

void glutWireTetrahedron (void);	//线框模式
void glutSolidTetrahedron (void);	//实体模式

Fonction : Dessiner un filaire ou un tétraèdre régulier solide dont le centre est à l'origine et dont le rayon est la racine carrée de 3.
9) Fonction de plan de détourage :
void glClipPlane(GLenum plane, const GLdouble *equation)
définit un plan de détourage supplémentaire. plan désigne le nom du plan de détourage supplémentaire à définir, la valeur est GL_CLIP_ PLANEi, i=0 ~ 5 ; equation désigne l'équation du plan Ax+By+Cz+D=0 composée de 4 coefficients knife, B, C , O Array pour définir un plan de détourage. Pour appeler cette fonction, activez d'abord glEnable(GL_CLIP_PLANEi) et utilisez glDisable(GL_CLIP_PLANEi) pour fermer un certain plan de découpage si nécessaire.
5. Fonction de transformation graphique :
1) glTranslatef(xz y,z)
2) gLRotatef(Q,x, y, z)
3) glScalef(x,y,z)
6.void glPushMatrix (void) function
7.void glPopMatrix ( void) function
8.void glutIdleFunc( (*f) (void)) 〃Register idle response function
9.void myidle () //idle response callback function
{ //ce que le système fera quand le temps sera libre }

4. Questions de réflexion

1. Quelle est la différence entre les résultats affichés après modification du point cible et du point de vue ?
Réponse : La modification du point cible modifiera la position relative de l'objet dans le cadre du programme et l'angle de vue sera différent lors de la modification du point de vue.
2. Le point de vue et le point cible restent inchangés, et la taille du volume d'observation est modifiée Quelle est la règle des résultats affichés ?
Réponse : Lorsque le champ de vision devient plus grand, l'objet devient plus petit à la place.
3. En quoi la projection orthographique diffère-t-elle de la projection en perspective ?
Réponse : Dans la projection orthogonale, les graphiques sont transformés sur la surface de projection le long de lignes parallèles ; pour la projection en perspective, les graphiques sont transformés sur la surface de projection le long d'une ligne droite qui converge vers un certain point. Ce point est appelé le centre de projection, qui équivaut au point d'observation, également appelé point de vue.
  La différence entre la projection orthogonale et la projection en perspective est que la distance entre le centre de projection de la projection en perspective et la surface de projection est limitée, tandis que la distance entre le centre de projection de la projection orthogonale et la surface de projection est infinie.
  Lorsque le centre de projection est à l'infini, les lignes de projection sont parallèles les unes aux autres, donc lors de la définition de la projection orthogonale, il suffit de donner la direction de la ligne de projection, et lors de la définition de la projection en perspective, il est nécessaire de spécifier le spécifique position du centre de projection
  Invariant à l'échelle, qui est la méthode de production de dessins à l'échelle en dessin 3D. Des vues précises de tous les côtés d'un objet peuvent être obtenues par projection parallèle.
Les projections en perspective, en revanche, ne conservent pas d'échelle relative, mais sont capables de produire des vues photoréalistes. Pour des objets de même taille, l'image projetée d'un objet plus éloigné de la surface de projection est plus petite que celle d'un objet plus proche de la surface de projection, ce qui a pour effet que la distance est grande et la distance est petite.

5. Points supplémentaires après le cours

Comment écrire un programme pour visualiser les modèles d'objets sous différents angles ? Par exemple, appuyez sur la touche « A », le point de vue s'éloigne de plus en plus ; appuyez sur la touche « S » et le point de vue se rapproche ? Comment basculer entre la vue de dessus, la vue de côté ou la vue de face ?
Réponse : Définissez le point de vue en tant que variable et appuyez sur la touche correspondante pour le modifier. Basculez entre la vue de dessus, la vue de côté ou la vue de face et réglez la touche pour basculer le point de vue dans la direction correspondante.

6. Procédure finale

#include "stdafx.h"
#include "Shiyan9-1.h"
#define MAX_LOADSTRING 100
#define GLUT_DISABLE_ATEXIT_HACK
#include <windows.h>
#include <gl/glut.h>
#include <math.h>
#include<iostream>  
#define COLOR 8.0  
#define PIX ((GLfloat)(1.0 / COLOR))  
#define STEP 1.0f  
#define PI acos(-1)   
using namespace std;  
// 旋转初始的角度  
GLfloat angle = 0.0f;  
// 设置旋转轴:两个三维的点确定的旋转轴  
GLfloat axis[][3] = {
    
      
    0.5f,0.5f, 0.0f,  
    0.5f, 0.5f, 1.0f  
};  
void display_2()  
{
    
      
    // 设置逆时针排列的点围成的平面为正面  
    glFrontFace(GL_CCW);  
    // 设置不绘制背面,节省算力同时不会出现背面覆盖正面的情况  
    glCullFace(GL_BACK);  
    glEnable(GL_CULL_FACE);  
    // 设置背景为白色  
    glClearColor(1.0, 1.0, 1.0, 1.0);  
    glClear(GL_COLOR_BUFFER_BIT);  
    // 加载单位阵  
    glLoadIdentity();  
    // 设置相机的位置和视角  
    // 有关gluLookAt:https://blog.csdn.net/Augusdi/article/details/20470813  
    //gluLookAt(2, 2, 2, 0.0, 1, 0.0, -1, -1, 1);//修改目标点  
    //gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, -1, -1, 1);//修改视点  
     //gluLookAt(1, 2, 0, 0.0, 1, 0.0, -1, -1, 1);//修改目标点和视点  
    gluLookAt(2, 2, 2, 0.0, 0.0, 0.0, -1, -1, 1);  
    // 设置绕给定的轴旋转  
    glTranslatef(axis[0][0], axis[0][1], axis[0][2]);  
    glRotatef(angle, axis[1][0] - axis[0][0], axis[1][1] - axis[0][1], axis[1][2] - axis[0][2]);  
    glTranslatef(-axis[0][0], -axis[0][1], -axis[0][2]);  
    // 设置立方体的八个顶点坐标  
  
    static const GLfloat vertex[][3] = {
    
      
        0.0f, 0.0f, 0.0f,  
        1.0f, 0.0f, 0.0f,  
        0.0f, 1.0f, 0.0f,  
        1.0f, 1.0f, 0.0f,  
        0.0f, 0.0f, 1.0f,  
        1.0f, 0.0f, 1.0f,  
        0.0f, 1.0f, 1.0f,  
        1.0f, 1.0f, 1.0f  
    };  
    /* 
//修改正方体大小 
static const GLfloat vertex[][3] = { 
    0.0f, 0.0f, 0.0f, 
    1.5f, 0.0f, 0.0f, 
    0.0f, 1.5f, 0.0f, 
    1.5f, 1.5f, 0.0f, 
    0.0f, 0.0f, 1.5f, 
    1.50f, 0.0f, 1.5f, 
    0.0f, 1.5f, 1.5f, 
    1.5f, 1.5f, 1.5f 
}; 
    */  
    // 设置绘制六个面时顶点的顺序  
    static const GLint index[][4] = {
    
      
        0, 2, 3, 1,  
        0, 4, 6, 2,  
        0, 1, 5, 4,  
        4, 5, 7, 6,  
        1, 3, 7, 5,  
        2, 6, 7, 3  
    };  
    // 绘制六个面  
    glBegin(GL_QUADS);  
    for (unsigned int i = 0; i < 6; i++)  
        for (unsigned int j = 0; j < 4; j++) {
    
      
            // 每个顶点的RGB颜色值和其顶点位置坐标一致  
            glColor3fv(vertex[index[i][j]]);  
            glVertex3fv(vertex[index[i][j]]);  
        }  
    glEnd();  
    // 双缓冲下的刷新帧缓存  
    glutSwapBuffers();  
}  
/*void displaytadpot(void)  
{  
    // 设置背景为白色  
    glClearColor(1.0, 1.0, 1.0, 1.0);  
    glClear(GL_COLOR_BUFFER_BIT);  
    glColor3f(1.0, 0.0, 0.0); //画笔红色  
    glLoadIdentity();  //加载单位矩阵    
    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);  
    glRotatef(angle, 0.0f, 1.0f, 0.0f);  
    glRotatef(0.0, 1.0, 0.0, 0.0);  
    glRotatef(0.0, 0.0, 1.0, 0.0);  
    glRotatef(0.0, 0.0, 0.0, 1.0);  
    glutWireTeapot(1.5);  
    //rote += roate;  
    //glRotatef(angle, 0.0, 1.0, 0.0);  
    //angle += 1.0f;  
    glEnd();  
    glutSwapBuffers();  
}  */
//画圆环:  
/*void display()  
{  
    // 设置背景为白色  
    glClearColor(1.0, 1.0, 1.0, 1.0);  
    glClear(GL_COLOR_BUFFER_BIT);  
    glColor3f(1.0, 0.0, 0.0); //画笔红色  
    glLoadIdentity();  //加载单位矩阵    
    //视角  
    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);  
    glRotatef(angle, 0.0f, 1.0f, 0.0f);  
    glRotatef(0.0, 1.0, 0.0, 0.0);  
    glRotatef(0.0, 0.0, 1.0, 0.0);  
    glRotatef(0.0, 0.0, 0.0, 1.0);  
    glutWireTorus(0.2, 1.5, 20, 40);  
    glEnd();  
    glutSwapBuffers();  
}  */
//画圆环和茶狐混合绕一个轴旋转  
void displayTeapot_Torus()  
{
    
      
    // 设置背景为白色  
    glClearColor(1.0, 1.0, 1.0, 1.0);  
    glClear(GL_COLOR_BUFFER_BIT);  
    glColor3f(1.0, 0.0, 0.0); //画笔红色  
    glLoadIdentity();  //加载单位矩阵    
    //视角  
    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);  
    glRotatef(angle, 0.0f, 1.0f, 0.0f);  
    glRotatef(0.0, 1.0, 0.0, 0.0);  
    glRotatef(0.0, 0.0, 1.0, 0.0);  
    glRotatef(0.0, 0.0, 0.0, 1.0);  
    glutWireTorus(0.2, 1.5, 20, 40);  
    glRotatef(90, 1, 0, 0);//旋转  
    glTranslatef(0, 0.9, 0);//平移  
    glutWireTeapot(1);
	glColor3f(0.0, 0.0, 1.0);
	glRotatef(angle, 0.0f, 1.0f, 0.0f);  
    glRotatef(0.0, 1.0, 0.0, 0.0);  
    glRotatef(0.0, 0.0, 1.0, 0.0);  
    glRotatef(0.0, 0.0, 0.0, 1.0);  
    glutWireTorus(0.2, 1.5, 20, 40); 
    glEnd();  
    glutSwapBuffers();  
}
void timer_function(GLint value)  
{
    
      
    // 旋转角度增加  
    angle += STEP;  
    // 若角度大于360转完一圈则清零  
    if (angle > 360.0) angle -= 360.0;  
    glutPostRedisplay();  
    glutTimerFunc(50, timer_function, value);  
}  
void reshape(int w, int h)  
{
    
      
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);  
    glMatrixMode(GL_PROJECTION);//投影矩阵  
    glLoadIdentity();  
    gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0);  
    glMatrixMode(GL_MODELVIEW);//切换回模型视图矩阵  
    //glLoadIdentity();  
    //gluLookAt(2, 2, 2, 0.0, 0.0, 0.0, -1, -1, 1);  
} 
//透视投影  
void reshape(int w, int h)  
{
    
      
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);  
    glMatrixMode(GL_PROJECTION);//投影矩阵  
    glLoadIdentity();  
    gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0);  
    glMatrixMode(GL_MODELVIEW);//切换回模型视图矩阵  
    //glLoadIdentity();  
    //gluLookAt(2, 2, 2, 0.0, 0.0, 0.0, -1, -1, 1);  
}  
void reshape_2(int w, int h)  
{
    
      
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);  
    glMatrixMode(GL_PROJECTION);//投影矩阵  
    glLoadIdentity();  
    //使用正交投影  
    if (w <= h)  
        glOrtho(-2.0, 2.0, -2.0 * (GLfloat)h / (GLfloat)w,  
            2.0 * (GLfloat)h / (GLfloat)w, -10.0, 10.0);  
    else  
        glOrtho(-2.0 * (GLfloat)w / (GLfloat)h,  
            2.0 * (GLfloat)w / (GLfloat)h, -2.0, 2.0, -10.0, 10.0);  
    glMatrixMode(GL_MODELVIEW);  
}  
int APIENTRY _tWinMain(HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPTSTR    lpCmdLine,
	int       nCmdShow)  
{
    
      
    UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);
	char* argv[] = {
    
     (char*)"hello ",(char*)" " };
	int argc = 2;		//argv中的字符串数

	glutInit(&argc, argv);                  
    // 设置双缓冲和RGB颜色模式  
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);  
    // 设置窗口大小、位置和名称  
    glutInitWindowSize(500, 500);  
    glutInitWindowPosition(100, 100);  
    glutCreateWindow("实验九WYM");  
    // 设置绘制函数、窗口大小自适应函数和定时器回调函数  
    glutDisplayFunc(displayTeapot_Torus);  
    glutReshapeFunc(reshape);  
    //glEnable(GL_DEPTH_TEST); //使用了深度缓存这行不能掉  
    glutTimerFunc(500, timer_function, 1);  
    // 进入主循环  
    glutMainLoop();  
    return 0;  
}

insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/weixin_52030647/article/details/130729315
conseillé
Classement