计算机图形学第五次上机——真实感图形绘制(引入光照模型)太阳系动画实现

 

    计算机图形学       课程实验报告

实验名称    真实感图形绘制    

 

一、实验目的

1.掌握光照模型的编程应用

2.能够编程模拟实现简单的太阳系

1. 用不同的着色和光照参数绘制茶壶:

i. 线框模型的茶壶

ii. 没有光照的固定颜色的茶壶

iii. 只有环境光,采用单一颜色的茶壶

iv. 只有环境光和漫反射光,采用Gouraud插值着色的茶壶

v. 有环境光、漫反射光和镜面高光,采用Gouraud插值着色的茶壶

vi. 有环境光、漫反射光和镜面高光,采用Phone插值着色的茶壶

2. 模拟简单的太阳系,太阳在中心,地球每365天绕太阳转一周,月球每年绕地球转12周。另外,地球每天24个小时绕它自己的轴旋转。

二、实验环境

1.codeblocks-17.12

2.Windows10 SDK 10.0.17134.0

三、实验内容

1茶壶绘制

1.1问题重述

 用不同的着色和光照参数绘制茶壶:

i. 线框模型的茶壶

ii. 没有光照的固定颜色的茶壶

iii. 只有环境光,采用单一颜色的茶壶

iv. 只有环境光和漫反射光,采用Gouraud插值着色的茶壶

v. 有环境光、漫反射光和镜面高光,采用Gouraud插值着色的茶壶

vi. 有环境光、漫反射光和镜面高光,采用Phone插值着色的茶壶

 

 

 

 

2.2实验结果

i. 线框模型的茶壶

ii. 没有光照的固定颜色的茶壶

iii. 只有环境光,采用单一颜色的茶壶

iv. 只有环境光和漫反射光,采用Gouraud插值着色的茶壶

v. 有环境光、漫反射光和镜面高光,采用Gouraud插值着色的茶壶

vi. 有环境光、漫反射光和镜面高光,采用Phone插值着色的茶壶

2.模拟太阳系

2.1问题重述

模拟简单的太阳系,太阳在中心,地球每365天绕太阳转一周,月球每年绕地球转12周。另外,地球每天24个小时绕它自己的轴旋转。

 

2.2运行结果

三、源代码

1.

#include<windows.h>

#include <GL/glut.h>

#include <stdio.h>

GLfloat d = 0.1;

GLfloat translateX = 0, translateY = 0;

int halfLength = 20;

GLfloat ratio;

class Point{

public:

    GLfloat x, y, z;

    Point(GLfloat x = 0.0, GLfloat y = 0.0, GLfloat z = 0.0){

        this->x = x;

        this->y = y;

        this->z = z;

    }

};

typedef Point Color;

int renderMode = 1;

GLfloat light_position[]={1.0,1.0,1.0,0.0};

GLfloat blackColor[]={0.0,0.0,0.0,1.0};

GLfloat greyColor[] = {0.5, 0.5, 0.5, 1.0};

GLfloat whiteColor[]={1.0,1.0,1.0,1.0};

GLfloat redColor[]={1.0,0.0,0.0,1.0};

 

GLfloat no_mat[] ={0.0,0.0,0.0,1.0};

GLfloat mat_ambient[] = {0.7,0.7,0.7,1.0};

GLfloat mat_diffuse[] = {0.1,0.5,0.8,1.0};

GLfloat mat_specular[] = {1.0,1.0,1.0,1.0};

GLfloat no_shininess[] = {0.0};

GLfloat low_shininess[] = {5.0};

GLfloat high_shininess[] = {100.0};

void init(){

    glClearColor(1.0, 1.0, 1.0, 1.0);

    //远光源照射

 

    glLightfv(GL_LIGHT0,GL_POSITION,light_position);

 

    //启用光照

    glEnable(GL_LIGHTING);

    glEnable(GL_LIGHT0);

    glShadeModel(GL_SMOOTH);

    //局部光源照射

//    GLfloat light_position1[] = {2.0,0.0,3.0,1.0};

//    glLightfv(GL_LIGHT1,GL_POSITION,light_position1);

//    glEnable(GL_LIGHTING);

//    glEnable(GL_LIGHT1);

 

    glEnable(GL_DEPTH_TEST);

}

