下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、【图形学】课程作业【图形学】课程作业绘制机器架绘制球体(顶点数组和索引数组)GLfloat R =0.5f; / 半径GLfloat NumAngleZx =0; / 当前纵向度GLfloat x =0;GLfloat y =0;GLfloat z =0;NumAngleHy =angleHy *i;NumAngleZx =angleZx *j; / 起点都是轴指向的向。根据右定则决定转向,只要转向相同,那么两个就合适GLfloat x =R *cos(NumAngleHy) *cos(NumAngleZx); / 记得转化精度yaw&pitchGLfloat y =R *sin(NumAng
2、leHy);GLfloat z =R *cos(NumAngleHy) *sin(NumAngleZx);c.push_back(x);c.push_back(y);c.push_back(z);return c;std:vectorintdrawglobeEBO() std:vectorintebo;std:vectorfloatvbo =drawglobeVBO();int only =vbo.size();int num =(int)(only / (3 *statcky) *2);for (int x =0; x stlicex / 2;)for (int y =0; y vertic
3、es =drawglobeVBO();std:vectorintindices =drawglobeEBO();通过顶点缓冲对象(Vertex Buffer Objects, VBO)管理内存,使glGenBuffers函数和个缓冲ID成个VBO对象并使glBindBuffer函数把新创建的缓冲绑定到GL_ARRAY_BUFFER标上:glBindBuffer(GL_ARRAY_BUFFER, );调glBufferData函数,它会把之前定义的顶点数据复制到缓冲的内存中:glBufferData(GL_ARRAY_BUFFER, vertices.size() *sizeof(float),
4、 vertices0, GL_STATIC_DRAW);创建个VAO和创建个VBO很类似,这我声明了两个VAO对象,个是机器的个是光源的:unsigned int robotVAO, lampVAO;glGenVertexArrays(1, robotVAO);glGenVertexArrays(1, lampVAO);使glBindVertexArray绑定VAO。绑定后,绑定和配置对应的VBO和属性指针,之后解绑VAO供之后使。绘制机器的时候,在绘制物体前简单地把VAO绑定到希望使的设定上就了。/ 1. 绑定VAO/ 2. 把顶点数组复制到缓冲中供OpenGL使glBindBuffer(G
5、L_ARRAY_BUFFER, );glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);/ 3. 设置顶点属性指针./ .: 绘制代码(渲染循环中): ./ 4. 绘制物体glUseProgram(shaderProgram);glBindVertexArray(robotVAO);someOpenGLFunctionThatDrawsOurTriangle ();创建索引缓冲对象,与VBO类似,我们先绑定EBO然后glBufferData把索引复制到缓冲。同样,和VBO类似,我们会把这些函数调放在
6、绑定和解绑函数调之间,只不过这次我们把缓冲的类型定义为GL_ELEMENT_ARRAY_BUFFER。unsigned int ;glGenBuffers(1, );glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, );glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() *sizeof(int), indices0, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 *sizeof(float), (void)0);glEnableV
7、ertexAttribArray(0);绘制机器各个部位先绑定robotVAO,建model(变量名为test_head),VAO对象就是开始绘制的球体,通过缩放(scale)把个球体拉伸为个椭球体,旋转变换为交互模块所,实现通过按住按键“Z”,实现机器的转头操作。test_head =glm:scale(test_head, glm:vec3(0.8f, 1.0f, 1.2f);test_head =glm:rotate(test_head, hangle, glm:vec3(0.0f, 1.0f, 0.0f);glm:mat4 MVP =projection *view *test_hea
8、d;lightShader.use();通过球体的平移(transport)、缩放(scale),绘制机器的肩膀,并将透视、投影、模型矩阵的值传给着器。glm:mat4 test_shoulder =glm:mat4(1.0f);glBindVertexArray(robotVAO);同理可得机器的其他部位。绘制光源先定义光源位置,设定光源在机器头部正上前(0,1,2):glm:vec3 lightPos(0.0f, 1.0f, 2.0f);激活lampShader着器程序,绘制lamp。lampShader.use();glm:mat4 lamp =glm:mat4(1.0f);lamp =
9、glm:translate(lamp, lightPos);lamp =glm:scale(lamp, glm:vec3(0.2f);MVP=projection *view *lamp;lightShader.setMat4(, );glBindVertexArray(lampVAO);glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, (void)0);交互功能实现先是键盘操作,通过W、S、A、D来向前、后、左、右变换摄像头的位置,以此来实现机器的放、缩、左移和右移;通过X来实现机器路的操作,通过Z来实现机器头部的旋转
10、操作。/std:cout x! std:endl;其次是标操作,在调glfwSetInputMode函数之后,论我们怎么去移动标,光标都不会显了,它也不会离开窗。glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);为了计算俯仰和偏航,我们需要让GLFW监听标移动事件。(和键盘输相似)我们会个回调函数来完成,函数的原型如下:void mouse_callback(GLFWwindow*window, double xpos, double ypos)if (firstmouse) lastX =xpos;lastY =ypos;
11、firstmouse =false;float xoffset =xpos - lastX;float yoffset =lastY - ypos;lastX =xpos;lastY =ypos;camera.ProcessMouseMovement(xoffset, yoffset);这的xpos和ypos代表当前标的位置。当我们GLFW注册了回调函数之后,标移动mouse_callback函数就会被调:glfwSetCursorPosCallback(window, mouse_callback);使标的滚轮来放。与标移动、键盘输样,我们需要个标滚轮的回调函数:void scroll_callback(GLFWwindow*window, double xoffset, double yoffset)camera.ProcessMouseScroll(yoffset);添加光照环境光照:光的颜乘以个很的常量环境因,再乘以物体的颜,然后将最终结果作为段的颜。漫反射:光的向向量是光源位置向量与段位置向量之间的向量差,并且对向量进标准化。对norm和lightDir向量进点乘,计算光源对当前段实际的漫发射影响。结果值再乘以光的颜,得到漫反射分量。两个向量之间的度越,漫反射分量就会越。如果两个向量之间的度于90度,点乘的结果就会变
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 叉车采购 合同范例
- 私人餐厅员工合同范例
- 简约供需合同范例
- 英文服装购买合同范例
- 仓库暂扣物品拍卖合同范例
- 电动车加油站转让合同范例
- 展台展柜定制合同范例
- 租赁客车合同范例
- 装裱纸张购买合同范例
- 台州灯光音响租赁合同范例
- 三年级上册数学教案 - 6.2整理与提高(解决问题-灯市) 沪教版
- 锅炉水处理技术和锅炉加药技术15
- 《安全管理学》word版
- 氯氢处理装置工艺
- 生物工程论文 年产6万吨11°P啤酒厂发酵车间工艺设计
- 通力电梯KCE电气系统学习指南
- windows7 操作系统
- 门窗施工组织设计与方案
- 钢筋统计表(插图有尺寸)
- 食品安全管理体系培训系列教材(共44页).ppt
- 世界各地的新年习俗(课堂PPT)
评论
0/150
提交评论