• OpenGL大作业


    GLfloat light0_position[] = { 15.0,15.0,15.0,10.0 };//定义光源位置 103
    glLightfv(GL_LIGHT0, GL_POSITION, light0_position);//设置光源位置 107
    x,y,z,w四个变量组成上面的数组,其中前三个代表位置,最后一个代表离场景近远(W可不予理会)
    坐标系 右手边为x正,上方为y正,从屏幕向你为z正

    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 150
    gluLookAt(
    eyex,eyey,eyez, // 这里是观察者位置
    targetx,targety,targetz // 这是观察者看着的那点
    upx,upy,upz ) // 这是观察者头顶向着的方向


    glRotatef(30.0, 1.0, 0.0, 0.0);//旋转使物体被观测的角度变化 多处出现
    glRotatef( angle, x, y, z )函数的作用是将当前坐标系以a( x, y, z )向量为旋转轴旋转angle角度

    glTranslatef(4.5f, 0.0f, -6.0f);//将画笔移动到另一个地点,方便绘制下一个图形 174

    注意坐标系约定和函数参数单位!

     实验结果图。。

    核心代码

    void CTribleangleView::OnDraw(CDC* pDC)
    {
        CTribleangleDoc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        if (!pDoc)
            return;
    
        // TODO: add draw code for native data here
        //初始化各种设置
        wglMakeCurrent(pDC->m_hDC, m_hGLRC);//将绘图上下文绑定到设备上下文上
        glClearColor(0.5, 0.5, 0.5, 0.0);//设置背景色
        glClearDepth(1.0f);//初始化深度
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清空缓冲区
        glEnable(GL_DEPTH_TEST);//开启深度测试
        glShadeModel(GL_SMOOTH);//平滑阴影模式
        CRect rcClient;
        GetClientRect(&rcClient);
        GLsizei w = rcClient.Width();//视区宽度
        GLsizei h = rcClient.Height();//视区高度
        glViewport(0, 0, w, h);
        glMatrixMode(GL_PROJECTION);//选择投影矩阵
        glLoadIdentity();//重置投影矩阵
        gluPerspective(60.0, (GLfloat)w / h, 0.1, 100.0);//设置投影方式及投影参数
        glMatrixMode(GL_MODELVIEW);//选择模式矩阵
        glLoadIdentity();//重置模式矩阵
    
        //设置光照(定义一个位于左上方的白色定位光源)
        GLfloat lmodel_ambient[] = { 1.0f,1.0f,1.0f,1.0f };//定义环境光
        glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);//设置环境光
        GLfloat light0_ambient[] = { 1.0,1.0,1.0,1.0 };//定义光源环境光
        GLfloat light0_diffuse[] = { 1.0,1.0,1.0,1.0 };//定义光源散射光
        GLfloat light0_specular[] = { 1.0,1.0,1.0,1.0 };//定义光源反射光
        GLfloat light0_position[] = { 15.0,15.0,15.0,10.0 };//定义光源位置
        glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient);//设置光源环境光
        glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);//设置光源散射光
        glLightfv(GL_LIGHT0, GL_SPECULAR, light0_specular);//设置光源反射光
        glLightfv(GL_LIGHT0, GL_POSITION, light0_position);//设置光源位置
        glEnable(GL_LIGHT0);//启用光源
        glEnable(GL_LIGHTING);//启用光照效果
        
                              //定义黄铜材质
        GLfloat brass_ambient[] = { 0.329412f,0.223529f,0.027451f,1.0f };//定义材质环境光
        GLfloat brass_diffuse[] = { 0.780392f,0.568627f,0.113725f,1.0f };//定义材质散射光
        GLfloat brass_specular[] = { 0.992157f,0.941176f,0.807843f,1.0f };//定义材质反射光
        GLfloat brass_sinines[] = { 100.0f };//定义材质镜面反射强度
        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, brass_ambient);//设置材质环境光
        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, brass_diffuse);//设置材质散射光
        glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, brass_specular);//设置材质反射光
        glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, brass_sinines);//设置材质镜面反射强度
                            //塑料材质
        GLfloat plastic_ambient[] = { 0.0f,0.0f,0.00f,1.0f };//定义材质环境光
        GLfloat plastic_diffuse[] = { 0.7f,0.85f,0.7f,1.0f };//定义材质散射光
        GLfloat plastic_specular[] = { 0.75f,0.75f,0.75f,1.0f };//定义材质反射光
        GLfloat plastic_sinines[] = { 10.0f };//定义材质镜面反射强度
        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, plastic_ambient);//设置材质环境光
        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, plastic_diffuse);//设置材质散射光
        glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, plastic_specular);//设置材质反射光
        glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, plastic_sinines);//设置材质镜面反射强度
    
        //平面纹理坐标生成
        static GLfloat xequalzero[] = { 1.0,1.0,1.0,1.0 };
        static GLfloat slanted[] = { 1.0,1.0,1.0,1.0 };
        static GLfloat *currentCoeff;
        static GLenum    currentPlane;
        static GLint    currentGenMode;
        static float    roangles;
        glClearColor(1.0, 1.0, 1.0, 1.0);
        glEnable(GL_DEPTH_TEST);
        glShadeModel(GL_SMOOTH);
    #define stripleImageWidth 32
        GLubyte stripleImage[4 * stripleImageWidth];
    
        int j;
        for (j = 0; j < stripleImageWidth; ++j) {
            stripleImage[4 * j + 0] = (GLubyte)((j <= 4) ? 255 : 0);
            stripleImage[4 * j + 1] = (GLubyte)((j>4) ? 255 : 0);
            stripleImage[4 * j + 2] = (GLbyte)(0);
            stripleImage[4 * j + 3] = (GLbyte)255;
        }
        glPixelStoref(GL_UNPACK_ALIGNMENT,1);
        glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexImage1D(GL_TEXTURE_1D, 0, 4, stripleImageWidth, 0,
            GL_RGBA, GL_UNSIGNED_BYTE, stripleImage);
        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
        currentCoeff = xequalzero;
        currentGenMode = GL_OBJECT_LINEAR;
        currentPlane = GL_OBJECT_PLANE;
        glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, currentGenMode);
        glTexGenfv(GL_S, currentPlane, currentCoeff);
        glEnable(GL_TEXTURE_GEN_S);
        glEnable(GL_TEXTURE_1D);
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);
        glEnable(GL_AUTO_NORMAL);
        glEnable(GL_NORMALIZE);
        glFrontFace(GL_CW);
        glMaterialf(GL_FRONT, GL_SHININESS, 64.0);
        roangles = 45.0;
        //设置坐标系统
        glTranslatef(0.0f, -0.1f, -2.0f);//将坐标系统下移0.1,后移2.0
        glRotatef(45, 1.0, 0.0, 0.0);//将坐标系统绕x轴逆时针旋转45度
        glRotatef(30, 0.0, -1.0, 0.0);//将坐标系统绕y轴顺时针旋转30度
    
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();
        glPushMatrix();
        glTranslatef(-1.5f, 0.0f, -6.0f);
        glRotatef(30.0, 1.0, 0.0, 0.0);
        glRotatef(30.0, 0.0, 1.0, 0.0);
    
        glutSolidCube(2.0);
        glLoadIdentity();
        glTranslatef(2.5f, 0.0f, -6.0f);
        glRotatef(0.0f, 1.0f, 0.0f, 0.0f);
        glutSolidSphere(2.0, 32, 32);
        glDisable(GL_TEXTURE_2D);//禁用纹理映射
        glPopMatrix();
        glFlush();//强制输出
        SwapBuffers(pDC->m_hDC);//交换缓冲区
        wglMakeCurrent(pDC->m_hDC, NULL);//置绘图上下文为非当前状态,释放设备上下文
    
    
    }
  • 相关阅读:
    webpack里CommonJS的require与ES6 的module.exports加载模块有何不同
    前端项目使用module.exports文件一定要Webpack编译吗?请问gulp可以编译这种文件吗
    Webpack之“多页面开发”最佳实战
    webpack 单页面应用实战
    也谈谈同源策略和跨域问题
    (转)Babel-现在开始使用 ES6
    webpack 配置简单说几句 ?
    Javascript 严格模式详解
    JavaScript6 新语法 let 有什么优势
    js中let和var定义变量的区别
  • 原文地址:https://www.cnblogs.com/linkzijun/p/6188967.html
Copyright © 2020-2023  润新知