三维基础知识

背景:作为几年工作经验的普通计算机软件工程专业本科学生,对于web前端当然非常熟悉,对于Canvas也能正常的使用,但是直接抄着Threejs官网example和api,只能说可以找猫画猫,还很蹩脚。那么稍微多了解下,就必须掌握一些其他知识。
这里非常感谢 闫令琪大佬的 现代计算机图形学,虽然确实不一定能看懂,但是总能看到一些的。
下面就总结一些自己被拦住的一系列基本概念,谈谈自己的理解

疑问

1、坐标系,还三个,还有mvp转换,这些是……
坐标系是整个的基础,是参考物,向量中的方向是基于某个坐标系的,矩阵的变换是基于参考系的,位置坐标等等都是基于坐标系的。各路引擎中默认帮我们建立了坐标系,可能有时反而忽略了这一点
物体坐标系-就跟局部变量、私有函数一样,控制影响范围的,方便建模人员建模,或者视图聚焦到某个模型时的坐标
世界坐标系-场景空间的坐标系,相当于物体、角色等各种模型在整个坐标系的位置,可以理解为整个运行时的空间坐标系
视觉坐标系-从不同角度看三维世界,肯定景象是不同的,这个很好理解,问题就是计算机怎么知道不同角度看过去是什么样子的呢?
关于MVP转换
M:模型中的局部坐标在世间坐标中的转换,我的右手在我身体的右侧,在办公室的窗边
V:世界坐标在相机坐标中的转换,我的右手已经在办公室的窗边了,从办公室门口看到我的手的位置
P:投影变换,站在办公室门口看到我的手,现在要画下来,在纸上的投影区别?好像这里有点不对

总之,坐标系很重要,也很直观,懂是懂,怎么计算,这右手另一个问题
2、向量 和 坐标 都是两个、三个数,为什么不一致呢
a、坐标就是某空间中的位置,有 x,y,z 三个值,可以很容易的在坐标系中找到这个位置
b、向量其实本来跟位置没关系,他的意义是表示方向(默认是从0,0,0到x,y,z)的方向和大小(向量的模,原点与当前点位置的直线距离,可以通过勾股定理求出)
c、向量同时也作为位置来进行表示,因此才建立了位置和向量的关系,其实就是用向量来表示位置而已,所以模型的各种位置都是 Vector3,

3、向量很重要,他有操作(函数),怎么运用?又跟矩阵有什么关系呢?
a、向量确实很重要,也需要了解操作和函数,但是更应该清楚这些操作的应用场景,而不是只是为了去调用一下
b、向量中很重要的应用是求两个向量间的夹角,有了夹角,垂直、相近 都是一样的,而夹角 其实 通过 点乘 和 叉乘 都能取得夹角,只不过默认都用 点乘 去获取夹角了
c、点乘找到夹角,进而可以人为的判断是否相近,进而有了向量值的一系列应用,点乘还能得到这两个向量组成的平行四边形面积
d、叉乘就是找到垂直与两个向量(两条直线确定一个平面)的向量,进而建立坐标系去做后续的操作
e、当然,Threejs中已经有各路Api,可以直接调用,请仔细阅读Vector2/3类,可以直接求 夹角、距离、点乘、叉乘 结果等

4、矩阵更重要,也很唬人,那么他又怎么理解和认识呢?为此专门买了本《线性代数》来啃,然而确实啃不动,只能慢慢去体会
a、矩阵本身没啥用,但是要做变换,矩阵就是一个很酷的利器
b、向量本身和矩阵也没直接关联,然而因为向量可以表示位置(x,y,z),又因为向量可以用向量通过变换矩阵而来,所以位置也就和矩阵直接挂钩了,所以才有了模型的三种坐标(ThreeJs中Object3D中可以直接获取局部坐标、世界坐标、相机视野中的坐标)
c、二维用的Vector2需要使用Matrix3,三维用的Vector3需要使用Matrix4,就是因为引入了齐次坐标,增加了一维,为什么要增加一维呢,因为增加这一维就可以用矩阵乘来表示 平移、旋转、缩放 三种变换。高维打低维真是无解……
d、特别注意矩阵乘 顺序不可交换,因此变换的步骤很重要,而且所有的点都必须依照这个来。那么复杂的问题就变为如何确定这个 变换矩阵了,学到这里,我也只知道怎么按照步骤一步一步进行变换来先求得这个变换矩阵,后续可以更多关注这块
e、变换是变换了,怎么变回去呢?这里就要用到矩阵的逆,简而言之 通过变换矩阵变换的结果,又能通过变换矩阵的逆矩阵再变换回去,通样也是一步一步来,关于矩阵逆,Threejs中也有Matrix4#getInverse来求解逆矩阵的Api可以直接使用。不过我从书上看到的是不是所有的矩阵都有逆矩阵,但是不知道为什么在变换中这些矩阵确实都有的。

5、渲染引擎、物理引擎、实时渲染、离线渲染、行业应用与技术选型?这也是不清楚的,因为技术很多,应用也很多,好像有相通的,又各有所长
渲染-特指把计算机的数据画成图片到屏幕或者文件中,影片只是连续的图片而已
渲染引擎-例如标准的Threejs,主要做渲染,包括简单的交互,这是最基础的
物理引擎-光有视图还不够,得有真实的效果,得模拟现实,因此就要有物理引擎,最简单来说就是提供重力场,可以模拟各模型物体的受力、运动、碰撞等情况,目前在用Cannonjs
实时渲染-这个实时就是帧数很高的意思,简单说就是玩游戏,交互性很高,随意操作一下,就有画面的反馈。可以简单理解为像js脚本语音,立马生效
离线渲染-这个就是短时间没有最终画面能够输出,需要很久的时间才能输出,主要做影视,突出细节和效果等。类似于早期的批处理操作系统,一点确定,估计好几天才有结果
行业应用与选型-新手初次接触,不敢乱说。推荐如何选择WebGl框架和引擎,参考大佬指示,目前主要学习使用ThreeJs和Babylonjs,预计工作中会优先使用Babylonjs

6、建模很酷,程序员要不要学习?
就学习而言,很有必要,毕竟用代码写太费脑子和时间了。同时你的脑子怎么赶得上工业化的产品呢,更何况还要创意和审美呢。所以当然得知道建模的工具、流程、方式方法,就跟即使普通程序员,也得去了解上下游得工作或是操作系统得一些使用吧,虽然自己不做这块得实际工作。不然你都没有更具体的点线面概念,没有贴图概念,没有uv概念。你没法干活的。
但是就目前而言,鉴于个人精力有限,而且都已经是程序员了,当然应该关注在coding而不是使用工具上(虽然我们也只是调用api)。同时这块要想稍微有所成绩,还得去深入得学习,预计需要花费很多时间,不然也不至于有专门的岗位和人才去攻克了

你可能感兴趣的:(三维基础知识)