void drawCoord(){

    glColor3f(1.0, 1.0, 1.0);

    glBegin(GL_LINES);

    glVertex2f(-halfLength, 0.0);

    glVertex2f(halfLength, 0.0);

    glVertex2f(0.0, -halfLength);

    glVertex2f(0.0, halfLength);

    glEnd();

}

void changeSize(GLsizei w, GLsizei h){

    glViewport(0.0, 0.0, w, h);

    if(h == 0)

        h = 1;

    ratio = (GLfloat)w / (GLfloat)h;

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

    if(w < h)

        glOrtho(-halfLength, halfLength, -halfLength / ratio, halfLength /ratio, -halfLength, halfLength);

//        glFrustum(-halfLength, halfLength, -halfLength / ratio, halfLength /ratio, -10 * halfLength, 0.0);

    else

        glOrtho(-halfLength * ratio, halfLength * ratio, -halfLength, halfLength, -halfLength, halfLength);

//        glFrustum(-halfLength * ratio, halfLength * ratio, -halfLength, halfLength, -10 * halfLength, 0.0);

    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();

}

void renderScene(){

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();

    glEnable(GL_LIGHTING);

    switch (renderMode){

        case 1:

        case 2:

            glDisable(GL_LIGHTING);

            break;

        case 3:

            glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);

            glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, no_mat);

            glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, no_mat);

            glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, no_shininess);

//            glLightfv(GL_LIGHT0,GL_DIFFUSE,whiteColor);

            break;

        case 4:

            glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);

            glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);

            glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, no_mat);

            glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, no_shininess);

//            glLightfv(GL_LIGHT0,GL_SPECULAR,whiteColor);;

        case 5:

            glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);

            glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);

            glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);

            glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, low_shininess);

            break;

        case 6:

            glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);

            glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);

            glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);

            glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, high_shininess);

        default:;

 

 

 

    }

    glColor3f(1.0, 0, 0);

    glMatrixMode(GL_MODELVIEW);

    glTranslatef(0.0, 0.0, -5.0);

    //glRotatef(15.0, 1.0, 1.0, 1.0);

    printf("renderMode = %d\n", renderMode);

    if(renderMode == 1)

        glutWireTeapot(7.0);

    else

        glutSolidTeapot(7.0);

    glFlush();

}

void keyboardFunc(unsigned char key, int x, int y){

    switch(key){

        case '1':

        case '2':

        case '3':

        case '4':

        case '5':

        case '6':

            renderMode = key - '0';

            break;

        case 'q':

            exit(0);

        default:;

    }

    glutPostRedisplay();

}

int main(int argc, char *argv[]) {

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

    glutInitWindowSize(500, 500);

    glutCreateWindow("template");

 

    init();

    glutDisplayFunc(renderScene);

    glutReshapeFunc(changeSize);

    glutKeyboardFunc(keyboardFunc);

    glutMainLoop();

 

    return 0;

}

 

2.

#include<windows.h>

#include <GL/glut.h>

#include <stdio.h>

GLfloat d = 0.1;

GLfloat translateX = 0, translateY = 0;

int halfLength = 70;

GLfloat ratio;

GLfloat sun2Earth = 40.0;

GLfloat earth2Moon = 10.0;

GLfloat earthAngle = 0.0, moonAngle = 0.0;

GLfloat sunSize = 15;

GLfloat earthSize = 5;

GLfloat moonSize = 2;

GLfloat sunColor[] = {1.0, 0.0, 0.0, 1.0};

GLfloat earthColor[] = {0.0, 0.0, 1.0, 1.0};

