《3D数学基础:图形与游戏开发》
这本书关于数学部分的讲解浅显易懂,不过最大的反常点是使用左手坐标系以及使用行向量来表示矩阵。按照代码出现的章节,可以将这本书的内容分成4部分:
v
和方阵M = [P Q R]T
,则v' = v * M = xP + yQ + zR
。如果P
、Q
和 R
线性无关,则可以看作一组基向量,那么在新坐标系中v
的表示依然是(x, y, z)
,而在原笛卡尔坐标系的表示为v'
。进一步如果v
表示的是笛卡尔坐标系的基向量,那么v'
就是转换后的基向量(P
、Q
或者R
),因此基向量经过变换后仍然是基向量,根据这个原理,计算旋转、平移、缩放、切变和镜像时,通过对原基向量进行变换,就可以得到变换后的基向量,经过组合就可以得到变换矩阵了。另一点是如何将图形学中的透视投影也用矩阵进行表示,因为透视投影需要除法,而矩阵变换无法实现,所以引入的四维齐次坐标。最后一点是使用四元数描述描述物体自身的旋转。setTheCamera();
clearZBuffer();
setLightAndFog();
ObjList = highLevelVisibleDetection();//这可能是说绘制了哪些物体的意思???
for(each obj in ObjList)
{
if(!obj.BoundingVisibleDetection()) continue;//去掉视锥外的物体,通过包围盒的8个顶点进行检测
for(each triangle in obj.surface) //假设图形表面由三角形网格组成
{
clipSpaceTriangle = transformAndLighting(triangle);//物体坐标系->世界坐标系->摄像机坐标系(视锥),并进行顶点光照计算
if(clipSpaceTriangle.back()) continue;//背向剔除
clippedTriangle = clip(clipSpaceTriangle);//边界裁剪
projectionTriangle = project(clippedTriangle);//投影变换
for(each pixel in projectionTriangle)//对于每一个保留的像素
{
if(!ZBufferTest()) continue;//深度测试
if(!AlphaTest()) continue;//alpha测试
color = shadePixel();//根据光照、纹理进行渲染
writePixel(color, FrameBuffer, ZBuffer);//写入帧缓存,更新z缓存
}
}
}
本文地址:https://blog.csdn.net/RayoNicks/article/details/107900930
如对本文有疑问, 点击进行留言回复!!
【贪心】P1792 [国家集训队]种树 & P1484 种树
网友评论