atlas z 轴
问题源自一个帖子,因为上传的图比较多,就另开了这个贴写下自己的试验结果,原帖在下面链接中 http://game.ceeger.com/forum/read.php?tid=8911#info NGUI中是用depth来控制sprite显示顺序的,本来这很好用,但碰到上面帖子中的问题时却不好解决了,于是我试验了下。以下是一些总结,不对的地方请指正。 下面的内容可能看起来比较绕,这样的话只需实际试验下就能很容易的知道结果,呵呵 如果还是看不明白,可以先看1楼,那里有个总结 1,同一个panel下,同一个atlas的不同sprite的显示只受depth的控制,这是最经常用的方式。此时不论精灵的z轴如何变化,depth高的一定在前面。 比如精灵A的z轴是-10,更靠近相机,但它的depth是0,而精灵B的z轴是0但depth是1,那么精灵B还是显示在前面 如下图,0、1、2的前缀分别是三者的depth值,则三者的排列就是如图的由下到上,2_Label在最上面 现在在depth不变的前提下修改z轴的值。将0_Dark的z轴调为-100,则它离相机更近了,看上去应该挡住后面的两个才对,但Game场景中三者的关系并没有改变,也就是说虽然看上去0_Dark应该挡住后面的东西,但并没有这样,还是depth起作用,也就是feiben同学所说的“相同atlas其实是共用同一个Z轴深度”。 2,不同panel下,同一个atlas的不同sprite不受depth的控制,而受z轴控制。此时只需稍微调节下其中一个精灵的z轴就可以,比如0.1,就可以控制sprite的显示 比如接着1中的图,新建一个panel_B,将1_NGUI拖到里面,会看到它盖住了0和2,现在调节depth不起作用,无论1_NGUI的depth调成多少,都不会改变它在最上面的状态 现在调节下1_NGUI的z轴为0.1,则它到了最后面 而比如现在想把在panel_B中的1_NGUI重新显示在0和2之间,能办到么?经过试验会发现无论怎么调三者的z轴,都不能将NGUI放到1和2之间,因为它们是一个图集中的精灵,共用一个z轴深度 比如将0_Dark的z设为100,此时1_NGUI的z轴还是0.1,但1_NGUI重新跑到了最上面,而不是中间 再把Label的z设为-100,NGUI是被覆盖了,但Dark也跟着跑到了上面,注意此时三者的空间位置,NGUI的确是在中间的,但还是被后面的Dark挡住了 你也许会感觉这是自找麻烦,没事把同一个atlas的精灵放到两个panel中干什么呢?一般情况下是自找麻烦,但为了解决上面帖子中提到的问题,这是个解决的办法,如3 3,不同panel下,不同atlas的精灵的穿插,受z轴的控制。 现在回到帖子中提出的问题,怎么让多个atlas的sprite能进行穿插。办法是用多个panel。 比如有两个atlas,分别为SiFi和Wooden,而SiFi中有两个要显示的精灵Dark和Label,Wooden中有一个要显示的精灵wooden,现在想把wooden放到Dark和Label之间。那么设置两个panel,一个放Dark和wooden,另一个放Label,或者一个放Label和wooden,另一个放Dark,只要SiFi图集中的两个精灵不在同一个panel中就可以,之后微调其中一个精灵的z轴就可以了,比如调节Label的z轴为-0.1,则如下图,wooden到了Dark和Label的中间 不过如果认为为什么要这么麻烦呢,只需要在一个panel中调节就可以了,那就回到了2中的问题上,总是在上或在下,而不会在中间 ,Dark为100,Lable为-100,且三者的depth也是相应的,但wooden还是在最上面 ,而Dark和Label的z不变,则wooden跑到了最后面,但就是不到中间去 此外,即使用两个panel,但同是SiFi图集中的Dark和Label还是在同一个panel下,而把wooden放到另一个panel中,还是无法达到插入的目的,如下图,无论怎么调节wooden的z轴,它要么在最前面,要么在最后面
当然这是最简单的穿插,如果有多个panel和多个atlas的话情况会比较复杂,此时要记着2中的情况,否则还是容易出现无法穿插的问题。而解决这个问题的方法最好还是atlas设计的时候更全面,让穿插的sprite在一个atlas中,这样只用depth深度就可以控制了 而之所以对panel是否会产生drawcall,是因为官方例7中只用了2个Atlas,但drawcall却是5个,当时简单的认为是panel的问题。 |
|
1楼#
发布于:2013-02-08 00:55
其实上面的东西总结出来就一句话:(啰嗦那么多,总结却这么少,好没成就感,呵呵) 在相同Panel下,相同Atlas中的Sprite才受Depth控制,其他情况则受z轴控制,但同时又受前者影响。 列个表的话就是: 1、相同panel 相同atlas sprite受depth控制 2、相同panel (同时受1的影响) 不过要特别注意的是,虽然depth控制的范围看似较少,但它却占主导地位,是最常被用到的,这是因为NGUI基于Atlas,只有在1无法达到目的的时候,才会去用其他的。 此外关于字体, 对于英文,因为就那些有限的字母(因为只会点英语,所以不知道是不是有的外语制作起来也很繁杂),所以可以和图片sprite放到一起,官方的atlas中就是这样的分布,把字体和图片打包在了一起。这种情况下我感觉字体和图片是在同一个atlas里面的,使用起来也只是占1个drawcall。而同一个atlas中的sprite,则可用depth来调整深度。比如上面1234例子里的Label就是英文字体,它是和Dark这个图片同在SiFi图集中,所以在相同panel下可用depth来控制显示顺序。但此时想再插入一个其他atlas中的sprite到他俩之间的话,就会不成功,因为他俩是一个atlas中的。 而不同的panel下就只能用z轴来控制了。比如用SiFi的Label,此外再用wooden图集的button,他俩只用depth是没法控制的。如下图中,后缀表示label的depth是10,而button的depth是0,但button还是挡住了label,这和上面说的第4条一样。
比如下图中,用了3个Atlas,都放到同一个panel下,后缀表示的depth,注意左边的那4个是参照,只为了能看清都是那些东西。分别是: Atlas1,使用一个sprite,人物为程咬金,depth为3 Atlas2,实际是一个中文Font字体的label,也看做是图集,depth是2 Atlas3,最后两个精灵都是用的Sift中的,depth是0和1 然后把它们都放到一个panel下,而你做试验的时候可能显示的顺序不一样,但不要紧,我们关注的是它们是不是以depth的顺序排列了,而看一下就知道,它们并没按顺序排列,比如NGUI的depth是1,但它却显示在了最上面。
|
atlas z 轴的更多相关文章
- (转)NGUI中深度depth和z轴关系
先列出转载链接: http://game.ceeger.com/forum/read.php?tid=8917 转载原文: 问题源自一个帖子,因为上传的图比较多,就另开了这个贴写下自己的试验结果,原帖 ...
- 传感器(3)传感器的X,Y,Z轴
设备正面水平向上. X轴 : 左右方向,向右是正值. Y轴 : 远近方向,远离你是负. Z轴 : 上下方向,向上是正值.
- transform:translateZ() 字体模糊问题 父类重返Z轴平面
translateZ()变糊 第一种情况: 当translateZ(m)中的 m设置为 非整数,1.5px 之类的,字体会模糊,但是不明显;和浏览器渲染,字体格式,或者操作系统有关, 这个 css中 ...
- 内联元素于与块元素的转换 相对定位、绝对定位以及fixed定位 Z轴覆盖
今天上午学习了内联元素于与块元素的转换 个人觉的display:none将元素非常好用,可以配合当鼠标放到这里会出现. 转换成行内元素display: inline; 转换成块元素displ ...
- [osg][原]osg的坐标系:使用右手法则Y轴向前、X向、右Z向上。camare的默认姿态:向下看(Z轴负向),头向前(Y轴正向)
参考:http://blog.csdn.net/tmljs1988/article/details/7561887 图中上半边为opengl坐标系,下半边的osg坐标系: osg::Camare的默认 ...
- SVG渲染顺序及z轴显示问题(zIndex)
SVG是严格按照定义元素的顺序来渲染的,这个与HTML靠z-index值来控制分层不一样. 在SVG中,写在前面的元素先被渲染,写在后面的元素后被渲染.后渲染的元素会覆盖前面的元素,虽然有时候受透明度 ...
- PhoneGap 加速计 api 获取加速计 x 轴 y 轴 z 轴信息
一.PhoneGap 加速计 Accelerometer 对象介绍 1.主要方法 accelerometer.getCurrentAcceleration 获取当前设备在 x,y,z 轴上的加速度信息 ...
- OpenGL编程(七)3D模型的深度(z轴)检测
下图是我们要修改后的效果图: 一.深度检测 1.模型Z轴显示有问题: 上一次试验中,如果认真留意,会发现一个问题.当控制锥体在左右或上下旋转时,你会发现锥体看起来是在+-180度之间来回摆动,而不是3 ...
- 如何让View一直沿z轴旋转
#import <QuartzCore/QuartzCore.h>... CABasicAnimation *rotationAni = [CABasicAnimation animati ...
随机推荐
- LintCode-比较字符串
题目描述: 比较两个字符串A和B,确定A中是否包含B中所有的字符.字符串A和B中的字符都是 大写字母 注意事项 在 A 中出现的 B 字符串里的字符不需要连续或者有序. 样例 给出 A = " ...
- NuGet安装软件包故障解决
今晚在家工作,使用NuGet安装 Install-Package Microsoft.AspNet.Web.Optimization 时,一直提示无法连接到nuget.org. 搜索后,可使用如下方法 ...
- Delphi XE中使用dbExpress连接MySQL数据库疑难问题解决(对三层的例子配置有帮助)
Delphi IDE中包含一个Data Explorer的组件,如下图所示: 该组件基于dbExpress(包含TSQLConnection.TSQLDataSet.TSQLQuery.TSQLSto ...
- php call_user_func和call_user_func_array
首先要看这个页面关于callable类型:http://www.php.net/manual/zh/language.types.callable.php 自 PHP 5.4 起可用 callable ...
- BZOJ 1874 取石子游戏 (NIM游戏)
题解:简单的NIM游戏,直接计算SG函数,至于找先手策略则按字典序异或掉,去除石子后再异或判断,若可行则直接输出. #include <cstdio> const int N=1005; ...
- HDU 1147 Pick-up sticks
题解:每放一根棍子,都判断一下它与它前面的且在顶端的棍子是否相交,相交的话则将相应的棍子从解空间中除去. #include <cstdio> const double eps=1e-14; ...
- HDU 1568 Fibonacci
题解:首先,对于小于10000的斐波那契数,我们直接计算,当大于10000时,用公式,由于只要输出前四位,所以不用考虑浮点数的问题,算出其取log的结果: tmp=(log(sq5/5)+n*log( ...
- JAVA面试中的几个重要基础问题
1.java是否会出现内存溢出?如何解决? 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存.为了解决Java中内存溢出问题,我们首先必 ...
- Android学习资料PDF免费大放送,每日更新!有需要的亲看这里
说明:以前有资料分享的时候,都叫大家留下自己的QQ邮箱,这样被很多的程序猿们认为我是专门来钓你们的QQ邮箱的.为此给大家带来的顾虑,深表抱歉.从现在开始,以后的分享资料我都会放在自己的百度网盘中,提供 ...
- D - 金樽清酒斗十千(搜索dfs)
D - 金樽清酒斗十千 Time Limit:2000MS Memory Limit:524288KB 64bit IO Format:%I64d & %I64u Submit ...