计算机图形学学习指南

一、概述

计算机图形学是计算机科学与技术专业的关键限选课,主要研究图形显示及表示的原理与方法。在计算机绘画、动画、游戏设计、虚拟现实等领域,它都发挥着重要作用。其核心在于探索如何在计算机中表示图形,以及进行图形计算、处理和显示的原理与算法。图形由点、线、面、体等几何元素,以及灰度、色彩、线型等非几何属性组成。计算机图形学的目标是生成逼真的图形,这需要构建场景几何表示,并利用光照模型计算特定光源、纹理和材质下的光照效果。其研究范畴广泛,包括图形硬件、标准、交互技术,以及光栅图形生成、曲线曲面造型等众多方向。

二、学习目标

通过本课程的学习,学生需掌握计算机图形应用的基础原理和特殊处理方法,熟悉图形领域的分析、建模及程序设计知识,能够针对实际问题提供合适的模型与解决方案,提升运用计算机分析和解决问题的实践能力。

三、学习资料

(一)教材

  1. 《计算机图形学(第四版)》,Donald Hearn 等著,电子工业出版社。该书系统全面地介绍计算机图形学的基本概念、算法和技术,涵盖从基础图形生成到复杂场景渲染内容,配备丰富示例和习题,适合初学者。
  1. 《交互式计算机图形学:基于 OpenGL 的自顶向下方法(第七版)》,Edward Angel 等著,机械工业出版社。以 OpenGL 为工具,通过大量实例讲解交互式图形学,有助于读者掌握图形编程技能。

(二)在线课程

  1. Coursera 上的 “Computer Graphics” 课程,由知名高校教授授课,提供视频教程、作业和项目实践,深入讲解核心概念和算法。
  1. 中国大学 MOOC 平台上的 “计算机图形学” 课程,由国内高校优秀教师团队讲授,结合国内教学特点和案例,梳理知识体系。

(三)学术论文与研究报告

  1. ACM SIGGRAPH 会议论文集,是计算机图形学领域顶尖会议成果,能让学习者了解前沿研究动态。
  1. IEEE Transactions on Visualization and Computer Graphics 期刊,发表大量高质量论文,涵盖图形学各研究方向,便于深入研究特定领域问题。

四、学习大纲

(一)基础数学知识复习(可根据学生基础安排自学或简要讲解)

  1. 向量运算
    • 向量加法、减法、数乘:向量相加是对应坐标相加,如向量 a (x1, y1, z1) 与向量 b (x2, y2, z2) 相加,结果为 (x1 + x2, y1 + y2, z1 + z2) ;减法类似,数乘是向量每个坐标与数相乘。
    • 向量点积与叉积:点积结果是两向量模长与夹角余弦值的乘积,用于计算向量投影等;叉积结果是一个向量,其方向垂直于原两向量所在平面,常用于求平面法向量等。
  1. 矩阵运算
    • 矩阵加法、减法、乘法:同型矩阵对应元素相加减;矩阵乘法要求前一矩阵列数等于后一矩阵行数,新矩阵元素由对应行和列元素相乘再相加得到。
    • 矩阵的逆与转置:方阵 A 若存在矩阵 A⁻¹,使 AA⁻¹ = A⁻¹A = I(单位矩阵),则 A⁻¹ 为 A 的逆矩阵;矩阵 A 的转置 AT,是将 A 的行列互换。
  1. 几何变换基础
    • 平移变换:在坐标上加上平移向量实现。点 P (x, y) 沿 x 轴平移 tx,沿 y 轴平移 ty,变换后的点 P'(x + tx, y + ty) 。
    • 旋转变换:绕某点旋转一定角度。以绕原点旋转 θ 角为例,二维点 P (x, y) 变换后的点 P'(x * cosθ - y * sinθ, x * sinθ + y * cosθ) 。
    • 缩放变换:对坐标进行比例缩放。点 P (x, y) 在 x 方向缩放 sx,在 y 方向缩放 sy,变换后的点 P'(x * sx, y * sy) 。

(二)基本图形生成算法

  1. 直线生成算法
    • 数值微分法(DDA) :一个方向坐标取单位步长变化,计算另一方向坐标相应变化值。当直线斜率绝对值小于 1 时,x 每次增加 1,y 增加斜率值;斜率绝对值大于等于 1 时,y 每次增加 1,x 相应变化。该算法直观但涉及浮点数运算,效率较低。
    • Bresenham 画线算法:通过误差项判断选择与实际直线更接近的像素点。每一步根据误差项决定 y 坐标是否增加,仅用整数运算,效率高。
    • 代码示例(JavaScript 实现 Bresenham 画线算法)
 

