快速导航:   教程资源  | 经典范例  | 友情链接  | 联系我们  | 官方微博
登陆 | 注册

 flash 3d 研究所
flash3d 研究所 pv3d 教程 研究所小贴士: 站在5米外看10米高的楼,和100米外看10米的楼能一样高吗? 三维世界和二维世界的尺寸本来就不一样,不要钻牛角尖啦 ~










最近更新:
● AnihonveilM阁下在讨论区里 发表新主题“big african hairypus...”(02:51:28)
● AnihonveilM阁下在讨论区里 发表新主题“curvy big ass ebony ...”(02:48:45)
● AnihonveilM阁下在讨论区里 发表新主题“beg afrkan xxxx Big ...”(02:47:40)
浏览主题:《三维图形原理 为什么我的模型老破面/缺面》

《三维图形原理 为什么我的模型老破面/缺面》
DDM君 (2012-03-16 05:50:43)

Kevin/DDM君 , Flab3D.com (允许转载,转载请注明)



回想一下当年我们玩的PS或土星游戏机,我们会记得常常在画面里看到破面,缺面,或者旋转镜头时某个物体突然跑到另一个物体前面这类问题。在目前本地游戏靠越来越强劲的三维加速卡,拥有如虚幻,上古,DOOM这种画面近乎完美引擎的今天,我们网页三维正在经历和PS当年相同问题的时代。

破面,缺面,错误面等等都是描述同一个问题:Z-sorting,和他相关的有occlusion culling,摄像机的clipping/Culling等等。网页3D目前并没有完美的解决方法。所以以后在flash3d中再看到这样那样的破面/乱面,请不要再过多追究这个只能靠硬件解决的问题(因为会立即被罚看这篇^_^),如有完美的解决方案我们一定会第一时间通知您的,呵呵。

我们知道,每个三维模型的面都是由三角形构成,三角形离摄像机的垂直距离,我们一般称作Z-depth,或者‘深度’。三维图形就是靠这个深度来决定哪个面出现在哪个面前面。

这个Z目前是怎么决定的呢?
在不能使用三维加速卡的时候,Z一般我们是靠组成每个三角形的三个点的平均深度决定,也就是说,每个三角形的中心点决定(或有些情况由最远点决定)。也就是说,每1/30(一般来说)秒,flash播放器都会靠Z深度来重新排列一次画面上所有的三角形。

由于是依据中心点和摄像机的垂直距离决定Z深度,所以这个深度信息常常不能够正确地反映面的真实深度,特别当面相对相邻面较大的时候。(图1左边)
Z-sorting

和这个问题的相关的还有摄像机裁切,在我们使用中,我们常常会遇到近处的面还不该消失就被裁切掉的问题。也是相同的道理。目前没有完美快速的的解决方法。只能靠美工手段(比如加多靠近摄像机的polygon,viewport设置得比实际flash窗口尺寸大等等很多)稍加注意。

两三角形相交的情况
在没有高级算法的情况下,一个三角形是组成模型的最基本的元素,是不可分割的(比粒子还不可分割)。
也就是说,当两个三角形交叉的时候,必须要强行决定谁在谁前面,不能说‘谁的一半’在"谁的一半"前面,因为这种不可分割。(图1右边)

网页三维的Z-sorting目前是没有所谓‘完美的救赎’。但是希望下面这些东西对你会有些启发和帮助。

用viewportLayer做整体排列
这是一个非常快捷的方法,但绝对不是完美解决的办法。
这个办法是靠整个模型的中心点(或最近/最远点)来排列整个模型的图层,也就是说两个模型间的相交/邻近的破面现象会大大减小/完全消除。把每个整块模型看成一个图层,排列各个物体的远近就是排列每个图层的前后。
使用这个方法的代价是整个物体常常突然跳到另一个物体的前面。特别当我们使用‘扁,长,大,’的物体,中心点的距摄像机的距离几乎不能反映此物体的真实深度
这个方式的好处是速度效率相对较高,如果观众不介意物体整个排列错误的问题建议使用这个方法。sandy,away3d都有很容易可以使用这种方法,pv3d稍稍需要多一两步,具体使用方法欢迎去我们的 -> 超简易
第五篇 ViewportLayer分层排列


加多模型的面数
当一个宏大的草原只由2个三角形构成的时候,稍稍破面,就等于消失了一半的草原,非常明显。但当一个草原由1000个面组成的时候,每个面就很小了,即使破面也不是太明显。那么一百万个面组成呢?(当然不是叫我们真的要用这么多面,适当就是了)
当然这个方法的代价是效率明显下降,导入文件体积变大变慢。使用这个办法的前提是用户的效率不大大减小的情况下。

