OpenGL【C++】台灯

请添加图片描述

#include<gl/glut.h>
#include <math.h>/**************************************/
/* 设置灯旋转角度初始值和一些所用参数   */
/**************************************/
static GLfloat yrot = -100.0;
static GLfloat zrot = 40.0;
const GLfloat PI = 3.1415926f;
const GLfloat R = 10.0f;void init()
{glClearColor(0.0, 0.0, 0.0, 0.0);glShadeModel(GL_SMOOTH);/********************************************//* 设置灯泡光源属性:环境光、镜面光、散色光   *//********************************************/GLfloat light_ambient[] = { 0.2, 0.2, 0.2, 1.0 };GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);/***************************************************************//* 设置灯泡光源(移动光源)属性:光锥切角、初始位置、聚光灯光线方向 *//***************************************************************/GLfloat light_position[] = { 13.0, -3.0, 0.0 };GLfloat spot_direction[] = { 0.0, -1.0, 0.0 };glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 40.0);glLightfv(GL_LIGHT0, GL_POSITION, light_position);glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);/********************************************************//* 设置固定光源(LIGHT1)属性:位置、环境光、镜面光、散色光 *//********************************************************/GLfloat light_position1[] = { 0.0, 20.0, 0.0, 1.0 };GLfloat light_ambient1[] = { 0.2, 0.2, 0.2, 1.0 };GLfloat light_specular1[] = { 0.1, 0.1, 0.1, 1.0 };GLfloat light_diffuse1[] = { 0.1, 0.1, 0.1, 1.0 };glLightfv(GL_LIGHT1, GL_POSITION, light_position1);glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient1);glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular1);glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse1);/************************************************//* 设置材料属性:环境光、镜面光、散色光、镜面指数 *//************************************************/GLfloat mat_ambient[] = { 0.2, 0.2, 0.2, 1.0 };GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };GLfloat mat_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };GLfloat mat_shininess[] = { 120.0 };glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);/************************************//* 调用glColorMaterial设置材料属性   *//* 设置材料属性为颜色追踪。          *//* 启用颜色追踪                     *//************************************/glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);glEnable(GL_COLOR_MATERIAL);/********************************//* 开启光源、移动光源、固定光源 *//* 开启深度测试、法向量单位化   *//********************************/glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_LIGHT1);glEnable(GL_DEPTH_TEST);glEnable(GL_NORMALIZE);}void display()
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);GLUquadricObj* objCylinder = gluNewQuadric();//画台灯底座glPushMatrix();glColor3f(0.12549, 0.69804, 0.66667);//底座使用一个立方体/*glTranslated(0.0, -20.0, 10.0);glScalef(12.0, 1.0, 12);glutSolidCube(2.0);*//*********************************************************//* 为了使法向量更多,从而使光照效果更佳,                  *//* 下面使用7*7的小立方体,拼成一个大的立方体作为台灯底座   *//*********************************************************/glTranslated(0.0, -20.0, 0.0);/*for(int m=5; m>-2; m--){for(int n=-3; n<4; n++){glPushMatrix();glTranslated(3*n, 0.0, 3*m);glScalef(1.0, 0.5, 1.0);glutSolidCube(3);glPopMatrix();}}*//* 使用200*200小立方体画台灯底座 */for (int m = 180; m > -20; m--) {for (int n = -100; n < 100; n++) {glPushMatrix();glTranslated(0.1 * n, 0.0, 0.1 * m);glScalef(1.0, 10.0, 1.0);glutSolidCube(0.1);glPopMatrix();}}glPopMatrix();/*************************************************//* 画灯杆                                         *//* 使用gluCylinder画圆柱,圆柱初试状态沿着-Z轴方向 *//**************************************************///灯杆第一段glPushMatrix();glColor3f(0.7333, 1.0, 1.0);glRotatef(90.0, 1.0, 0.0, 0.0);gluCylinder(objCylinder, 1.0, 1.0, 21.0, 100, 100);// baseRadius,topRadius, height, slices, stacksglPopMatrix();//灯杆第二段glPushMatrix();glRotatef(yrot, 0.0f, 1.0f, 0.0f);glRotatef(zrot, 0.0f, 0.0f, 1.0f);glColor3f(0.7333, 1.0, 1.0);glTranslatef(4.0, 6.93, 0.0);glRotatef(90.0, 1.0, 0.0, 0.0);glRotatef(-30.0, 0.0, 1.0, 0.0);gluCylinder(objCylinder, 1.0, 1.0, 8.0, 100, 100);// baseRadius,topRadius, height, slices, stacksglPopMatrix();//灯杆第三段glPushMatrix();glRotatef(yrot, 0.0f, 1.0f, 0.0f);glRotatef(zrot, 0.0f, 0.0f, 1.0f);glColor3f(0.7333, 1.0, 1.0);glTranslatef(4.0, 6.93, 0.0);glRotatef(90.0, 1.0, 0.0, 0.0);glRotatef(90.0, 0.0, 1.0, 0.0);gluCylinder(objCylinder, 1.0, 1.0, 10.0, 100, 100);// baseRadius,topRadius, height, slices, stacksglPopMatrix();//灯杆第四段	glPushMatrix();glRotatef(yrot, 0.0f, 1.0f, 0.0f);glRotatef(zrot, 0.0f, 0.0f, 1.0f);glColor3f(0.7333, 1.0, 1.0);glTranslatef(13, 7.23, 0.0);//6.93glRotatef(90.0, 1.0, 0.0, 0.0);gluCylinder(objCylinder, 1.0, 1.0, 5.3, 100, 100);// baseRadius,topRadius, height, slices, stacksglPopMatrix();//灯壳//画圆锥的面glPushMatrix();glRotatef(yrot, 0.0f, 1.0f, 0.0f);glRotatef(zrot, 0.0f, 0.0f, 1.0f);glColor3f(0.12549, 0.69804, 0.66667);glBegin(GL_TRIANGLE_FAN);glVertex3f(13.0f, 2.5f, 0.0f);for (GLfloat angle = 0; angle <= 2.0 * PI; angle += PI / 10.0f) {GLfloat x = 13 + R * sin(angle);GLfloat z = R * cos(angle);glVertex3f(x, -3.27, z);}glVertex3f(13.0f, -3.27, 10.0f);glEnd();glPopMatrix();//灯泡glPushMatrix();glRotatef(yrot, 0.0f, 1.0f, 0.0f);glRotatef(zrot, 0.0f, 0.0f, 1.0f);/***************************************************************//* 设置灯泡光源(移动光源)属性:光锥切角、初始位置、聚光灯光线方向 *//***************************************************************/GLfloat light_position[] = { 13.0, -3.0, 0.0 };GLfloat spot_direction[] = { 0.0, -1.0, 0.0 };glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 40.0);glLightfv(GL_LIGHT0, GL_POSITION, light_position);glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);glDisable(GL_LIGHTING);glColor3f(1.0, 0.6, 0.2);glTranslatef(13.0, -3.4, 0.0);glutSolidSphere(3.0, 100, 100);glEnable(GL_LIGHTING);glPopMatrix();glutSwapBuffers();
}void changesize(int w, int h)
{GLfloat nRange = 40.0;if (h == 0)h = 1;glViewport(0.0, 0.0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-nRange, nRange, -nRange * h / w, nRange * h / w, -nRange, nRange);elseglOrtho(-nRange * w / h, nRange * w / h, -nRange, nRange, -nRange, nRange);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(5.0, 5.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}void SpecialKeys(int key, int x, int y)
{if (key == GLUT_KEY_UP && zrot < 50.0)zrot += 5.0;if (key == GLUT_KEY_DOWN && zrot > -30.0)zrot -= 5.0;if (key == GLUT_KEY_LEFT)yrot -= 5.0f;if (key == GLUT_KEY_RIGHT)yrot += 5.0f;glutPostRedisplay();
}int main(int argc, char** argv)
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(800, 600);glutInitWindowPosition(200, 20);glutCreateWindow("台灯");init();glutDisplayFunc(display);glutReshapeFunc(changesize);glutSpecialFunc(SpecialKeys);glutMainLoop();return 0;
}

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

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

