atlas z 轴

时间:2022-08-30 11:04:11
问题源自一个帖子,因为上传的图比较多,就另开了这个贴写下自己的试验结果,原帖在下面链接中

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在最上面


atlas z 轴

 

现在在depth不变的前提下修改z轴的值。将0_Dark的z轴调为-100,则它离相机更近了,看上去应该挡住后面的两个才对,但Game场景中三者的关系并没有改变,也就是说虽然看上去0_Dark应该挡住后面的东西,但并没有这样,还是depth起作用,也就是feiben同学所说的“相同atlas其实是共用同一个Z轴深度”。


atlas z 轴

2,不同panel下,同一个atlas的不同sprite不受depth的控制,而受z轴控制。此时只需稍微调节下其中一个精灵的z轴就可以,比如0.1,就可以控制sprite的显示

比如接着1中的图,新建一个panel_B,将1_NGUI拖到里面,会看到它盖住了0和2,现在调节depth不起作用,无论1_NGUI的depth调成多少,都不会改变它在最上面的状态


atlas z 轴

现在调节下1_NGUI的z轴为0.1,则它到了最后面


atlas z 轴

而比如现在想把在panel_B中的1_NGUI重新显示在0和2之间,能办到么?经过试验会发现无论怎么调三者的z轴,都不能将NGUI放到1和2之间,因为它们是一个图集中的精灵,共用一个z轴深度

比如将0_Dark的z设为100,此时1_NGUI的z轴还是0.1,但1_NGUI重新跑到了最上面,而不是中间


atlas z 轴

再把Label的z设为-100,NGUI是被覆盖了,但Dark也跟着跑到了上面,注意此时三者的空间位置,NGUI的确是在中间的,但还是被后面的Dark挡住了


atlas z 轴

你也许会感觉这是自找麻烦,没事把同一个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的中间


atlas z 轴

 

不过如果认为为什么要这么麻烦呢,只需要在一个panel中调节就可以了,那就回到了2中的问题上,总是在上或在下,而不会在中间

 


,Dark为100,Lable为-100,且三者的depth也是相应的,但wooden还是在最上面
atlas z 轴
,而Dark和Label的z不变,则wooden跑到了最后面,但就是不到中间去
atlas z 轴

此外,即使用两个panel,但同是SiFi图集中的Dark和Label还是在同一个panel下,而把wooden放到另一个panel中,还是无法达到插入的目的,如下图,无论怎么调节wooden的z轴,它要么在最前面,要么在最后面

atlas z 轴


此时只需把Dark或Label之一放到wooden的panel下就能实现wooden在中间的目的,比如把Dark和wooden放到一起

atlas z 轴

而现在有个有趣的想法,就是既然这样可以达到wooden在中间的目的,那能不能把label放到两者中间呢?试一下就知道,是可以的。
而既然这样,那Dark能放到两者中间么,试一下,还是可以的
。这就让定位更加灵活

当然这是最简单的穿插,如果有多个panel和多个atlas的话情况会比较复杂,此时要记着2中的情况,否则还是容易出现无法穿插的问题。而解决这个问题的方法最好还是atlas设计的时候更全面,让穿插的sprite在一个atlas中,这样只用depth深度就可以控制了

 

4,同一个panel下,不同Atlas的sprite,受z轴控制,depth不起作用。而默认添加的时候覆盖关系似乎和atlas有关,比如从SiFi图集和Wooden图集中分别添加任意一个精灵到同一个panel下,总是SiFi的精灵在下面,此时depth不起作用,可以直接调节z轴比如-0.1就可以

 

5,(修改)对于panel是否会产生drawcall,之前的试验存在误区,当时是直接复制带着sprite的Panel,这的确会产生新的drawcall,这是因为在复制时panel的scale被修改了,由1变成了0.9999304之类的,这会导致drawcall增加了1个,而之后再复制这个由复制产生的panel,scale还是0.9999304,所以drawcall不会再变。

