计算机图形学透视投影知识点,计算机图形学
计算机图形学期末复习
第一章 绪论
对于计算机图形学的定义而言
第二章 计算机设备及硬件系统
知识点
阴极射线管(CRT)
光栅扫描图形显示器:垂直回扫、水平回扫
液晶显示器:
工作原理:基于液晶细胞的光学响应特性,在其内部施加电压信号以调节液晶分子的空间排列。这种操作会导致入射光信号的空间和时间调制。随后,在透过或反射方向观察时会发现,在施加特定电压时会观察到特定的状态变化;特别地,在某些应用中可以通过这种方式实现信息编码功能。
通过调节液晶电场的变化状态,能够引起光线强度的增减波动,并进而实现信息显示的目标。

光栅扫描图形显示子系统的结构(p35)
重要部件:帧缓冲存储器、显示控制器
帧缓存单元(显存):用于保存图像像素颜色信息的存储器单元,可直接由图形处理器(GPU)访问
显示控制模块:根据预设的工作模式从显存中读取数据,并转换为三原色后通过同步信号发送至显示器


注意事项
液晶显示器的亮度没有CRT的高
扫描转换过程:像素信息从应用程序转化并放入帧缓冲区的过程
第四章 图形的表示与数据结构
基本元素:
定义:指可以用一定的几何参数和属性参数描述的最基本的图形元素
组成:点、线、面、环、体等
几何信息与拓扑信息:
几何信息:一般指形体在欧氏空间的位置和大小
拓扑信息:形体各分量(点、线、面)的数目及相互间的连接关系(9中拓扑关系)
第五章 基本图形生成算法
直线扫描转换:
数值微分法(DDA)
中点Bresenham算法
Bresenham算法
判别式
无
有,取中点,判别d
有,判别误差e
取舍
四舍五入,有误差
不做四舍五入
不作除法、无四舍五入
多边形的扫描转换/多边形填充:
定义:从多边形顶点表示到点阵表示
x扫描线算法:左闭右开的原则
改进的有效边表算法(y连贯性算法):
边缘填充算法
区域填充算法
反走样:
走样(图形失真):离散量表示连续量而引起的失真
反走样(图形保真技术):用于减少或消除走样的现象的技术
造成走样的根本原因是线性图形在数学上的精确表示是连续的。然而,在光栅显示器上呈现出来的图形却并非如此连续,在其视觉呈现中是由许多小方块拼接而成的具体图像
避免走样的方法:
过取样(后滤波):使用高于显示分辨率的高分辨率层通过点采样法进行计算,在获得多个像素属性后实施求平均处理以获得对应于较低分辨率下的像素属性
区域采样(前滤波):基于图形对象在每个像素点上的覆盖率来决定其亮度值的一种计算方式
第六章 二维变换级二维观察
二维变换
基本几何变换都是相对于坐标原点和坐标轴进行的
裁剪
直线段裁剪:编码裁剪、中点分割裁剪、梁友栋算法
多边形裁剪:
第七章 三维变换及三维观察
三维变换
注意:三维变换中,绕y轴的旋转变换的特殊
三维观察
(规定以逆时针旋转方向为正向;三视图:以Z轴正向朝上)
平面几何投影:
透视投影:投影中心到投影面的距离有限
平行投影:投影中心到投影面的距离无限
正投影:三视图、正轴侧投影(对任意平面做投影)
斜投影:投影方向不垂直于投影面;投影方向和投影面成45°

投影在x0y平面
正轴测投影变换矩阵:

斜轴测投影变换矩阵:
α=45°,β=30°或者45°

透视投影
投影矩阵:(中间的为透视变换矩阵)


主灭点:坐标轴方向的平行线在投影面上形成的灭点
根据主灭点个数分为:一点透视、二点透视、三点透视
观察坐标系:
OpenGL中的变换
OpenGL投影变换函数:该函数用于确定观察坐标系的标准位置和方向,默认情况下视点位于原点,默认情况下观察方向指向Z轴负向。
该函数定义了一个观察方向矩阵的坐标设置操作。
它接收多个双精度浮点数值参数,
包括眼点坐标、中心坐标以及上下向量的各个分量。
OpenGL投影函数:
平行投影:

透视投影:

第八章 曲线与曲面
样条曲线中的边界条件:自由端、夹持端、抛物端
样条曲线:
概念:是由多项式曲线段构成的曲线,在各连接点处满足连续性要求
hermite插值样条:
可以局部调整,因为每个曲线段仅依赖于端点约束
当曲线两端点及其端点处的切线方向被确定后,在给定不同切线长度的情况下,则会产生不同形状的Hermite曲线。
Bezier曲线/曲面:
是一个阶数比控制点少一的多项式
只有第一个点和最后一个点在曲线上
不能对曲线形状进行局部控制,任意改变一控制点,整条曲线受影响
Bezier曲线的性质:
端点:曲线总是通过起点和终点
一阶微分:起始点的切线由头两个控制点连接而成,在结束点处的切线则由尾端的两个控制点连接而成。
该曲线在起始点及终点处的r阶导数由起点或终点及其各自所对应的r-1个相邻控制点确定
对称性
凸包性:
几何不变性质:曲线的形态仅由控制多边形顶点间的相对位置关系决定,并不受坐标系选择的影响
变差减少性:曲线比控制多边形更加光滑
控制顶点变化对曲线形状的影响
B样条曲线/曲面:
性质:

第九、十章 消隐、真实感图形绘制
消隐
该消隐算法的核心机制是对物体表面进行处理的过程。其基本原理是通过计算所有k个多边形之间的关系来确定各棱边及表面之间的遮挡顺序(多边形区域排序算法)。
图像空间消隐法:对于屏幕上的每个像素而言,在其对应的投影位置上确定物体表面哪些多边形是可见的(例如基于深度缓存的方法)
简单光照模型
入射光=反射光+透射光+散射光+吸收光
简单光反射模型=漫反射光+环境光+镜面反射光
环境光:是由光在物体与周围环境之间发生多次反射所形成的。其特点在于:它并非直接由光源发出而是由周围的环境对光线进行反射。具体而言,在这种情况下照射在物体表面的光线来自周围各个不同方向,并且均匀地向四周各个方向反射。
Ie=Ia·Ka

漫反射光线:指在入射光线的影响下,在物体表面镜面反射出均匀地朝各个方向散射的光线
Id=Ip·Kd·cos(a)

镜面反射光:镜面反射是单一光源照射到物体光泽表面(如平面镜、金属光滑面等)所引起的反射光线现象。其显著特征在于光线源自单一光源方向,并沿着特定的方向(即反射路径)传播。


OpenGL绘制函数:
OpenGL消隐处理:

OpenGL光照与材质:


OpenGL纹理贴图:

程序设计
编码裁剪
//编码定义
char clipCode(const GPoint2d &pt, const GRect2d &rc)
{
char code = 0;
if(pt.y() > rc.y1()) code |= 0x01;
else if(pt.y() < rc.y0()) code |= 0x02;
if(pt.x() > rc.x1()) code |= 0x04;
else if(pt.x() < rc.x0()) code |= 0x08;
return code;
}
//裁剪
bool gltLineClip2d(GPoint2d &pt0, GPoint2d &pt1, const GRect2d &rc)
{
char c0, c1;
while(true)
{
c0 = clipCode(pt0, rc);
c1 = clipCode(pt1, rc);
if((c0 & c1) != 0) return false;//按位与,两点在同一个测
if(c0 == 0 && c1 == 0) return true;//两点在窗口内
if(c0 == 0)
{
swap(pt0, pt1);
swap(c0, c1);
}
if(c0 & 0x01) // 在 Yt 之上
{
pt0.setX(pt0.x()-(pt0.y()-rc.y1())*(pt0.x()-pt1.x())/(pt0.y()-pt1.y()));
pt0.setY(rc.y1());
}
else if(c0 & 0x02) // 在 Yb 之下
{
pt0.setX(pt0.x()-(pt0.y()-rc.y0())*(pt0.x()-pt1.x())/(pt0.y()-pt1.y()));
pt0.setY(rc.y0());
}
else if(c0 & 0x04) // 在 Xr 之右
{
pt0.setY(pt0.y()-(pt0.x()-rc.x1())*(pt0.y()-pt1.y())/(pt0.x()-pt1.x()));
pt0.setX(rc.x1());
}
else if(c0 & 0x08) // 在 Xl 之左
{
pt0.setY(pt0.y()-(pt0.x()-rc.x0())*(pt0.y()-pt1.y())/(pt0.x()-pt1.x()));
pt0.setX(rc.x0());
}
}
}
Bezier曲线
//bezier的Castel推分算法
double bezierCastel(double x[],int n,double t){
for(int r=1;r
for(int i=0;i
x[i] = (1-t)x[i]+tx[i+1];
}
}
return x[0];
}
void gltBezier2d(const GPoint2dArray &points){
if(points.count<2)
return;
double x0,y0,x1,y1;
double t,dt;
GPoint2d pt;
int n = points.count();
dt = 1.0f/(n*20);
double *x = new double[n];
double *y = new double[n];
pt = points.at(0);
x0 = pt.x();
y0 = pt.y();
for(int i = 0;i
pt = points.at(i);
x[i] = pt.x();
y[i] = pt.y();
}
for(t=dt;t<1;t+=dt){
x1 = bezierCastel(x,n,t);
y1 = bezierCastel(y,n,t);
gltLine2d(x0,y0,x1,y1);
x0 = x1;
y0 = y1;
}
pt = points.at(n-1);
gltLine2d(x0,y0,pt.x().pt.y());
delete []x;
delete []y;
}
B样条曲线
//b样条基函数
void cubicBSplineBase(int begin, const std::variant>GPoint2dArray& points, double t, std::variant
float fh1 = (-ttt+3tt-3*t+1)/6;
float fh2 = (3ttt-6t*t+4)/6;
float fh3 = (-3ttt+3tt+3t+1)/6;
float fh4 = (ttt)/6;
GPoint pt0 = points.at(begin);
GPoint pt1 = points.at(begin+1);
GPoint pt2 = points.at(begin+2);
Gpoint pt3 = points.at(begin+3);
pt.setX(fh1 * pt0.x() + fh2 * pt1.x() +fh3 * pt2.x() + fh4 * pt3.x());
pt.setY(fh1 * pt0.y() + fh2 * pt1.y() +fh3 * pt2.y() + fh4 * pt3.y());
}
void gltBSpline2d(const GPoint2dArray &points){
if(points.count()<4)
return ;
double x0,y0;
double t,dt;
GPoint pt;
int n = points.count();
dt = 0.05;
for(int i=0;i
cubicBSplineBase(i,points,0,pt);
x0 = pt.x();
y0 = pt.y();
for(t=dt;t<1;t+=dt){
cubicBsplineBase(i,points,t,pt);
gltLine2d(x0,y0,pt.x(),pt.y());
x0 = pt.x();
y0 = pt.y();
}
cubicBSplineBase(i,points,t,pt);
gltLine2d(x0,y0,pt.x(),pt.y());
}
}
标签:计算机,曲线,图形学,算法,rc,c0,pt1,pt0
