【科普向】裸眼3D商业化在即,楼主带你一文弄懂计算机图形学基础

但是,如果场景中的物体多于一个,那么就不能把物体全部放在原点附近,那么。。。把模型坐标改掉行不行?行。比如把一个模型的所有顶点的x坐标都加上一个3,那这个模型就平移了3个单位长度。可是,如果要加载另一个一样的模型,这种方法就行不通了,因为两个模型的平移量肯定需要不一样,否则模型就会重合在一起。所以,我们把模型的平移单独拿出来,这样就可以使用一个模型多次创建场景,比如使用同一棵树创造一片树林(场面一定很壮观

楼主 Andy18650  发布于 2019-08-31 11:24:00 +0800 CST  
除了平移以外,我们还可以对模型进行旋转,缩放等等操作,使得我们的树林更加丰富其中缩放比较简单,把每个顶点的坐标乘上一个比例即可。旋转的话,如果不是90°的倍数,就比较复杂,要用到三角函数,90°的话,交换坐标或者乘上-1什么的就可以了。

楼主 Andy18650  发布于 2019-08-31 11:28:00 +0800 CST  
再以上步骤以后,我们就得到了一个由模型得到的场景,这个场景坐标系就是所谓“世界坐标”。一个有趣的事实是:电脑的浮点数的精度是有限的,而且是相对的,所以如果表示一个接近1的数,浮点数可以精确到人眼根本分辨不出来(或者干脆小于一个像素大小)而当浮点数上亿的时候,由于其相对精度,其误差可能会接近1甚至更大的量级。这就是为什么Minecraft的“边境之地”会出现那么多的渲染错误(火把的火焰平移之类)。理论的预言和实际情况相符,代表我至少没在误人子弟

楼主 Andy18650  发布于 2019-08-31 11:35:00 +0800 CST  
有了世界坐标,我们就要对它进行观察。计算机的做法是假设某个位置有一个摄像机,然后用它来观察。关键在于,对于人很简单的一个“看”的动作,对于电脑来说却很困难,换言之,很难使用“摄像机的位置”和“模型的位置”得出“模型在摄像机眼中的样子”。那么怎么办呢?《三体III》中有一句很著名的话:大山不能走向穆罕默德,穆罕默德可以走向大山。放在这里很贴切,如果不能使用摄像机来计算,那就移动世界!将世界坐标系中的所有模型的所有顶点的坐标减去摄像机的坐标,就得到了“摄像机坐标系”,在该坐标系中,摄像机位于原点。我们还可以旋转世界,以达到旋转视角的效果。

楼主 Andy18650  发布于 2019-08-31 11:53:00 +0800 CST  
从这个坐标系开始,16个视角就“分道扬镳”了因为十六个视角的角度不同(实际上位置也略微不同),所以需要对世界坐标系的变换也不一样,所以就需要16个摄像机坐标系。

楼主 Andy18650  发布于 2019-08-31 12:56:00 +0800 CST  
我们继续来考虑一个视角的情况。下一步是“糊弄”尺寸判断和位移判断的关键。即“近大远小”。这里需要使用到投影的概念,不过是中心投影,和一般的“影子”不太一样。
如图,假设摄像机在红圈处,屏幕为淡蓝色线,观察物体A的时候,物体A在屏幕上的投影就为点a。

点a的坐标怎么求呢?这就是上一步产生的“摄像机坐标系大显神威的地方了。由上一步的推导可知,红圈的坐标为(0,0,0)即原点。同时,我们设上图中的黑色线为z轴(y轴向上,x轴未画出),为什么是z轴呢?我们马上就会看到。由初中所学的三角形相似原理,L1:L2=h1:h2,又因为L2就是A点的z坐标,h2是A点的y坐标,所以可以写作zA和yA,h1就是a点的y坐标,写作ya。这里开始楼主使用了一些魔鬼方法简化计算:把L1设成1,这样我们就可以得到1:zA=ya:yA,即ya=yA/zA。求a点的x坐标同理。这样,a点就自然而然地在屏幕的平面上,而且坐标正好是大家熟悉的xy坐标,这就是为什么要设置z轴为轴线方向,否则后来屏幕的坐标就要是xz或者yz,当然不是不可以,大家都是初高中几何学下来的,用不习惯。

楼主 Andy18650  发布于 2019-08-31 13:21:00 +0800 CST  
这里要好好的吐槽一下OpenGL和各种计算机图形学教程。它们在做计算的时候把投影和转换屏幕坐标写在一起了!这其实是两个步骤,而所有的教程都把它们写在一起,好像只有一个变换一样。这就导致了这一变换及其费解,无论是传统方式还是矩阵方式。楼主学习的时候,就在这一个变换上卡了几个小时。

楼主 Andy18650  发布于 2019-08-31 13:26:00 +0800 CST  
经过了投影,我们已经得到了一张“二维化”的图片,接下来的任务就是把这个图片转化为像素了。首先要进行的步骤是把这个图像扭曲,使得它符合屏幕的要求。这个要求是什么呢?屏幕能看到的范围最右端x坐标为1,最左端x为-1,最上端y为1,最下端y为-1。这样做的原因是,窗口的“像素尺寸”(学名:分辨率)很可能不一样(比如1024*576,1280*720,960*540,360*480或者1200*900,1024*768等等)这时,有一个与分辨率无关的坐标系就太好了,因为否则之后的每个步骤都要为每一个可能的分辨率单独写一次算法。

楼主 Andy18650  发布于 2019-08-31 13:43:00 +0800 CST  
有了符合屏幕要求的坐标,接下来就要把这个坐标映射到像素点上了。这个过程其实极其简单,以至于楼主原计划都没有讲。由于屏幕像素点是一个二维的整数坐标系,左下角为(0,0)右上角为分辨率的数值,所以只需要把有正有负的屏幕坐标加上1,除以2,然后乘上这一行(列)的像素数即可。注意,这里的数还是带小数点的浮点数,还需要四舍五入一下才是真正的屏幕像素位置。

楼主 Andy18650  发布于 2019-08-31 22:03:00 +0800 CST  
其实吧友可能发现了,楼主今天的科普文风较昨天由很大的转变。变得比较“沉闷”,图解也少了很多,其实楼主昨天也准备了很多包袱来讲解3D渲染流水线,还准备了有关贴图算法,光照反射,材质甚至简单的光线追踪原理的深入浅出的讲解,只是时间太晚没有讲。但是今天早上一大早起来更新的时候,被30楼的吧友打了当头一棒。。。自己辛辛苦苦准备搞的大新闻就这么夭折(还准备了一个月,爆肝了全套的计算机图形学入门),搁谁谁没点心理压力。。。不过楼主也是以冷静,逻辑自居,不想因为情绪影响教程的发布,所以断断续续地把基础的东西全部讲完了,结果没想到文风也变得冷静了。
不过这种情况楼主也不是没有考虑到,任何技术的市场化都是一个过程,而这个过程中总有很多人尝试-失败,另一些人尝试-再失败的轮回,直到量变产生质变的那一刻,就有了乔布斯,马云,马化腾。如果时间证明现在裸眼3D技术还没有到达井喷的节点,那楼主也很愿意被后来吸取了经验技术的后人“拍死在沙滩上”。
楼主对裸眼3D技术问题的判断,在于它对传统显示没有兼容性,现在如果要开发裸眼3D的程序,得完全开发新的,就像VR一样。所以楼主的想法,是开发即插即用的裸眼3D模块,只要极少甚至没有代码修改,就可以使得现在当红的游戏(比如Minecraft,《使命召唤》等等)输出裸眼3D图像。这样一来,用户转化的成本就极大地降低了,裸眼3D的吸引力也大大增强。

楼主 Andy18650  发布于 2019-08-31 22:49:00 +0800 CST  
大家看要不要把计划中的部分更出来?楼主决定尽量欢脱一点

楼主 Andy18650  发布于 2019-08-31 23:38:00 +0800 CST  

楼主:Andy18650

字数:6222

发表时间:2019-08-31 05:03:00 +0800 CST

更新时间:2019-09-11 22:14:27 +0800 CST

评论数:67条评论

帖子来源:百度贴吧  访问原帖

 

热门帖子

随机列表

大家在看