代码如下:
#include "Main.h"
#include"CLoad3DS.h"
//在此处定义全局变量
CLoad3DS *gothicLoader=new(CLoad3DS);
t3DModel gothicModel;
float gothicTrans[10] = {
0, 0 , 0 , //表示在世界矩阵的位置
2,2,2, //表示xyz放大倍数
0 , 0 , 0 , 0 //表示旋转
};
//此处定义用户变量
GLfloat angle_X;
GLfloat angle_Y;
GLfloat t_x;
GLfloat eyex=0.0f;
GLfloat eyey=0.0f;
GLfloat eyez=-2.0f;
GLfloat centerx=0.0f;
GLfloat centery=0.0f;
GLfloat centerz=-10.0f;
GLfloat camera_speed=0.01f;
// 用户绘制场景相关的函数在此处定义
BOOL Initialize(GL_Window* window,Keys* keys)
{
//设置全局变量
OGL_window = window;
OGL_keys = keys;
//建立时钟
SetTimer(window->hWnd,TIMER1,33,NULL);
// 在此处初始化绘制场景
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // 清屏为黑色
glClearDepth(1.0f); // 设置深度缓存
glDepthFunc(GL_LEQUAL); // 选择深度测试方式
glEnable(GL_DEPTH_TEST); // 开启深度测试
glShadeModel(GL_SMOOTH); // 阴暗处理采用平滑方式
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 最精细的透视计算
//导入模型 模型的文件夹尽量这样设置
//然后模型贴图 装在Data/pic里面 一定要跟前面截图的文件夹名字一样,想改得去CLoad3DS文件里面改
gothicLoader->Import3DS(&gothicModel, "Data/3ds/01.3DS");
return TRUE; // 初始化成功返回TRUE
}
//坐标系的绘制
void DrawPlane(GLfloat length=10.0f)
{
GLfloat L=length/2;
glLineWidth(2.0f);//定义线宽
glDisable(GL_TEXTURE_2D); // 关闭2D纹理映射
//绘制X轴
glBegin(GL_LINES); //X轴正方向
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(L,0.0f,0.0f);
glEnd();
glLineStipple(2,0x0C03);//X轴负方向
glEnable(GL_LINE_STIPPLE);
glBegin(GL_LINES);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(-L,0.0f,0.0f);
glEnd();
glDisable(GL_LINE_STIPPLE);
glBegin(GL_LINE_STRIP);//X轴箭头
glVertex3f(L-0.3,0.3f,0.0f);
glVertex3f(L,0.0f,0.0f);
glVertex3f(L-0.3,-0.3f,0.0f);
glEnd();
glBegin(GL_LINES);//字母X
glVertex3f(L+0.2f,0.2f,0.0f);
glVertex3f(L+0.4f,-0.2f,0.0f);
glEnd();
glBegin(GL_LINES);
glVertex3f(L+0.2f,-0.2f,0.0f);
glVertex3f(L+0.4f,0.2f,0.0f);
glEnd();
//绘制Y轴
glBegin(GL_LINES); //Y轴正方向
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,L,0.0f);
glEnd();
glLineStipple(2,0x0C03);//Y轴负方向
glEnable(GL_LINE_STIPPLE);
glBegin(GL_LINES);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,-L,0.0f);
glEnd();
glDisable(GL_LINE_STIPPLE);
glBegin(GL_LINE_STRIP);//Y轴箭头
glVertex3f(0.3f,L-0.3f,0.0f);
glVertex3f(0.0f,L,0.0f);
glVertex3f(-0.3f,L-0.3f,0.0f);
glEnd();
glBegin(GL_LINE_STRIP);//字母Y
glVertex3f(0.0f,L+0.3f,0.0f);
glVertex3f(0.0f,L+0.5f,0.0f);
glVertex3f(0.2f,L+0.7f,0.0f);
glEnd();
glBegin(GL_LINES);
glVertex3f(0.0f,L+0.5f,0.0f);
glVertex3f(-0.2f,L+0.7f,0.0f);
glEnd();
//绘制Z轴
glBegin(GL_LINES); //z轴正方向
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,0.0f,L);
glEnd();
glLineStipple(2,0x0C03);//z轴负方向
glEnable(GL_LINE_STIPPLE);
glBegin(GL_LINES);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,0.0f,-L);
glEnd();
glDisable(GL_LINE_STIPPLE);
glBegin(GL_LINE_STRIP);//Z轴箭头
glVertex3f(-0.3f,0.0f,L-0.3f);
glVertex3f(0.0f,0.0f,L);
glVertex3f(0.3f,0.0f,L-0.3f);
glEnd();
glBegin(GL_LINE_STRIP);//绘制字母Z
glVertex3f(-0.4f,-0.2f,L);
glVertex3f(-0.2f,-0.2f,L);
glVertex3f(-0.4f,-0.4f,L);
glVertex3f(-0.2f,-0.4f,L);
glEnd();
glColor3f(1.0f,1.0f,1.0f);//将画笔设置为白色,否则可能干扰后续绘制工作
}
//绘制立方体
void DrawCube(GLfloat width, GLfloat height, GLfloat depth)
{
GLfloat x = width / 2, y = height / 2, z = depth / 2; //临时变量
glBegin(GL_QUADS);
//前面(front)
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(-x, -y, z);
glVertex3f(x, -y, z);
glVertex3f(x, y, z);
glVertex3f(-x, y, z);
//背面(back)
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(x, -y, -z);
glVertex3f(-x, -y, -z);
glVertex3f(-x, y, -z);
glVertex3f(x, y, -z);
//右侧面(right)
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(x, -y, z);
glVertex3f(x, -y, -z);
glVertex3f(x, y, -z);
glVertex3f(x, y, z);
//左侧面(left)
glVertex3f(-x, -y, -z);
glVertex3f(-x, -y, z);
glVertex3f(-x, y, z);
glVertex3f(-x, y, -z);
//顶面(top)
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(-x, y, z);
glVertex3f(x, y, z);
glVertex3f(x, y, -z);
glVertex3f(-x, y, -z);
//底面(bottom)
glVertex3f(-x, -y, -z);
glVertex3f(x, -y, -z);
glVertex3f(x, -y, z);
glVertex3f(-x, -y, z);
glEnd();
}
//绘制金字塔
void DrawPyramid(GLfloat width,GLfloat depth,GLfloat height)
{
GLfloat x = width / 2, y = height, z = depth / 2;
glColor3ub(217, 167, 22);
glBegin(GL_TRIANGLES);
//前面(font)
glVertex3f(x, 0, z);
glVertex3f(-x, 0, z);
glVertex3f(0, y, 0);
//背面(back)
glVertex3f(x, 0, -z);
glVertex3f(-x, 0, -z);
glVertex3f(0, y, 0);
//左侧面(left)
glColor3ub(217, 122, 0);
glVertex3f(-x, 0, z);
glVertex3f(-x, 0, -z);
glVertex3f(0, y, 0);
//右侧面(right)
glVertex3f(x, 0, z);
glVertex3f(x, 0, -z);
glVertex3f(0, y, 0);
glEnd();
//底面(bottom)
glBegin(GL_QUADS);
glVertex3f(x, 0, z);
glVertex3f(x, 0, -z);
glVertex3f(-x, 0, -z);
glVertex3f(-x, 0, z);
glEnd();
}
//XOZ参考面的绘制
void ReferPlane_XOZ(void)
{
//绘制平面网格
glColor3f(0.0f,0.5f,0.0f);
glDisable(GL_TEXTURE_2D); //关闭纹理映射
glBegin(GL_LINES);
for(int i=-30;i<=30;i++)
{
glVertex3i(30,0,i);
glVertex3i(-30,0,i);
glVertex3i(i,0,30);
glVertex3i(i,0,-30);
}
glColor3f(1.0f,1.0f,1.0f);
glEnd();
}
//绘制场景
void DrawSceneGL(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清楚颜色和深度缓存
glLoadIdentity(); //重置当前矩阵
//在此处添加代码进行绘制:
//摄像机的绘制
gluLookAt(eyex,eyey,eyez,centerx,centery,centerz,0.0f,1.0f,0.0f);
//坐标轴的引用
glPushMatrix();
glTranslatef(0.0f,0.0f,-10.0f);
DrawPlane();
ReferPlane_XOZ();
glPopMatrix();
//四面体X轴周期性缩放
glPushMatrix();
glTranslatef(3.0f, 0.0f, -10.0f);
glScalef(sin(0.05*t_x),sin(0.05*t_x),sin(0.05*t_x));
DrawCube(1.0f, 1.0f, 1.0f);
glPopMatrix();
//立方体Y轴周期性平移
glPushMatrix();
glTranslatef(0.0f,3.0f,-10.0f);
glTranslatef(0.0f,sin(0.05*t_x),0.0f);
DrawCube(1.0f,1.0f,1.0f);
glPopMatrix();
//金字塔-Z轴公转,Z轴自转
glPushMatrix();
glTranslatef(0.0f,0.0f,-13.0f);
glRotatef(angle_X, 0.0f, 0.0f, 1.0f);
glTranslatef(2.0f, 0.0f, 0.0f);
glRotatef(angle_Y, 0.0f, 1.0f, 0.0f);
DrawPyramid(1.0f,1.0f,1.0f);
glPopMatrix();
angle_X+=1.5f;
angle_Y-=1.5f;
t_x++;
glPushMatrix();
glTranslatef(0.0f,0.0f,0.0f);
changeObject( gothicTrans );
drawModel(gothicModel,true,false);
glPopMatrix();
glFlush(); //刷新GL买了队列
}
// 在此处更新对消息的动作
void Update(void)
{
if(OGL_keys->keyDown[VK_ESCAPE]==TRUE) //判断ESC键是否按下
{
PostMessage(OGL_window->hWnd,WM_QUIT,0,0); //结束程序
}
if(OGL_keys->keyDown[VK_F1] == TRUE) //判断F1是否按下
{
PostMessage(OGL_window->hWnd,WM_TOGGLEFULLSCREEN,0,0); //在全屏/窗口模式键切换
}
if(OGL_keys->keyDown[VK_UP]==TRUE)
{
eyey+=camera_speed;
}
if(OGL_keys->keyDown[VK_DOWN]==TRUE)
{
eyey-=camera_speed;
}
if(OGL_keys->keyDown[VK_RIGHT]==TRUE)
{
eyex+=camera_speed;
}
if(OGL_keys->keyDown[VK_LEFT]==TRUE)
{
eyex-=camera_speed;
}
if(OGL_keys->keyDown['A']==TRUE)
{
eyez-=camera_speed;
}
if(OGL_keys->keyDown['D']==TRUE)
{
eyez+=camera_speed;
}
if(OGL_keys->keyDown[VK_SPACE]==TRUE)
{
eyex=0.0f;
eyey=0.0f;
eyez=-2.0f;
centerx=0.0f;
centery=0.0f;
centerz=-10.0f;
}
if(OGL_keys->keyDown['X']==TRUE)
{
eyex=0.0f;
eyey=0.0f;
eyez=-2.0f;
centerx=3.0f;
centery=0.0f;
centerz=-8.0f;
}
if(OGL_keys->keyDown['Y']==TRUE)
{
eyex=0.0f;
eyey=0.0f;
eyez=-2.0f;
centerx=0.0f;
centery=3.0f;
centerz=-8.0f;
}
if(OGL_keys->keyDown['Z']==TRUE)
{
eyex=0.0f;
eyey=0.0f;
eyez=-8.0f;
centerx=0.0f;
centery=0.0f;
centerz=-13.0f;
}
}
// 在此处做退出前扫尾工作
void Deinitialize(void) // 在此处做退出前扫尾工作
{
KillTimer(OGL_window->hWnd, TIMER1); // 释放时钟
}