js

代码解读

复制代码

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Bresenham Line Drawing</title> </head> <body> <canvas id="canvas" width="800" height="600"></canvas> <script> function bresenhamLine(x0, y0, x1, y1) { const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); let dx = Math.abs(x1 - x0); let dy = Math.abs(y1 - y0); let sx = x0 < x1? 1 : -1; let sy = y0 < y1? 1 : -1; let err = dx - dy; while (true) { ctx.fillRect(x0, y0, 1, 1); if (x0 === x1 && y0 === y1) break; let e2 = 2 * err; if (e2 > -dy) { err -= dy; x0 += sx; } if (e2 < dx) { err += dx; y0 += sy; } } } bresenhamLine(100, 100, 500, 300); </script> </body> </html>

  1. 圆生成算法
    • 中点画圆算法:基于圆的对称性,仅计算 1/8 圆弧,再通过对称得到整个圆。从 (0, R) 开始,每次根据中点与圆的位置关系决定下一个点。若中点在圆内,选右方点;若在圆外或圆上,选右下方点。
    • Bresenham 画圆算法:通过误差项决定选择距离理想圆周最近的点。从 (0, R) 开始,根据误差项的值决定下一个点的选择。
    • 代码示例(JavaScript 实现中点画圆算法)
 

js

代码解读

复制代码

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Midpoint Circle Drawing</title> </head> <body> <canvas id="canvas" width="800" height="600"></canvas> <script> function midpointCircle(radius, xc, yc) { const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); let x = 0; let y = radius; let d = 1 - radius; while (x <= y) { ctx.fillRect(xc + x, yc + y, 1, 1); ctx.fillRect(xc - x, yc + y, 1, 1); ctx.fillRect(xc + x, yc - y, 1, 1); ctx.fillRect(xc - x, yc - y, 1, 1); ctx.fillRect(xc + y, yc + x, 1, 1); ctx.fillRect(xc - y, yc + x, 1, 1); ctx.fillRect(xc + y, yc - x, 1, 1); ctx.fillRect(xc - y, yc - x, 1, 1); if (d < 0) { d += 2 * x + 3; } else { d += 2 * (x - y) + 5; y--; } x++; } } midpointCircle(100, 400, 300); </script> </body> </html>

  1. 多边形填充算法(扫描线填充算法)
    • 原理:按扫描线顺序,计算扫描线与多边形边的交点,将交点按 x 坐标排序,两两配对,填充配对交点之间的像素。
    • 实现步骤
      • 构建边表(ET):存储多边形每条边的端点、斜率、与扫描线初始交点等信息。
      • 初始化活性边表(AET):存储当前扫描线与多边形相交的边。
      • 逐行扫描:从多边形最小 y 值扫描到最大 y 值,更新 AET,对 AET 中的边按 x 坐标排序,配对交点并填充区域。
    • 代码示例(JavaScript 实现简单扫描线填充算法,假设多边形顶点按顺时针或逆时针顺序存储)
 

js

代码解读

复制代码

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Scanline Fill</title> </head> <body> <canvas id="canvas" width="800" height="600"></canvas> <script> function scanlineFill(polygon) { const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); let minY = Math.min(...polygon.map(p => p[1])); let maxY = Math.max(...polygon.map(p => p[1])); let edgeTable = {}; for (let i = 0; i < polygon.length; i++) { let p1 = polygon[i]; let p2 = polygon[(i + 1) % polygon.length]; if (p1[1] > p2[1]) { [p1, p2] = [p2, p1]; } if (p1[1]!== p2[1]) { let m = (p2[0] - p1[0]) / (p2[1] - p1[1]); for (let y = p1[1]; y <= p2[1]; y++) { let x = p1[0] + (y - p1[1]) * m; if (!edgeTable[y]) { edgeTable[y] = []; } edgeTable[y].push(x); } } } for (let y = minY; y <= maxY; y++) { if (edgeTable[y]) { edgeTable[y].sort((a, b) => a - b); for (let i = 0; i < edgeTable[y].length; i += 2) { let x1 = Math.floor(edgeTable[y][i]); let x2 = Math.floor(edgeTable[y][i + 1]); for (let x = x1; x <= x2; x++) { ctx.fillRect(x, y, 1, 1); } } } } } let polygon = [[200, 200], [300, 100], [400, 200], [300, 300]]; scanlineFill(polygon); </script> </body> </html>