相关文章

初探鸿蒙:从概念到实践

一、鸿蒙开发的环境准备 开发工具&#xff1a;使用 DevEco Studio&#xff0c;支持 ArkTS 语法。 系统要求&#xff1a;确保计算机符合 DevEco Studio 的最低系统需求。安装步骤&#xff1a;下载 DevEco Studio&#xff0c;安装合适的 SDK 和模拟器 二、鸿蒙应用可以…

React Native 全新架构来了

React Native 0.76 现已在 npm 上以全新架构默认发布&#xff01; 在 0.76 版本的发布博客中&#xff0c;我们分享了此版本包含的一系列重大更改。在本文中&#xff0c;我们将概述全新架构以及它如何塑造 React Native 的未来。 全新架构全面支持现代 React 功能&#xff0c;…

git commit 校验

commitlint官方链接 1. npm install --save-dev commitlint/config-conventional commitlint/cli 2. 配置commitlint.config.cjs(项目根目录中&#xff09; module.exports {extends: [commitlint/config-conventional],rules: {type-enum: [2,always,[Feat, Fix, Doc, Style,…

vue2.x elementui 固定顶部、左侧菜单与面包屑,自适应 iframe 页面布局

vue elementui 固定顶部、左侧菜单与面包屑&#xff0c;自适应 iframe 页面布局 疑问点&#xff1a;iframe无法高度100%&#xff0c;如果写了100%就会有滚动条&#xff0c;所以只写了99.5% 【效果图】 路由示例 const routes [{title: Index,path: /,name: "Index"…

Coggle数据科学 | RAG编码模型对比:谁与OpenAI最为相似?

本文来源公众号“Coggle数据科学”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;RAG编码模型对比&#xff1a;谁与OpenAI最为相似&#xff1f; 在设计检索增强型生成&#xff08;RAG&#xff09;系统时&#xff0c;选择嵌入模型…

golang分布式缓存项目 Day1 LRU 缓存淘汰策略

注&#xff1a;该项目原作者&#xff1a;https://geektutu.com/post/geecache-day1.html。本文旨在记录本人做该项目时的一些疑惑解答以及部分的测试样例以便于本人复习。 LRU缓存淘汰策略 三种缓存淘汰策略 FIFO&#xff08;First In, First Out&#xff09;先进先出 原理&…

工业相机选取

1.相机分类&#xff1a; 1.1 在相机曝光方式中&#xff0c;全局曝光和卷帘曝光是两种主流技术。CCD相机通常采用全局曝光方式&#xff0c;而CMOS相机则可能采用卷帘曝光。 面阵相机与全局曝光关联与区别 关联&#xff1a;面阵相机可以使用全局曝光作为曝光方式&#xff0c;但…

如何查看电脑关机时间

要查看电脑的关机时间&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 打开事件查看器&#xff1a;按下键盘上的Windows键R键&#xff0c;然后在弹出的运行对话框中输入"eventvwr.msc"&#xff0c;并按下Enter键。 2. 在事件查看器窗口中&#xff0c;单击左侧窗…

jwt用户登录,网关给微服务传递用户信息,以及微服务间feign调用传递用户信息

1、引入jwt依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency> 2、Jwt工具类&#xff0c;生成token以及解析token package com.niuniu.gateway.uti…

SQL练习(2)

题源&#xff1a;牛客官网 选择题 假设创建新用户nkw&#xff0c;现在想对于任何IP的连接&#xff0c;仅拥有user数据库里面的select和insert权限&#xff0c;则列表语句中能够实现这一要求的语句是&#xff08;&#xff09; A grant select ,insert on *.* to nkw% B grant…

【MySQL从入门到放弃】InnoDB磁盘结构(一)

前言 从MySQL 5.5版本开始默认 使用InnoDB作为引擎&#xff0c;它擅长处理事务&#xff0c;具有自动崩溃恢复的特性&#xff0c;在日常开发中使用非常广泛。 下面是官方的InnoDB引擎架构图&#xff0c;主要分为内存结构和磁盘结构两大部分。 上一篇文章&#xff0c;我们解析了…

RT-DETR融合CVPR[2020]轻量化卷积模块Ghost Module模块

RT-DETR使用教程&#xff1a; RT-DETR使用教程 RT-DETR改进汇总贴&#xff1a;RT-DETR更新汇总贴 《GhostNet: More Features from Cheap Operations》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/abs/1911.11907 代码链接&#xff1a;GitHub - huawei-noah/Effici…

《TCP/IP网络编程》学习笔记 | Chapter 11:进程间通信

《TCP/IP网络编程》学习笔记 | Chapter 11&#xff1a;进程间通信 《TCP/IP网络编程》学习笔记 | Chapter 11&#xff1a;进程间通信进程间通信的基本概念通过管道实现进程间通信通过管道进行进程间双向通信 运用进程间通信习题&#xff08;1&#xff09;什么是进程间通信&…

2024 kali操作系统安装Docker步骤

1、更新系统 在开始之前&#xff0c;确保你的Kali系统是最新的。打开终端并运行以下命令&#xff1a; apt update 2、安装 apt install docker.io 3、查看启动状态 systemctl status docker 4、安装完 Docker 后&#xff0c;启动 systemctl start docker 5、启动并使…

LLMs之Code:Github Spark的简介、安装和使用方法、案例应用之详细攻略

LLMs之Code&#xff1a;Github Spark的简介、安装和使用方法、案例应用之详细攻略 目录 Github Spark的简介 Github Spark的安装和使用方法 1、安装 2、使用方法 Github Spark的案例应用 Github Spark的简介 2024年10月30日&#xff0c;GitHub 重磅发布GitHub Spark 是一…

MySQL数据库:SQL语言入门 【上】(学习笔记)

SQL&#xff08;Structured Query Language&#xff09;是结构化查询语言的简称&#xff0c;它是一种数据库查询和程序设计语言&#xff0c;同时也是目前使用最广泛的关系型数据库操作语言。&#xff08;95%适用于所有关系型数据库&#xff09; 【 SQL是关系型数据库通用的操作…

腾讯云nginx SSL证书配置

本章教程,记录在使用腾讯云域名nginx证书配置SSL配置过程。 一、nginx配置 域名和证书,替换成自己的即可。证书文件可以自定义路径位置。服务器安全组或者防火墙需要开放80和443端口。 server {#SSL 默认访问端口号为 443listen 443 ssl; #请填写绑定证书的域名server_name c…

使用electron-egg把vue项目在linux Ubuntu环境下打包并安装运行

electron-egg一个入门简单、跨平台、企业级桌面软件开发框架https://www.kaka996.com/electron-egg 跳转地址 1,使用 git下载代码到本地,如果没有git需要进行安装 # gitee git clone https://gitee.com/dromara/electron-egg.git # github git clone https://github.com/dro…

Nginx配置自带的stub状态实现活动监控指标

场景 为了确保应用以最佳性能和精度运行&#xff0c;需要清晰地了解有关其活动的监控指标。 NGINX 提供了多种监控选项&#xff0c;例如 stub 状态。 注&#xff1a; 博客&#xff1a;霸道流氓气质-CSDN博客 实现 启用 NGINX stub 状态 启用 NGINX HTTP 服务器内 locati…

vscode下nuget包的本地引入方法

优势&#xff1a; nuget包的本地引入可以方便打包后的本地测试&#xff0c;确保打包正确、功能完善后再上传至nuget服务端本地引入方式也极为简单&#xff0c;三步操作即可搞定&#xff0c;熟悉之后这个操作2分钟内就可以搞定 具体步骤&#xff08;以引入Epic.RobotService包…