四叉树
Away3D里首先出现了QuadTree摄像机,可以基本解决破面的问题。10月pv3d终于也有了自己四叉树渲染器QuadrantRenderEngine,可惜它们的实用价值都很小,因为在实际运用中非常缓慢(我的意思是真的’非常缓慢’,不是人类能够接受的缓慢,我们的包里没有提供这个渲染器也是这个原因)。
到底是什么原因让四叉树没有成为flash3d的 ‘救世神器’呢?
交叉,遮挡这种高端图形处理,现在游戏都是靠图形加速卡完成,而目前网页3D只能靠CPU运算。
四叉树的基本思路是:以互相交叉的面的相交线,靠程序把两个面继续细分成6个或更多的面。只要发生相交,都要进行海量的运算,即使我们保证每个用户都是现在的n核CPU,也难以完成多于几百个面的游戏场景(现在的游戏一个场景一般有可能上十多万面)。

美工掩饰
尽量避免两个面相交
尽量避免两个面非常靠近
尽量避免使用‘扁长’物体,尽量保持每个物体‘胖圆’,并避免两个物体靠近。
如果确定为不会显示的面,比如外壳遮住的内部,尽量在三维软件中删除掉。

图形加速
个人属于网络程序盲,所以不能解释的太清楚这方面。网络某些协议的问题,导致网页程序基本不能使用本地机器的openGL/D3D。这个问题需要各大厂商协力解决。不过既然flash10能支持一些DisplayObject的各种composition加速,那么未来对flash3d的加速也是完全可以期待的。

网络服务器运算
前段时间已经开始有人尝试用强劲的网络服务器进行一些图形信息方面的运算,然后把信息传递到每个本地用户,这个想法很新颖,虽然成本非常高,但对使用用户机器配置要求就大大降低。当然前提是网络速度不慢的情况。

目前要避免Z排列错误的注意和技巧还有很多,欢迎能有更多朋友研究出些更多能够提高效率,或投机取巧的美工小方法来提高效率来蒙蔽观众。多媒体相关职业的奥义就是蒙蔽观众嘛。(哈哈 不好笑)

有任何不清楚的地方,欢迎到讨论区发言。(无需注册)




Kevin/DDM
Flab3D.com





flash 3d 研究所
(2008-11-24 18:46:20)
测试1


flash 3d 研究所
(2008-12-12 10:57:20)
8错8错,受教了!


flash 3d 研究所
(2009-02-16 23:09:28)
学习一下,呵呵



flash 3d 研究所
(2009-03-14 22:56:39)
3D加速器能解释一下么?


flash 3d 研究所
(2009-03-16 16:56:22)
三维图形需要每秒大量的重复且复杂的演算,加速就是把一些固定的复杂矩阵算法烧成固定的集成电路。
给个形象的解释:
CPU就像办公司经理,他进行分配灵活任务很容易,但重复叫它搬货物就很痛苦,虽然能搬,但效率很低,而且暂用他干更重要事情的时间。
加速显卡就是工人,他没什么创意性,但却比经理能更胜任大量重复体力劳动。




flash 3d 研究所
(2009-03-24 15:28:27)
好笑哈。。。。。-^||^-


flash 3d 研究所
(2009-05-21 12:05:45)
这篇文章写得很好的,希望flab办的越来越好


flash 3d 研究所
(2009-06-13 09:13:57)
我在蒙蔽观众的世界里努力了好一段时间了。
这句话真是讲到我心里啊!


flash 3d 研究所
(2009-06-23 18:05:35)
是真的不错,希望你越办越好


flash 3d 研究所
(2009-07-13 16:13:29)
真的很不错 我一直从第一篇看到第七篇 也是从第一篇自己敲到第七篇
因为我只是个初学者 所以我要用我自己的双手来实现一点点完美的3D的世界

真的很喜欢你们的文章 希望有更多的优秀文章问世


flash 3d 研究所
(2009-07-27 23:21:28)
很好很强大,谢谢DDM君


flash 3d 研究所
(2010-10-22 08:59:09)
‘扁,长,大,’的物体
类似于引起破面的三角形


flash 3d 研究所
(2011-08-03 09:58:46)
3D加速,矩阵运算交给电路板,烧到集成电路里


评论人:
邮   箱: (填入邮箱,博客地址均可)

内   容: (广告和垃圾内容可能会被删除,望理解)
链接地址

验证码:(为防止机器人骚扰,请麻烦输入验证码^_^)
  

(目前需登陆方可发表)


不想添加了