这份指南结合 JavaScript 实现图形算法,更便于在多种场景使用。若你还想添加其他内容,如进阶算法、案例拓展,欢迎随时告诉我。

原文:https://juejin.cn/post/7495660376579997722

第1章绪论 1.1计算机图形学及其相关概念 1.2计算机图形学的发展 1.2.1计算机图形学学科的发展 1.2.2图形硬件设备的发展 1.2.3图形软件的发展 1.3计算机图形学的应用 1.3.1计算机辅助设计与制造 1.3.2计算机辅助绘图 1.3.3计算机辅助教学 1.3.4办公自动化和电子出版技术 1.3.5计算机艺术 1.3.6在工业控制及交通方面的应用 1.3.7在医疗卫生方面的应用 1.3.8图形用户界面 1.4计算机图形学研究动态 1.4.1计算机动画 1.4.2地理信息系统 1.4.3人机交互 1.4.4真实感图形显示 1.4.5虚拟现实 1.4.6科学计算可视化 1.4.7并行图形处理 第2章计算机图形系统及图形硬件 2.1计算机图形系统概述 2.1.1计算机图形系统的功能 2.1.2计算机图形系统的结构 2.2图形输入设备 2.2.1键盘 2.2.2鼠标器 2.2.3光笔 2.2.4触摸屏 2.2.5操纵杆 2.2.6跟踪球和空间球 2.2.7数据手套 2.2.8数字化仪 2.2.9图像扫描仪 2.2.10声频输入系统 2.2.11视频输入系统 2.3图形显示设备 2.3.1阴极射线管 2.3.2CRT图形显示器 2.3.3平板显示器 2.3.4三维观察设备 2.4图形显示子系统 2.4.1光栅扫描图形显示子系统的结构 2.4.2绘制流水线 2.4.3相关概念 2.5图形硬拷贝设备 2.5.1打印机 2.5.2绘图仪 2.6OpenGL图形软件包 2.6.1OpenGL的主要功能 2.6.2OpenGL的绘制流程 2.6.3OpenGL的基本语法 2.6.4一个完整的OpenGL程序 第3章用户接口与交互式技术 3.1用户接口设计 3.1.1用户模型 3.1.2显示屏幕的有效利用 3.1.3反馈 3.1.4一致性原则 3.1.5减少记忆量 3.1.6回退和出错处理 3.1.7联机帮助 3.1.8视觉效果设计 3.1.9适应不同的用户 3.2逻辑输入设备与输入处理 3.2.1逻辑输入设备 3.2.2输入模式 3.3交互式绘图技术 3.3.1基本交互式绘图技术 3.3.2三维交互技术 3.4OpenGL中橡皮筋技术的实现 3.4.1基于鼠标的实现 3.4.2基于键盘的实现 3.5OpenGL中拾取操作的实现 3.6OpenGL的菜单功能 第4章图形的表示与数据结构 4.1基本概念 4.1.1基本图形元素 4.1.2几何信息与拓扑信息 4.1.3坐标系 4.1.4实体的定义 4.1.5正则集合运算 4.1.6平面多面体与欧拉公式 4.2三维形体的表示 4.2.1多边形表面模型 4.2.2扫描表示 4.2.3构造实体几何法 4.2.4空间位置枚举表示 4.2.5八叉树 4.2.6BSP树 4.2.7OpenGL中的实体模型函数 4.3非规则对象的表示 4.3.1分形几何 4.3.2形状语法 4.3.3粒子系统 4.3.4基于物理的建模 4.3.5数据场的可视化 4.4层次建模 4.4.1段与层次建模 4.4.2层次模型的实现 4.4.3OpenGL中层次模型的实现 第5章基本图形生成算法 5.1直线的扫描转换 5.1.1数值微分法 5.1.2中点Bresenham算法 5.1.3Bresenham算法 5.2圆的扫描转换 5.2.1八分法画圆 5.2.2中点Bresenham画圆算法 5.3椭圆的扫描转换 5.3.1椭圆的特征 5.3.2椭圆的中点Bresenham算法 5.4多边形的扫描转换与区域填充 5.4.1多边形的扫描转换 5.4.2边缘填充算法 5.4.3区域填充 5.4.4其他相关概念 5.5字符处理 5.5.1点阵字符 5.5.2矢量字符 5.6属性处理 5.6.1线型和线宽 5.6.2字符的属性 5.6.3区域填充的属性 5.7反走样 5.7.1过取样 5.7.2简单的区域取样 5.7.3加权区域取样 5.8在OpenGL中绘制图形 5.8.1点的绘制 5.8.2直线的绘制 5.8.3多边形面的绘制 5.8.4OpenGL中的字符函数 5.8.5OpenGL中的反走样 第6章二维变换及二维观察 6.1基本概念 6.2基本几何变换 6.2.1平移变换 6.2.2比例变换 6.2.3旋转变换 6.2.4对称变换 6.2.5错切变换 6.2.6二维图形几何变换的计算 6.3复合变换 6.3.1二维复合平移变换和比例变换 6.3.2二维复合旋转变换 6.3.4其他二维复合变换 6.3.5相对任一参考点的二维几何变换 6.3.6相对于任意方向的二维几何变换 6.3.7坐标系之间的变换 6.3.8光栅变换 6.3.9变换的性质 6.4二维观察 6.4.1基本概念 6.4.2?用户坐标系到观察坐标系的变换 6.4.3?窗口到视区的变换 6.5?裁剪 6.5.1?点的裁剪 6.5.2直线段的裁剪 6.5.3多边形的裁剪 6.5.4其他裁剪 6.6OpenGL中的二维观察变换 第7章三维变换及三维观察 7.1三维变换的基本概念 7.1.1几何变换 7.1.2三维齐次坐标变换矩阵 7.1.3平面几何投影 7.2三维几何变换 7.2.1三维基本几何变换 7.2.2三维复合变换 7.3三维投影变换 7.3.1正投影 7.3.2斜投影 7.4透视投影 7.4.1一点透视 7.4.2二点透视 7.4.3三点透视 7.5观察坐标系及观察空间 7.5.1观察坐标系 7.5.2观察空间 7.6三维观察流程 7.6.1用户坐标系到观察坐标系的变换 7.6.2平行投影的规范化投影变换 7.6.3透视投影的规范化投影变换 7.7三维裁剪 7.7.1关于规范化观察空间的裁剪 7.7.2齐次坐标空间的裁剪 7.8OpenGL中的变换 7.8.1矩阵堆栈 7.8.2模型视图变换 7.8.3投影变换 7.8.4实例 第8章曲线与曲面 8.1基本概念 8.1.1曲线/曲面数学描述的发展 8.1.2曲线/曲面的表示要求 8.1.3曲线/曲面的表示 8.1.4插值与逼近 8.1.5连续性条件 8.1.6样条描述 8.2三次样条 8.2.1自然三次样条 8.2.2Hermite插值样条 8.3Bezier曲线/曲面 8.3.1Bezier曲线的定义 8.3.2Bezier曲线的性质 8.3.3Bezier曲线的生成 8.3.4Bezier曲面 8.4B样条曲线/曲面 8.4.1B样条曲线 8.4.2B样条曲线的性质 8.4.3B样条曲面 8.5有理样条曲线/曲面 8.5.1NURBS曲线/曲面的定义 8.5.2有理基函数的性质 8.5.3NURBS曲线/曲面的特点 8.6曲线/曲面的转换和计算 8.6.1样条曲线/曲面的转换 8.6.2样条曲线/曲面的离散生成 8.7OpenGL生成曲线/曲面 8.7.1Bezier曲线/曲面函数 8.7.2GLU中的B样条曲线/曲面函数 第9章消隐 9.1深度缓存器算法 9.2区间扫描线算法 9.3深度排序算法 9.4区域细分算法 9.5光线投射算法 9.6BSP树 9.7多边形区域排序算法 9.8OpenGL中的消隐处理 第10章真实感图形绘制 10.1简单光照模型 10.1.1环境光 10.1.2漫反射光 10.1.3镜面反射光 10.1.4光强衰减 10.1.5颜色 10.2基于简单光照模型的多边形绘制 10.2.1恒定光强的多边形绘制 10.2.2Gouraud明暗处理 10.2.3Phong明暗处理 10.3透明处理 10.4产生阴影 10.5模拟景物表面细节 10.5.1用多边形模拟表面细节 10.5.2纹理的定义和映射 10.5.3凹凸映射 10.6整体光照模型与光线追踪 10.6.1整体光照模型 10.6.2Whitted光照模型 10.6.3光线跟踪算法 10.6.4光线跟踪反走样 10.7 OpenGL中的光照与表面绘制函数 10.7.1 OpenGL点光源 10.7.2 OpenGL全局光照 10.7.3 OpenGL表面材质 10.7.4 OpenGL透明处理 10.7.5 OpenGL表面绘制 10.7.6 实例 10.8 OpenGL中的纹理映射
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值