GLfloat moonColor[] = {1.0, 1.0, 1.0, 1.0};

 

GLfloat whiteLight[] = {0.5f, 0.5f, 0.5f, 1.0f};

GLfloat sourceLight[] = {0.8f, 0.8f, 0.8f, 1.0f};

GLfloat lightPos[] = {0.0f, 0.0f, 0.0f, 1.0f};

 

class Point{

public:

    GLfloat x, y, z;

    Point(GLfloat x = 0.0, GLfloat y = 0.0, GLfloat z = 0.0){

        this->x = x;

        this->y = y;

        this->z = z;

    }

};

typedef Point Color;

void init(){

    glEnable(GL_LIGHTING);

    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, whiteLight);

    glLightfv(GL_LIGHT0, GL_DIFFUSE, sourceLight);

    glLightfv(GL_LIGHT0, GL_POSITION, lightPos);

    glEnable(GL_LIGHT0);

 

    glEnable(GL_COLOR_MATERIAL);

    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);

    glEnable(GL_DEPTH_TEST);

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    glShadeModel(GL_SMOOTH);

}

void drawCoord(){

    glColor3f(1.0, 1.0, 1.0);

    glBegin(GL_LINES);

    glVertex2f(-halfLength, 0.0);

    glVertex2f(halfLength, 0.0);

    glVertex2f(0.0, -halfLength);

    glVertex2f(0.0, halfLength);

    glEnd();

}

void changeSize(GLsizei w, GLsizei h){

    glViewport(0.0, 0.0, w, h);

    if(h == 0)

        h = 1;

    ratio = (GLfloat)w / (GLfloat)h;

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

    if(w < h)

        glOrtho(-halfLength, halfLength, -halfLength / ratio, halfLength /ratio, -halfLength, halfLength);

//        glFrustum(-halfLength, halfLength, -halfLength / ratio, halfLength /ratio, -10 * halfLength, 0.0);

    else

        glOrtho(-halfLength * ratio, halfLength * ratio, -halfLength, halfLength, -halfLength, halfLength);

//        glFrustum(-halfLength * ratio, halfLength * ratio, -halfLength, halfLength, -10 * halfLength, 0.0);

    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();

}

void renderScene(){

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();

    glMatrixMode(GL_MODELVIEW);

    glRotatef(80.0, 1.0, 1.0, 1.0);

//    drawCoord();

    glColor3fv(sunColor);

    glDisable(GL_LIGHTING);

    glutSolidSphere(sunSize, 50, 50);

    glEnable(GL_LIGHTING);

    glRotatef(earthAngle, 0.0, 0.0, 1.0);

    glTranslatef(sun2Earth, 0.0, 0.0);

    glColor3fv(earthColor);

    glutSolidSphere(earthSize, 50, 50);

 

    glRotatef(moonAngle, 0.0, 0.0, 1.0);

    glTranslatef(earth2Moon, 0.0, 0.0);

    glColor3fv(moonColor);

    glutSolidSphere(moonSize, 50, 50);

    glLoadIdentity();

 

    earthAngle += d;

    moonAngle += 12 * d;

 

    glutSwapBuffers();

    glutPostRedisplay();

}

 

void mySpecialKeyFunc(int key, int x, int y){

    switch (key){

        case GLUT_KEY_UP:

            d += 0.01;

            break;

        case GLUT_KEY_DOWN:

            d -= 0.01;

            break;

        default:;

    }

}

void myKeyboardFunc(unsigned char key, int x, int y){

    if(key == 'q'){

        exit(0);

    }

}