现在发现修改panel的缩放scale的确会增加drawcall。所以如果为了方便而复制一个panel的话,别忘了reset它的缩放

而之所以对panel是否会产生drawcall,是因为官方例7中只用了2个Atlas,但drawcall却是5个,当时简单的认为是panel的问题。

  • atlas z 轴
  • atlas z 轴
  • atlas z 轴
12
0
 
 
 
atlas z 轴
学者

atlas z 轴

  • 粉丝35
  • 鲜花4365朵
  • 威望67点
  • atlas z 轴
 
 
1楼#

发布于:2013-02-08 00:55

 
其实上面的东西总结出来就一句话:(啰嗦那么多,总结却这么少,好没成就感,呵呵)


在相同Panel下,相同Atlas中的Sprite才受Depth控制,其他情况则受z轴控制,但同时又受前者影响。 

 


列个表的话就是:

1、相同panel    相同atlas     sprite受depth控制

2、相同panel
  
  不同atlas     sprite受z轴控制    
(同时受1的影响)

3、不同panel    相同atlas     sprite受z轴控制

(同时受1的影响)

4、不同panel    不同atlas     sprite受z轴控制    
(同时受1的影响)

不过要特别注意的是,虽然depth控制的范围看似较少,但它却占主导地位,是最常被用到的,这是因为NGUI基于Atlas,只有在1无法达到目的的时候,才会去用其他的。
 而且在较复杂的情况时它也是易被忽略的,也就是2、3、4括号中的“同时受1的影响”。比如在2中,相同panel下,有三个sprite:A、B、C,但A和B的Atlas是相同的,C是的Atlas是另一个,此时即使用z轴控制,也无法将C放到AB之间,这也是上楼中3中所提到的问题。

此外关于字体,
感觉要分两方面,一个是英语等外语,一个是中文。

对于英文,因为就那些有限的字母(因为只会点英语,所以不知道是不是有的外语制作起来也很繁杂),所以可以和图片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条一样。

atlas z 轴
此外对于将文字打包到Atlas中,是在制作字体是,在FontMaker中选择目标Atlas,此时就会将文字打包到了此Atlas中。不过要注意,这个操作会修改Atlas,所以不要弄错了
如下图,就是将官方的Arimo14字体打包到了DiShuTest图集中,也就是在Output选项中选择Atlas。而or select这项中的字体会被替换掉,可以不选,当然Atlas在不打包字体的时候也可以不选
atlas z 轴
而对于中文,文字因为不能像英文那样用单个的字母来组成,所以为了能显示大多数的常用字,一般都是用单独的UIFont来制作,可看做是一个atlas,这种情况下,字体的atlas和其他的atlas就是在不同的图集了。此时可用z轴来控制。

比如下图中,用了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 轴

现在用z轴控制他们的显示顺序和depth一样,很容易就做到了。

atlas z 轴

这些试验都是在比较简单的情况下做的,所以可能并不真的对,所以如果有错误的地方请指出。

 

 

