最近学习计算机图形学写的基于opengGL的作业
源码下载链接:链接:http://pan.baidu.com/s/1slANShZ 密码:hbwj
1.三维网格坐标建立
2.基本3维图形创建
3.鼠标相应旋转缩放
4.键盘相应旋转缩放
5.灯光设置
6.纹理载入映射
7.读取模型
关于MFC配置编写openGL网上有很多教程
需要的函数创建一般是:
OnCreat()
OnDestroy()
Onsize()
PreCreateWindow()
OnDraw()
在我的MFC单文档项目中enableview.h和enableview.cpp负责上面的窗口建立,myopenglview.h和myopenglView.cpp主要是功能的实现
1.三维网格建立:
void GLGrid(float pt1x, float pt1y, float pt1z, float pt2x, float pt2y, float pt2z, int num)
{
const float _xLen = (pt2x - pt1x) / num;
const float _yLen = (pt2y - pt1y) / num;
const float _zLen = (pt2z - pt1z) / num;
glLineWidth(2.f);
glLineStipple(1, 0x0303);//线条样式
glBegin(GL_LINES);
glEnable(GL_LINE_SMOOTH);
int xi = 0;
int yi = 0;
int zi = 0;
//绘制平行于X的直线
for (zi = 0; zi <= num; zi++)
{
float z = _zLen * zi + pt1z;
for (yi = 0; yi <= num; yi++)
{
float y = _yLen * yi + pt1y;
glVertex3f(pt1x, y, z);
glVertex3f(pt2x, y, z);
}
}
//绘制平行于Y的直线
for (zi = 0; zi <= num; zi++)
{
float z = _zLen * zi + pt1z;
for (xi = 0; xi <= num; xi++)
{
float x = _xLen * xi + pt1x;
glVertex3f(x, pt1y, z);
glVertex3f(x, pt2y, z);
}
}
//绘制平行于Z的直线
for (yi = 0; yi <= num; yi++)
{
float y = _yLen * yi + pt1y;
for (xi = 0; xi <= num; xi++)
{
float x = _xLen * xi + pt1x;
glVertex3f(x, y, pt1z);
glVertex3f(x, y, pt2z);
}
}
glEnd();
}
void CmyopenglView::ordination() {
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glEnable(GL_POINT_SMOOTH); //设置反走样
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); //设置反走样
glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glEnable(GL_POLYGON_SMOOTH);
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
glRotatef(-45, 0.0, 1.0, 0.0);
//网格
glPushMatrix();
glColor3f(0.9f, 0.9f, 0.9f);
glTranslatef(-4, -4, -4);
GLGrid(0,0,0,8,0,8,20);
glPopMatrix();
glPushMatrix();
glTranslated(-4,4, -4);
glRotatef(90, 1.0, 0.0, 0.0);
glColor3f(0.9f, 0.9f, 0.0f);
GLGrid(0, 0, 0, 8, 0, 8, 20);
glPopMatrix();
glPushMatrix();
glTranslatef(-4, -4, -4);
glRotatef(90, 0.0, 0.0, 1.0);
glColor3f(0.0f, 0.9f, 0.0f);
GLGrid(0, 0, 0, 8, 0, 8, 20);
glPopMatrix();
glDisable(GL_BLEND);
glDisable(GL_LINE_SMOOTH);
glDisable(GL_POINT_SMOOTH);
glDisable(GL_POLYGON_SMOOTH);
}
我们在ordination()函数中增加绘制x,y,z坐标的代码
void CmyopenglView::ordination() {
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glEnable(GL_POINT_SMOOTH); //设置反走样
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); //设置反走样
glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glEnable(GL_POLYGON_SMOOTH);
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
glRotatef(-45, 0.0, 1.0, 0.0);
//网格
glPushMatrix();
glColor3f(0.9f, 0.9f, 0.9f);
glTranslatef(-4, -4, -4);
GLGrid(0,0,0,8,0,8,20);
glPopMatrix();
glPushMatrix();
glTranslated(-4,4, -4);
glRotatef(90, 1.0, 0.0, 0.0);
glColor3f(0.9f, 0.9f, 0.0f);
GLGrid(0, 0, 0, 8, 0, 8, 20);
glPopMatrix();
glPushMatrix();
glTranslatef(-4, -4, -4);
glRotatef(90, 0.0, 0.0, 1.0);
glColor3f(0.0f, 0.9f, 0.0f);
GLGrid(0, 0, 0, 8, 0, 8, 20);
glPopMatrix();
//x
//glTranslatef(-2, -2, -2);
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_LINES);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(3.5, 0.0f, 0.0f);
glEnd();
glPushMatrix();
glTranslatef(3.5, 0.0f, 0.0f);
glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
glutWireCone(0.027, 0.09, 10, 10);
glPopMatrix();
//y
glColor3f(0.0f, 1.0f, 0.0f);
glBegin(GL_LINES);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0, 3.5, 0.0f);
glEnd();
glPushMatrix();
glTranslatef(0.0, 3.5, 0.0f);
glRotatef(90.0f, -1.0f, 0.0f, 0.0f);
glutWireCone(0.027, 0.09, 10, 10);
glPopMatrix();
//z
glColor3f(0.0f, 0.0f, 1.0f);
glBegin(GL_LINES);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0, 0.0f, 3.5);
glEnd();
glPushMatrix();
glTranslatef(0.0, 0.0f, 3.5);
glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
glutWireCone(0.027, 0.09, 10, 10);
glPopMatrix();
glDisable(GL_BLEND);
glDisable(GL_LINE_SMOOTH);
glDisable(GL_POINT_SMOOTH);
glDisable(GL_POLYGON_SMOOTH);
}
2.基本三维图形创建
点模型/线模型/面模型
glColor3f(1.0f, 1.0f, 1.0f);
if (model == 1)
{
if (type == 1)
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
if (type == 2)
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
if (type == 3)
glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
auxSolidCube(4);
}
if (model == 2)
{
if (type == 1)