用户:
Iysthingraphics查看:0 回复:0 评论:0 创建时间:2021-06-11T22:06:24
我们都知道我们身处3D世界,长宽高,三个量,一个不少,对吗?3D对于我们来说很正常,对吗?但是问题来了,到底要怎么样在编程(不限编程猫)中实现3D的东西呢?这个可能有点难了,让我们先来说说2D。 2D(Two-Dimensions),二维。它的定义我也不好解释,让我们做个假设,也许你就会明白。有这么一个东西叫做平面直角坐标系,这个平面就是二维平面,而这个二维平面上有两条互相垂直的轴,它们的名字分别叫做x轴和y轴,它们是直线。把这两条直线想象成两条数轴,不过是互相垂直的两条,如果你有学过数对,那么你基本上可以跳过这一段,但如果你没有,看下面。在这两条数轴上面都任选一点,比如在x数轴上选择1,y数轴上选择2(要注意这些数轴的方向和编程猫的XY坐标轴相同),然后再在这两点上做垂线,x'和y',而它们相交的地方就是这两个选择的数值在平面直角坐标系上所标示的位置,如果你还是不懂就直接去参考Kitten。 既然2D可以采用这种方法表示,那么渲染呢,很简单,因为屏幕是二维的,直接把数对写入屏幕。但但但,3维呢????????????????我们人眼的单眼视觉严格意义上来说是二维的,那么我们是怎么看见三维的东西的?这就是投影。简单讲一下,我们眼中的影像来自3维物体的投影,具体自己搜,能力有限没法解释太清楚。要表示3D,最大的难点就是把物体投射到2维屏幕上,特别是遮挡关系。现在就要进入Kitten看看有啥问题了。 编程猫上的3D作品大多使用线条渲染制作,而且一般没有FOV的概念(可能是我没见过),而要把一个3D图形映射到2D的KittenGO(我一般都叫它图形输出,GraphicOut)需要用到一些正弦余弦什么的的公式。这个还比较简单,对吧,至少目前为止。但是但是但是但是,如果你想表示一个真正有面的概念的3D物品,你需要多边形。你可以借助多边形完成许多事,也包括3D绘制。它的原理是近似,意思就是用若干多边形近似出物体表面(当然不能完全拟合嘛对吧)。实现过程中,多边形的遮挡关系会成为大问题。因为你不可能把一个物体的后面画到前面,你需要遮挡。有两种算法给你用,第一种是画家算法。顾名思义,画图时像画家那样先画远处物体再画近处物体,但这里的画家就是只能画出多边形的Kitten,一切正常………………对么。如果两个多边形交叉会发生什么,你猜对了,会出大问题,会闪。这时另外一种算法登场了,深度缓冲。这个算法比较难实现,因为它需要矩阵化多边形后加入深度信息再写入缓存中,就因为矩阵化这一步就会让Kitten的实现变得极难,因为如果你想要高分辨率就只能使用极大的空间,举个例子,你想要模拟一块喵x喵的四色屏幕,因为2^2=4,所以每像素需喵its数据,简单计算喵*喵*4=16384bits=16Kb/Kib仅仅是这样也需要用到这么多空间(但我做过一个图形生成器,生成图形最多用二十万项目的列表,应该没事),这样会大大降低屏幕模拟的效率,但就算是这样,这依然是一个很好的算法,因为它只需通过比对一些像素的深度值来计算某些重叠的地方哪些多边形应该被遮挡。 这些基本上就是了