HNU计算机图形学-作业一

任务一:创建交互式三维场景

前言

完整工程文件

具体运行环境配置看这个栏目的第一篇文章

专选课计算机图形学的第一次作业,老师是第一次给本科生上课,用的作业是香港中文大学的计算机图形学的作业内容(老师就是这个学校毕业)。第一次接触OpenGL,一开始也没学什么高级的技术,所以就简单画了一些图形的组合,只学了一周不到,写这篇文章主要为了记录和分享所学内容(毕竟也花费了很多时间的专选),代码格式也比较混乱,很多重复的部分,比如定义顶点的信息等等,凑合看看吧。

下面是作业文档的要求

介绍

第一个编程任务将向您介绍OpenGL图形编程接口和可编程管道。在这个编程任务中,您需要创建一个具有用户交互的3D场景(参见图1中的好例子)。本作业旨在将您对计算机图形概念的理解应用于实践,熟悉OpenGL编程库,并向您介绍可编程管道。

在这里插入图片描述

您的目标是设计具有用户交互的3D场景。具体来说,在场景中,必须有2D对象(例如平面)、3D对象(例如立方体)和/或线(点)(示例见图2),并且您应该能够对其应用包括平移、旋转和缩放在内的变换。用户应该能够使用键盘(和/或鼠标)平移、旋转和缩放对象。对象颜色、窗口大小、窗口标题和场景布局都取决于您。要使场景更逼真,应使用透视投影而不是正交投影。需要使用索引绘制对象。您 的3D场景不受演示图片和程序的限制。

在这里插入图片描述

实施详细信息

我们提供了两个着色器程序(即VertexShaderCode.glsl和FragmentShaderCode.glsl)和一个模板主程序 (即main.cpp)。它们包括GLFW接口工具包中用于事件处理函数的必要函数。使用此模板作为实施的基础。你必须设计你的函数来处理键盘事件,你还应该提交一个readme.txt文件来解释你在程序中设计的键盘(和/或鼠标)事件。否则,将扣除相关项目的分数。所有程序都应符合合理的编程标准:标题注释、在线注释、良好的模块化、清晰的打印输出和效率。

基本要求:

  1. OpenGL代码应该使用OpenGL 3.0+的可编程管道,而不是固定管道。

  2. 至少绘制一个二维对象和两个三维对象。

  3. 确保至少绘制了一个带有索引的对象。

  4. 创建至少三种键盘和/或鼠标事件,如旋转、平移和缩放。

  5. 使用给定的透视投影(45.0 degree, any aspect, 0.1, 20.0)绘制场景。

  6. 启用深度测试以实现遮挡。

其他自我设计要求:

可以自由添加对象、移动对象、组织对象,以及任何使场景有趣的内容

分级方案

您的作业将根据以下评分方案进行评分:

在这里插入图片描述

实现效果

在这里插入图片描述

鼠标 “移动”:转动整个布局视角
鼠标 “滑轮”:上滑放大视角,下滑缩小视角
Key “Esc”: exit
Key “W”: 视角前移
Key “A”: 视角左移
Key “S”: 视角后移
Key “D”: 视角右移
Key “UP”: 人物上移
Key “DOWN”: 人物下移
Key “LEFT”: 人物左移
Key “RIGHT”: 人物右移
Key “SPACE”: 人物跳跃
Key “ENTER”: 人物身体换色
Key “Q”: 透视投影参数宽高比增大
Key “E”: 透视投影参数宽高比减小

说明:左下角和右上角有两个传送门,人物走到对应位置可以传到相应传送门。
人物只能在棋盘内活动,超过布局大小时会移动到对面的位置

最后再说一下因为是第一次做,所以很多地方有重复的部分(比如很多个for循环),

### 关于HNU中的凸包算法与计算几何 在计算几何领域,凸包算法是种用于寻找组点集中最小包围区域的技术。这技术广泛应用于计算机图形学、地理信息系统以及机器人运动规划等领域[^1]。 #### 凸包算法简介 凸包可以被理解为包裹给定点集合的个最小凸多边形。对于二维平面上的组离散点 \(P\),其目标是最有效地找到这些点的边界点,并按照顺时针或逆时针顺序排列它们。经典的凸包算法包括 Graham 扫描法和 Jarvis 步进法(也称为 Gift Wrapping Algorithm)。Graham 扫描法的时间复杂度通常为 \(O(n \log n)\),而 Jarvis 步进法则依赖于输入数据的特点,在最坏情况下达到 \(O(nh)\) 的时间复杂度,其中 \(n\) 是点的数量,\(h\) 是最终凸包上的顶点数量。 #### 并查集(Union-Find)的作用 尽管并查集本身并不是直接解决凸包问题的核心工具,但在某些特定场景下,它能够辅助处理涉及动态连通性的子问题。例如,在构建复杂的几何图结构或者检测平面划分中的重叠区域时,可以通过路径压缩和按秩合并优化查找效率[^2]。这种高效的集合操作机制使得 Union-Find 成为了许多高级算法的基础组件之。 #### 数学基础的重要性 值得注意的是,无论是实现高效的数据结构还是设计精妙的几何算法,坚实的数学功底始终不可或缺。特别是在面对诸如洛必达法则陷阱题、条件概率应用或是矩阵运算等问题时,只有深刻理解背后的原理才能避免常见错误[^3]。因此,在学习过程中不仅要掌握具体方法论,还需要不断巩固相关理论知识。 ```python def graham_scan(points): """ 使用Graham扫描法计算凸包 """ def polar_angle(p0, p1=None): if p1 is None: p1 = anchor y_span = p0[1]-p1[1] x_span = p0[0]-p1[0] return math.atan2(y_span,x_span) points.sort(key=lambda point:(point[0],point[1])) # 寻找最低左端点作为锚点 min_index=0 for i,(x,y)in enumerate(points): if (y<points[min_index][1])or\ ((y==points[min_index][1])and(x<points[min_index][0])): min_index=i anchor=points.pop(min_index) # 对剩余点基于极角排序 sorted_points=[anchor]+sorted(points,key=polar_angle) stack=[sorted_points[i]for i in range(3)] for pt in sorted_points[3:]: while len(stack)>1 and cross_product(stack[-2],stack[-1],pt)<=0: stack.pop() stack.append(pt) return stack # 辅助函数:叉积计算 def cross_product(o,a,b): return (a[0]-o[0])*(b[1]-o[1])-(a[1]-o[1])*(b[0]-o[0]) ``` 上述代码展示了如何利用 Python 实现种常见的凸包算法——Graham Scan 方法。通过该示例可以看出,即使是在看似简单的任务背后也可能隐藏着丰富的细节考量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值