3d数学基础:图形和游戏开发(第2版)_学习笔记-《3D游戏
数学基础:图形与游戏开发》...
这⾥来开⽂章记录并不断更新⼀下我看这本书学到的⼀些知识和⾃⼰的认识思考
谁让知乎⽂章是要作为我的笔(博)记(客)⽽存在的呢?
我学习东西是很担⼼忘记的,以前也有做实体笔记的习惯,但随着那些笔记本经不住时间的考验以及⽆法随时察看,我曾⼀度放弃笔记。在学习unity3d时以多次复习的⽅法去学习,就如我之前提到的脚本开发的基础知识课程我曾先后学习过3遍,虽然这让我更好的记住,但就有限的时间来说这样的学习⽅式是在太耗费时间了。因此我需要⼀个能随时察看不会丢失,能不断更新的笔记,也就是这⾥。或许你也可以读读我的第⼀篇⽂章,为什么我选择了知乎。
欢迎各位dalao能够前来评论指正,或是赐教⼀些我不知道的点,鄙⼈先谢为敬
0.前序
---0.0这本书是讲什么的
本书主要讲解3D游戏开发中的数学知识,包括坐标系,向量,线性代数,⼏何图元,图形数学等知识,以及结合知识使⽤C++进⾏⼀些实例的实现
本书有提到⼀些关于计算机图形学的知识,但不是计算机图形学的专著,主要是为讲解如何结合数学知识,运⽤计算机图形来达到我们期望的3D游戏的显⽰效果
---0.1我为什么要看这本书
⾸先是作为前辈推荐的学习Dx11前的需要具备的知识,没错在今年夏天之前我会参加⼀个⼯作室DX11的课程
unity3d入门其次是在我以每天两节课程或1个完整的模型的速度学习并练习建模期间,给游戏开发这边点其他可学习的东西
之后是在我进⼊unity渲染相关⽅⾯的学习之前的知识预备,由于觉得unity渲染系统的学习有必要了解⼀下unity封装的那些图形库
API(DX GL)具体都是什么,以及GPU体系结构
unity shader的学习同样需要图形库,GPU,以及强⼤的3D游戏数学知识作为后盾
【本书】---【DX,GPU,hlsl shader】---【unity渲染 unity shader】
1.2D 3D坐标系统-----(对应本书【第⼆章】)
---1.1 1D数学
为了计算数量⼈类发明了数字
最初⼈们只关⼼东西的有⽆以及有多少个,⼈们⽤0代表没有,⽤去计数,⼀般⾃然状态下物体的多少都可以⽤0+正整数表⽰。因⽽0+所有正整数被称之为⾃然数
你可以把需要数的东西排成⼀排,这样就导致了数轴的概念
贫穷导致的负债引出了负数的概念,贫穷导致的⽆法购买整个数的事物⽽是其部分,引出了分数的概念
---1.2 离散精度
------1.2.1 世间的⼀切会是有限的
或许你可以数完世界上的⼀些事物,所有的⽺,所有的⾯包机,所有的物体,所有的分⼦原⼦...之后
你可以得到⼀个数字,以这个很⼤但有限的数字界定的范围你就可以表⽰宇宙间的⼀切。尽管实数域能够⽆限扩展,但这个范围会是实数域有限的⼀部分,可以说这个范围
尽管实数域能够⽆限扩展,但这个范围会是实数域有限的⼀部分,可以说这个范围的实数就⾜以我们使⽤了
------1.2.2 划定离散精度
到了计算机领域,为统计数据我们需要划定⼀个范围来记录数据。或者说⽤⼀个有限的但合适的内存⼤⼩,去存储我们需要的数据
那么应该如何划定⼀个合适的范围,这⾥该上名句了:
“如果它看上去是对的,那么它就是对的” ---计算机图形学第⼀准则:近似原则
因此就计算机图形领域,⼀张图⽚要以什么分辨率,什么⾊位显⽰,这个精度的判断标准就是上⾯这句话
先清楚你认为什么是对的,按你划分对错的标准把它做对。那些能看得见的,请尽⼒做到最好,那些看不见的细节,不要在上⾯浪费你的时间、精⼒以及计算机宝贵的内存和运算量
---1.3 2D坐标
ps:经过18年的中国式教育,这⾥坐标系是什么就不在过多赘述了,仅叙述⼀些学校没有让我清楚的知识点
坐标系可以被建⽴在任何地⽅,并以任何⽅向延伸
坐标系的描述需要确定原点,以及规定坐标轴的⽅向即可
坐标轴并不⼀定需要互相垂直(空间扭曲时),但⼀般⽇常⽣活中的三维的欧⼏⾥德空间内坐标轴保持互相垂直
2D坐标系共计有8种,可分为两类每类4种。仅在2维空间内旋转时两个同类的坐标系内可通过旋转完成重合,但两个不同类别的坐标系需要在3维空间中旋转才能够重合
3维空间中,旋转两个不同类别的2D坐标系完成重合的过程被投影到2维空间中可以理解成是在不改变⼀个坐标轴的朝向,另⼀个坐标轴从1到-1进⾏的⼀个伸缩变换(先从1伸缩变换到0即2维压缩为1维,之后从0到-1即从1维以和原来相反的⽅向被扩展成2维)
点的定位,2D坐标系中的定位可⽤(x,y)表⽰,x表⽰x轴上的分量也是到y轴的距离,同理y表⽰y轴上的分量也是到x轴的距离
(x,y)坐标表⽰中,x y的⼤⼩代表距离,x y的正负则代表⽅向
---1.4 3D坐标
------1.4.1 两种不同的3D坐标轴
我们在2D坐标的基础上加⼀个垂直于2D坐标屏幕的坐标轴就构成了3D坐标
3D坐标系总共有48种,可分为两类(左⼿系和右⼿系)每类24种。
同样仅在3维空间中旋转,⽆法重合两个不同类别的坐标系(你⽆法旋转你的⼿机得到⼀个镜⼦⾥的⼿机)。旋转中你会发现最接近的情况下有⼀个轴正好是反向的,如果你不改变两个轴向,反转另⼀个轴向,那么坐标轴就会发⽣类别的转换
这个反转轴向改变坐标轴类别的过程,其实就是在4维空间中旋转3维空间,这个旋转在3维空间中的投影就被表现为⼀个轴向从1伸缩变换维为-1,⽽另两个轴向不变
------1.4.2 左⼿系和右⼿系
⾷指指向你的上⽅,中指指你的向前⽅,拇指指向另⼀只⼿的⽅向。你的左右⼿将分别构建两个坐标系(左⼿系和右⼿系)
区分⽅法,站在x轴正⽅向看向原点。左⼿系中顺时针旋转是y+转向z+,右⼿系中则是y+转向z-
本书及以下笔记采⽤标准左⼿系,⼤部分公式,定理⽆所谓坐标系类别都可成⽴,坐标系不同情况书中以及以下笔记将有特别提醒和记录
------1.4.3 类⽐2D坐标系和3D坐标系
同样的(x,y,z)表⽰3D坐标系中的具体位置,xyz ⼤⼩代表距离,正负代表⽅向。xyz值是在其轴上的分量,也是到处此轴外另两轴构成平⾯的距离
2.多坐标系---(对应书中【第三章】)
---2.1 为什么引⼊多坐标系的概念
请描述⼀整天你的⼿机相对于你的位置,或许它现在就被拿在你⼿⾥,之前被放在⼝袋⾥...不过相对于你的位置你⼿机在⼀天中的位置还是很好追踪的
那么请描述⼀整天你的⼿机相对于地球的位置(⽤经纬度加离地表⾯⾼度)
好吧这么做就算你有能测量经纬度和离地⾼度的仪器你也快要疯了,因为⾸先你要思考下这⼀天你都去了哪⾥,再叠加上⼿机都被放或是拿在哪⾥...
有时候在⼀个坐标系中⼀个很好描述的物体,但到别的坐标系内位置就变得不好描述了
或是在建⽴连接两个城市的公路,公路的设计图(⼀个新的坐标系)上⼀边是A城⼀边是B城,参照原本A B城靠公路⼀侧郊区的位置需要被转换到公路的设计图上
---2.2 3D游戏开发中⼀些有⽤的坐标系
------2.2.1 世界坐标系
世界坐标也被称之为绝对坐标,这个“绝对”指在这个世界之中
⼀个坐标系只能描述其内部的物体,⽽对于这个坐标系本⾝的位置描述或是坐标系之外物体的位置描述就需要寻或建⽴新的坐标系(你可以⽤经纬度描述你在地球上的位置,但我问你地球在哪时,你会如何描述?)
3D游戏中的“世界”,就是这个游戏所需要展⽰的全部,不⼀定是和类⽐我们真实世界⼀样的世界
世界坐标系中的问题:物体的位置⽅位,物体的来去追踪,任意⼀点的地形
------2.2.2 物体坐标系
每⼀个物体都带有⾃⼰的坐标。向前⾛,你⼀定知道要往哪⾥⾛,但相对于世界坐标可能有的⼈向西⾛,有的⼈向东⾛
物体位置改变时,物体坐标系和与之相关连的坐标系⼀同改变(unity中移动物体,物体和该物体的⼦物体⼀起移动)
3D游戏物体坐标的建⽴,由美术在建⽴模型时确定,可参考⽂章《当3dMax遇上unity3d》中模型轴向的设置建议
物体坐标系中的问题:其他物体相对物体的位置,接下来的⾏动应相对于此时物体的那个⽅向
------2.2.3 摄像机坐标系
摄像机也是⼀个物体也有它的物体坐标,在此基础上⼀般规定Z+⽅向为摄像机看向的⽅向(unity中采⽤此规定)
⼴⾓摄像机完成了⼀个根据看向⽅向,⼴⾓度数形成的⼀个椎体内的物体投影到观察屏幕上的功能
摄像机坐标系中的问题:给定点是否在摄像机前⽅,是否进⼊观察投影椎体,是否被其他物体遮挡(可见性检测,深度问题)
------2.2.4 惯性坐标系
惯性坐标系是于物体同⼀位置,但轴向平⾏于世界坐标的坐标系
惯性坐标系的存在是作为中介,简化世界坐标变换到物体坐标的过程(仅平移即可完成世界坐标与惯性坐标的转换,仅旋转即可完成惯性坐标与物体坐标的转换)
---2.3 嵌套坐标系
在3D游戏中以世界坐标系为最⾼“⽗”空间,世界中的物体所具有的物体坐标,以及物体的⼦物体的物体坐标,和在“⽗”物体中的坐标。每个物体既有在世界坐标中的绝对位置,也有在相对于上⼀级“⽗”空间的相对位置。从⽽形成坐标系的嵌套
上⽂中已提到过有时在⼀个坐标系中⼀个很好描述的物体,但到别的坐标系内位置就变得不好描述了。因此需要引⼊多坐标系,并形成坐标根据坐标系的嵌套关系,以及物体在不同坐标系中的位置,到描述物体位置的合适“路径”
系嵌套关系。根据坐标系的嵌套关系,以及物体在不同坐标系中的位置,到描述物体位置的合适“路径”
3D游戏中嵌套坐标系在数据结构中形成以世界坐标为根,⼦层级坐标系为枝叶的嵌套式坐标系树。嵌套式坐标系树能在虚拟世界的⽣命周期内动态更新,以表现物体的层级转换,⼦物体从⽗物体上脱落成武世界坐标系中的物体,亦或是世界坐标系中的莫物体被另⼀物体捕获,成为该物体的⼦对象
---2.4 描述坐标系
由于已经提到过,位置的描述需要在能够包含该位置的更⾼级的坐标系内
坐标系的位置描述需要描述其在⽗坐标系中其原点的位置,以及轴的指向
世界坐标的位置描述在3D游戏中是没有意义的
---2.5 坐标系转换
通过惯性系为桥梁,完成世界坐标系和物体坐标系的相互转换
将物体坐标通过变换到和世界坐标重合,其所需的步骤与世界坐标变换到物体的步骤正好在顺序和数值上均相反
在寻物体坐标系内某⼀点在世界坐标系中的位置时
-
--3.向量与向量运算的⼀般规律(书中第三章和第四章)
这⾥笔记中省略什么是向量的,向量的坐标表⽰(书中第三章)相关内容
---3.1 两种概念
数学家,程序员,或者说偏抽象思维的理解,向量就是⼀个数组(Vector2、Vector3),可以保存由n个数构成的⼀个数对
物理学家,或者偏形象思维的理解,向量是⼀个有⼤⼩有⽅向可以⽤⼀个箭头表⽰的量,它没有位置的概念,可以被放在任何地⽅
---3.2 向量与点
向量表⽰的是⼀个相对的移动⽅向和距离,向量没有位置,向量可以被平移⾄任何地⽅
⽽点表⽰的是相对于某个坐标系的位置
若将向量从原点出发,则向量的坐标表⽰和此时向量的末端所指位置的坐标表⽰⼀致,即点的坐标表⽰就是从原点出发到达该点的向量的坐标表⽰
-
--3.3 关于叉积
这⾥在⼤学课程中⽼师表⽰叉积⽅向应⽤右⼿螺旋定则判定,但其实读了龙书的3D数学章节,以及本书。
叉积的⽅向其实取决于坐标系,即左⼿系中⽤左⼿判定,右⼿系中⽤右⼿判定
ps:本书和龙书以及dx均是使⽤左⼿坐标系的,⽽OpenGL使⽤右⼿系
平⾏四边形的⾯积其实可以⽤两边向量的叉积求出,⼏何意义是||a||*sinθ就是当起点被平移到同⼀位置时,向量a的末端到向量b 的垂直距离(或a在b上的⾼投影长)
---3.4 向量在向量上的投影
------3.4.1 从点积说起
若有向量a和向量b a·b 的⼏何意义是:向量a的模长乘向量b在向量a上投影向量的模长(或向量b的模长乘向量a在向量b上投影向量的模长)
------3.4.2 a在n上的投影长度
由点积的定义,以及你可以亲⾃画个三⾓形,我们发现:
若有向量a和向量n 夹⾓为θ
1.a在向量n上的投影长度(投影向量的模长) 等于 ||a||*cosθ
2.当n是单位向量 即 ||n||=1 时 a·n=||a||*||n||*cosθ=||a||cosθ
这也是我们求单位向量(标准化向量)的意义,这使得其他向量点乘单位向量即得到在单位向量⽅向上的投影长,同时下⾯也有很多运算会因为单位向量的参与⽽简化
求旋转矩阵中,为保证运算简便,我们要求旋转轴必须以单位向量表⽰
------3.4.3 a在n上的投影向量
既然我们已经得到了a在n上的投影长度,那么a在n上的投影向量就是其投影长度乘n的单位向量1.当n不是单位向量时:
(但我们通常对此式上下同乘||n||,写出
a· n n的形式)
2.当n是单位向量时:
此时有||n||=1,所以公式可以写为:
---3.5 向量在⾯上的投影向量
已知⼀向量a和⼀个平⾯的单位法向量n,求a在平⾯上的投影向量
a即为待投影向量,我们设向量b=(a·n)n 上⽂已经提到此时b向量是a在平⾯法向量上的投影
待求向量即为:
(n是平⾯的单位法向量)
若n是平⾯的⼀般法向量,结果应为:
你可以拿出纸笔画⼀画,你会发现不管a和n是怎样的⽅向,答案都⼀定是这个
---3.6 点在平⾯上的投影点
已知⼀点a 平⾯上⼀点b和平⾯的单位法向量n
我们⽤a的坐标减去b的坐标 得到⼀个向量
(1-1=0)
以m作为待投影向量,结合3.5 我们可以求出m在平⾯上的投影向量
则也就是平⾯上⼀点b指向a在平⾯上的投影点的向量
我们⽤求出的投影向量加上b的坐标,即得到了a的坐标(1+0=0)
我们⽤求出的投影向量加上b的坐标,即得到了a的坐标
当n是平⾯的单位法向量时,投影点坐标为:
当n只是⼀般法向量时,结果为:
---3.7 点在向量上的投影点
(这个问题其实没有意义或者描述不准确)
点有具体位置,⽽向量可以被任意平移
⼀个相似的有意义的问题是,点在⼀条空间直线上的投影
------3.7.1 点在直线上的投影点
已知⼀点a 直线上⼀点b和直线的单位⽅向向量n
我们⽤a的坐标减去b的坐标,得到⼀个从b指向a的向量m(1-1=0)
m在直线⽅向上的投影向量即为(m·n)n
则此向量的⼏何意义就是从点b出发指向a在直线上投影点的向量
那么我们再⽤(m·n)n 的坐标表⽰加b的坐标,即得到a的投影点坐标(1+0=1)
所以a在直线上的投影点:
(向量m是直线上⼀点b指向a的向量,向量n是直线的单位⽅向向量)当n是直线的⼀般⽅向向量时,结果为:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论