openGL三维网格坐标,旋转,缩放,灯光设置,纹理读取,模型读取(MFC单文档)

这篇博客介绍了使用OpenGL进行三维图形绘制的实践,包括建立三维网格坐标、创建基本3D图形、实现鼠标键盘的旋转缩放交互、设置灯光效果、加载纹理映射以及读取.obj模型。源码提供下载,便于读者学习和参考。
摘要由CSDN通过智能技术生成

最近学习计算机图形学写的基于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)
      
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值