int main(int argc, char *argv[]) {

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutInitWindowSize(500, 500);

    glutCreateWindow("template");

 

    init();

    glutDisplayFunc(renderScene);

    glutReshapeFunc(changeSize);

    glutSpecialFunc(mySpecialKeyFunc);

    glutKeyboardFunc(myKeyboardFunc);

    glutMainLoop();

 

    return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/50677.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

合合信息获中国图象图形学学会科技进步奖二等奖

图片来源于中国图像图形学学会CSIG公众号 去年12月&#xff0c;中国图象图形学学会&#xff08;CSIG&#xff09;公布了2021年度自然科学奖、技术发明奖、科技进步奖评选结果。其中&#xff0c;合合信息牵头与华南理工大学共同完成的“复杂场景文档图像识别与理解关键技术及应…

SIGGRAPH2021电脑动画节获奖名单出炉!获奖作品全方位解析

5月24日&#xff0c;SIGGRAPH最受瞩目的环节之一——电脑动画节&#xff08;Computer Animation Festival&#xff0c;简称CAF&#xff09;宣布了本年度的获奖名单&#xff0c;并发布了今年电子剧院&#xff08;Electronic Theater&#xff09;上映影片的预告片。 瑞云渲染为您…

图扑国风设计 3D 可视化 | 科技与文化碰撞炫酷”火花“

当今时代&#xff0c;各领域互融互通&#xff0c;各种表现形式交叉融合&#xff0c;要主动适应新的发展趋势&#xff0c;推动中华优秀传统文化与新媒体、新技术的融合传播&#xff0c;让新时代的文艺与科技创新呈现更具深度、更有潜力的新境界。 “凡益之道&#xff0c;与时偕…

AIGC大模型之——以文生图介绍

一、什么是以文生图&#xff1f; 以文生图是AIGC ( AI Generated Content &#xff09;框架中的一个关键技术&#xff0c;通过文字描述&#xff0c;将文字转化为图像并展示出来。以文生图具有白动化程度高、精度高、可扩展性强、可定制化等优势&#xff0c;具有广泛的应用前景&…

图扑 3D 可视化国风设计 | 科技与文化碰撞炫酷”火花“

当今时代&#xff0c;各领域互融互通&#xff0c;各种表现形式交叉融合&#xff0c;要主动适应新的发展趋势&#xff0c;推动中华优秀传统文化与新媒体、新技术的融合传播&#xff0c;让新时代的文艺与科技创新呈现更具深度、更有潜力的新境界。 “凡益之道&#xff0c;与时偕…

用于app的支付成功与失败页面

博主在开发一款app时制作了几个支付页面&#xff0c;在这里分享给大家。

本人成功续费了。你的支付授权失败。请核对你的信息并重试,或尝试其他支付方式。请联系你的银行了。

今天两个苹果账号都是这样弄的&#xff0c;都成功了。大家可以试试。 正常登录登录开发这账号&#xff0c;到要登录苹果账号的时候&#xff0c;我用注册地香港的账号&#xff08;这是重点&#xff0c;原先用大陆的苹果账号试都不行&#xff09;&#xff0c;卡用的试招行VISA卡…

微信支付 {“errMsg“:“requestPayment:fail errors“}

使用的是uniapp uni.requestPayment 微信支付 错误解决 需要开通微信开放平台 1.登记的包名或签名有没有错误 不知道应用签名的可以先打个包安装到手机之后;使用签名工具下载地址https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Andr…

UniAPP 进行微信支付时报错: {“errMsg“:“requestPayment:fail:[payment微信:-1]General errors“}

☞ 问题描述 Uniapp 开发过程中&#xff0c;参考文档进行微信支付的配置操作后 感觉前期的应用申请&#xff0c;商户号绑定&#xff0c;代码云打包都成功了 但是&#xff0c;通过 HBuilderX 连接安卓真机&#xff08;魅族手机&#xff09;进行测试&#xff0c;神奇的情况出现了…

【FAQ】应用内支付服务无法拉起支付页面常见原因分析和解决方法

华为应用内支付服务&#xff08;In-App Purchases&#xff09;通过简便的接入流程为用户提供良好的应用内支付体验&#xff0c;然而在实际接入过程中&#xff0c;有一些开发者反馈测试时会无法正常拉起支付页面&#xff0c;下文将详细分析问题出现的5种情形&#xff0c;并给出解…

关于微信支付退款接口问题 PHP版

微信支付申请退款接口&#xff0c;直接上代码 $orderinfopdo_fetch("select * from hx_order where orderid$orderid"); $transaction_id$orderinfo[transno]; //退款 //$total_fee$orderinfo[paymoney]; //$refund_fee$orderinfo[paymoney]; $total_fee1; $refund_f…

微信支付-“申请退款”接口遇到curl出错,错误码:58解决方案

微信支付后 退款&#xff0c;接口遇到curl出错&#xff0c;错误码:58 这个问题基本上是证书没对应上&#xff08;微信支付不需要申请证书&#xff0c;退款要用到证书&#xff09;&#xff0c;证书要去微信商户号后台&#xff08;账户中心-API安全-申请证书&#xff09;下载&am…

支付业务-信用卡拒付

业务术语 持卡人&#xff1a;持有信用卡的买家 卡组织&#xff1a;银行卡转接清算机构&#xff08;又称信用卡组织/银行卡组织&#xff09;&#xff0c;由成员组成的国际性或区域性支付卡组织&#xff0c;授权成员发卡&#xff0c;受理商户的卡交易&#xff0c;拥有并经营自己…

【ChatGPT】GPT 原理解析:Transformer 模型的核心思想:注意力机制(Attention Mechanism)的核心原理是什么?并给出数学公式代码实例。

文章目录 注意力机制是什么?多头注意力机制(Multi-Head Attention)Multi-Head Attention 算法原理、代码实例算法原理代码实例应用场景注意力机制的计算步骤Python 代码实例Softmax 函数参考资料注意力机制是什么? 注意力机制(Attention Mechanism)的核心原理是根据输入…

chatgpt赋能python:Python图中打字的SEO文章:让你的图片说出更多的话

Python图中打字的SEO文章&#xff1a;让你的图片说出更多的话 图片是传达信息的有力工具。不过&#xff0c;当你在网站上发布图片的时候&#xff0c;这张图片就很可能会被浏览器、机器学习算法、甚至是一些视觉障碍用户忽略。为了弥补这个缺陷&#xff0c;我们可以使用Python来…

React流式打字效果实现(不需要CSS) - Typing Effect with out use Css

前言 最近有个云栖大会的demo展示需求&#xff0c;要实现个类似的打字效果&#xff0c;所以我找了找相关的库。找到一个还不错的~叫iTyped.js。但是最终的效果和我想要的不太一样&#xff0c;会有回删效果&#xff0c;看了下源码&#xff0c;所以就自己写了一个~ 再夸奖下 iT…

模仿Chart GPT输出的打字效果

demo代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>打字机</title><style>.text {font-size: 40px;}.content {text-align: center;font-size: 0;}.blink {font-size: 40px;animation: tia…

chatgpt赋能python:Python怎么入侵手机

Python怎么入侵手机 现在移动设备已经成为人们生活中必不可少的一部分&#xff0c;因此&#xff0c;攻击者越来越多地将目光转向移动设备。 进入移动设备的主要方式之一是通过应用程序漏洞进行攻击。而Python编程语言的出现可以让攻击者更容易地发掘和利用这些漏洞&#xff0c…

中国外汇交易中心员工英语培训四次合作TutorABC

成人在线英语教育品牌TutorABC的企业英语培训方案已经受到各大企业及协会的认可&#xff0c;这是众所周知的事情。就在双十一前夕&#xff0c;TutorABC与中国外汇交易中心达成年度语言培训合作&#xff0c;这已经是双方连续第四年在企业英语培训领域展开合作&#xff0c;TutorA…

报Python培训班多少钱?报个班值得吗?

报Python培训班多少钱&#xff1f;报个班值得吗&#xff1f;报培训机构学习Python学费一般是要1~2万元之间&#xff0c;每个培训机构收费标准都是不一样&#xff0c;要根据不同的班型、学习时长等因素来收费&#xff0c;而且Python的学费也会受到所在城市的消费水平影响。学习时…