atlas z 轴的更多相关文章

  1. (转)NGUI中深度depth和z轴关系

    先列出转载链接: http://game.ceeger.com/forum/read.php?tid=8917 转载原文: 问题源自一个帖子,因为上传的图比较多,就另开了这个贴写下自己的试验结果,原帖 ...

  2. 传感器(3)传感器的X,Y,Z轴

    设备正面水平向上. X轴 : 左右方向,向右是正值. Y轴 : 远近方向,远离你是负. Z轴 : 上下方向,向上是正值.

  3. transform:translateZ() 字体模糊问题 父类重返Z轴平面

    translateZ()变糊 第一种情况: 当translateZ(m)中的 m设置为 非整数,1.5px 之类的,字体会模糊,但是不明显;和浏览器渲染,字体格式,或者操作系统有关, 这个 css中 ...

  4. 内联元素于与块元素的转换 相对定位、绝对定位以及fixed定位 Z轴覆盖

    今天上午学习了内联元素于与块元素的转换     个人觉的display:none将元素非常好用,可以配合当鼠标放到这里会出现. 转换成行内元素display: inline;  转换成块元素displ ...

  5. [osg][原]osg的坐标系:使用右手法则Y轴向前、X向、右Z向上。camare的默认姿态:向下看(Z轴负向),头向前(Y轴正向)

    参考:http://blog.csdn.net/tmljs1988/article/details/7561887 图中上半边为opengl坐标系,下半边的osg坐标系: osg::Camare的默认 ...

  6. SVG渲染顺序及z轴显示问题(zIndex)

    SVG是严格按照定义元素的顺序来渲染的,这个与HTML靠z-index值来控制分层不一样. 在SVG中,写在前面的元素先被渲染,写在后面的元素后被渲染.后渲染的元素会覆盖前面的元素,虽然有时候受透明度 ...

  7. PhoneGap 加速计 api 获取加速计 x 轴 y 轴 z 轴信息

    一.PhoneGap 加速计 Accelerometer 对象介绍 1.主要方法 accelerometer.getCurrentAcceleration 获取当前设备在 x,y,z 轴上的加速度信息 ...

  8. OpenGL编程(七)3D模型的深度(z轴)检测

    下图是我们要修改后的效果图: 一.深度检测 1.模型Z轴显示有问题: 上一次试验中,如果认真留意,会发现一个问题.当控制锥体在左右或上下旋转时,你会发现锥体看起来是在+-180度之间来回摆动,而不是3 ...

  9. 如何让View一直沿z轴旋转

    #import <QuartzCore/QuartzCore.h>... CABasicAnimation *rotationAni = [CABasicAnimation animati ...

随机推荐

  1. tar压缩

    tar 压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称 查 询:tar -jtv -f filename.tar.bz2 解压缩:tar -jxv -f f ...

  2. ACK

    ACK (Acknowledgement),即确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符.表示发来的数据已确认接收无误. 目录 1基本介绍 2详细释义     1基本介绍编辑 英文缩 ...

  3. 21世纪C语言&lpar;影印版&rpar;

    <21世纪C语言(影印版)> 基本信息 原书名:21st Century C 作者: Ben Klemens 出版社:东南大学出版社 ISBN:9787564142056 上架时间:201 ...

  4. Hbase 建表基本命令总结

    访问hbase,以及操作hbase,命令不用使用分号 hbase shell 进入hbase list 查看表 hbase shell -d hbase(main):024:0> scan '. ...

  5. 简单JavaSE数据类型入门

    新的一节学习了JavaSE,今天主要来说一下Java的数据类型及其输出,借用Xmind,可以生动形象的向大家来解释Java的数据类型: 其中数值整数型举例: public class A02{ pub ...

  6. 如何通过ftell和fseek来获取文件大小

    #include <stdio.h> int main () { FILE * pFile=NULL; long size; pFile = fopen ("myfile.txt ...

  7. 关于webapp中的文字单位的一些捣腾

    前言 文字是网页内容的一枚大将,我们无时无刻都在看着它,只要是你盯屏幕上的任何一个地方都会有文字.地铁上无时无刻都在盯着屏幕上的人对于文字更为敏感,太大不行,太小TN又看不清上面到底在说什么,有时候车 ...

  8. ProgressDialog修改TextView的TextSize

    ProgressDialog修改TextView的TextSize 问题描述 今天UI过来找我说是加载条的字号太小了,不好看,希望可以改一下,然后我就研究一下如何修改ProgressDialog里面T ...

  9. python day14--内置函数二

    主要内容: 1.lamda匿名函数 2.sorted() 3.filter() 4.map() 5.递归函数 一.Lamda匿名函数 语法:lamda:参数:返回值 # 计算n的n次⽅方 def fu ...

  10. 图解http学习笔记【一】

    不想单纯的把书里的知识点罗列一遍 这周,我们的安全代码终于改完了.我在微信上报了个叫 一修读书的课程,现在已经听了6天.感觉并不是很神奇,聊胜于无.倒是趁着当当搞活动买回来好几本书,其中就有这本图解h ...