查看: 2431|回复: 2
打印 上一主题 下一主题

[三维图形原理]为什么我的模型老破面/缺面

[复制链接]

3795

主题

2

听众

5万

积分

版主

Rank: 7Rank: 7Rank: 7

纳金币
53202
精华
32

活跃会员 优秀版主 推广达人 突出贡献 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2012-11-8 15:29:11 |只看该作者 |倒序浏览
    回想一下当年我们玩的ps或土星游戏机,我们会记得常常在画面里看到破面,缺面,或者旋转镜头时某个物体突然跑到另一个物体前面这类问题。在目前本地游戏靠越来越强劲的三维加速卡,拥有如虚幻,上古,DOOM这种画面近乎完美引擎的今天,我们网页三维正在经历和PS当年相同问题的时代。

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

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

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

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


    和这个问题的相关的还有摄像机裁切,在我们使用中,我们常常会遇到近处的面还不该消失就被裁切掉的问题。也是相同的道理。目前没有完美快速的的解决方法。只能靠美工手段(比如加多靠近摄像机的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排列错误的注意和技巧还有很多,欢迎能有更多朋友研究出些更多能够提高效率,或投机取巧的美工小方法来提高效率来蒙蔽观众。多媒体相关职业的奥义就是蒙蔽观众嘛。(更多3D资讯尽在web3D纳金网http://www.narkii.com/)
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

1274

主题

1

听众

4万

积分

禁止发言

纳金币
43676
精华
4
沙发
发表于 2012-11-16 18:38:42 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-23 19:47 , Processed in 0.730089 second(s), 31 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部