unity 怎样正确unity2d 获取精灵坐标2d世界坐标

unity中捕捉鼠标左键事件及其坐标 - stephen830 - ITeye技术网站
博客分类:
unity中捕捉鼠标左键事件及其坐标
#pragma strict
var imgBG : Texture2D;
var imgSmall : Texture2D;
var screenWidth : int = Screen.
function Start () {
function Update () {
function OnGUI(){
//set screen background image
GUI.DrawTexture(Rect(0,0,960,640),imgBG);
GUI.Label(Rect(0,0,120,50),"hello");
//draw a image when mouse left-key click
var x :int = 0;
var y :int = 0;
if(Input.GetMouseButton(0)){ //a coordinate of screen (left down corner is 0,0 and right up corner is maxWidth,maxHeight)
x = Input.mousePosition.x;//get x of coordinate
y = Input.mousePosition.y;//get y of coordinate
GUI.DrawTexture(Rect(x,screenWidth-y,48,48),imgSmall);
GUI.Label(Rect(100,0,120,50),"x,y="+x+","+y);
stephen830
浏览: 1745001 次
来自: 上海
非常感谢,正好用上
提示的/222.177.4.242
无法链接到ip地址,是什 ...以前都是做2D游戏,基本不关注数学方面的知识。现在学习unity了,很多概念都不懂。学生时代的东西,早还给老师了。当然我学习不好 = =!所以现在来补补。毕竟现在要做3D了。基础的东西还是得懂。
下面是我看书的一些重点、我将其记录下来。以后也方便自己温习!
笛卡尔坐标系 的定义 :
1、每个2D笛卡尔坐标系都有一个特殊的点,称为原点(0,0)它是坐标系的中心。
2、每个2D笛卡尔坐标系都有两条过原点的直线向两边无限延伸,称为轴,两个轴互相垂直。
笛卡尔坐标系定位
坐标系是一个精确定位点的框架。为了在笛卡尔坐标系中定位点,引入了笛卡尔坐标的概念。在2D平面中,两个数(x,y)就可以定义一个点。坐标的每个分量都表明了该点与原点之间的距离和方位,每个分量都是到相应轴的有符号距离。如下图所示,x分量表示该点到y轴的有符号距离,同样y分量表示该点到x轴的有符号距离。“有符号距离”指在某个方向上距离为正,而在相反方向为负。
3D坐标系:
3D坐标系表示三维空间系,3D坐标系存在三个轴,比2D坐标系多了一个Z轴,3个轴相互垂直,也就是没个轴都有垂直于其他两个轴。在3D坐标系中点位需要3个数:x、y、z.
左手坐标系、右手坐标系:
3d坐标系存在两种完全不同的坐标系,左手坐标系和右手坐标系。如果属于相同的坐标系,可以通过旋转来重合,否则是不可以重合的。两个坐标系之间没有好坏,之是应用与不懂的场景。 计算机中使用左手坐标系,线性代数中使用右手坐标系。
多坐标系:
为什么使用多坐标系?因为在不同的情况下使用不同的坐标系更加的方便。某些信息只有在特定的上下文环境中获得。
一些有用的坐标系:
1、世界坐标系:是一个特殊的坐标系,它建立了描述其他坐标系所需要的参考框架,另一方面说,能用时间坐标系描述其他坐标系的位置,而不能用更大的坐标系来描述世界坐标系。
2、物体坐标系:特定物体相关联的坐标系。当物体位移或改变方向时,和该物体相关的坐标系也随之移动和改变方向。比如告诉你“向前走一步”,则是向你的物体坐标系发指令。“前”、“后”、“左”、“右”这样的概念只有物体坐标系才有意义。“向左转”是物体坐标系,“向东”则是世界坐标系。有时物体坐标系也称作模型坐标系,模型顶点的坐标都是在模型坐标系中描述的。
3、摄像机坐标系:观察者密切相关的坐标系。摄像机坐标系被看作是一种特殊的物体坐标系,该物体坐标系定义摄像机的屏幕可视区域。在摄像机坐标系中,摄像机在原点,x轴向右,z轴向前,y轴向上。一个摄像机坐标系如下图所示。关于摄像机坐标系的轴向约定可能不同。许多图形学书中习惯用右手坐标系,z轴向外,即从屏幕指向读者。2D屏幕上显示的内容就是3D摄像机坐标系通过投影转换呈现的。
4、惯性坐标系:为了简化世界坐标系到物体坐标系之间的转换,才有了惯性坐标系。惯性坐标系的原点和物体坐标系的原点重合,但惯性坐标系的轴平行于世界坐标系轴。所以从物体坐标系转换为惯性坐标系只需要旋转,从惯性坐标系到世界坐标系只需要平移。
5、嵌套坐标系:3D虚拟世界中每个物体都有自己的坐标系———-自己的原点和坐标轴。每个模型都有自己的原点和坐标轴,模型的子物体就是在这个嵌套坐标系中。
物体坐标系到世界坐标系的转换:
1、旋转物体坐标系到惯性坐标系。将物体坐标轴旋转到与惯性坐标系重合。
2、将惯性坐标系原点平移至世界坐标系。
关于Unity的一些坐标系的知识:
Unity是左手坐标系
世界坐标系:我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的。transform.position可以获得该位置坐标。
屏幕坐标系:以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),Z的位置是以相机的世界单位来衡量的。注:鼠标位置坐标属于屏幕坐标,Input.mousePosition可以获得该位置坐标,手指触摸屏幕也为屏幕坐标,Input.GetTouch(0).position可以获得单个手指触摸屏幕坐标。
绘制GUI界面的坐标系:这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height)。
视口坐标系:视口坐标是标准的 相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)点,Z的位置是以相机的世界单位来衡量的。
世界坐标→屏幕坐标:camera.WorldToScreenPoint(transform.position);这样可以将世界坐标转换为屏幕坐标。其中camera为场景中的camera对象。
屏幕坐标→视口坐标:camera.ScreenToViewportPoint(Input.GetTouch(0).position);这样可以将屏幕坐标转换为视口坐标。其中camera为场景中的camera对象。
视口坐标→屏幕坐标:camera.ViewportToScreenPoint();
视口坐标→世界坐标:camera.ViewportToWorldPoint();
Position.cs
using UnityE
using System.C
public class Position : MonoBehaviour
//场景的相机,拖放进来
//场景的物体
private GameO
void Start()
obj = GameObject.Find("Plane");
void Update()
if (Input.GetMouseButtonDown(0))
print("世界坐标" + obj.transform.position);
print("屏幕坐标" + Input.mousePosition);
print("Plane 世界坐标→屏幕坐标" + camera.WorldToScreenPoint(obj.transform.position));
print("鼠标屏幕坐标→视口坐标" + camera.ScreenToViewportPoint(Input.mousePosition));
print("Plane 世界坐标→视口坐标" + camera.WorldToViewportPoint(obj.transform.position));
123456789101112131415161718192021222324252627282930313233343536373839404142434445
using UnityEngine;&using System.Collections;&public class Position : MonoBehaviour{&&&&&//场景的相机,拖放进来&&&&&&&&&&&&&public Camera camera;&&&&&//场景的物体&&&&&&&&&&&&&private GameObject obj;&&&&&void Start()&&&&{&&&&&&&&&//初始化&&&&&&&&&&&&&&&&&obj = GameObject.Find("Plane");&&&&&}&&&&&void Update()&&&&{&&&&&&&&&if (Input.GetMouseButtonDown(0))&&&&&&&&{&&&&&&&&&&&&&print("世界坐标" + obj.transform.position);&&&&&&&&&&&&&print("屏幕坐标" + Input.mousePosition);&&&&&&&&&&&&&print("Plane 世界坐标→屏幕坐标" + camera.WorldToScreenPoint(obj.transform.position));&&&&&&&&&&&&&print("鼠标屏幕坐标→视口坐标" + camera.ScreenToViewportPoint(Input.mousePosition));&&&&&&&&&&&&&print("Plane 世界坐标→视口坐标" + camera.WorldToViewportPoint(obj.transform.position));&&&&&&&&&}&&&&&}&}posts - 261,&
comments - 12,&
trackbacks - 0
http://blog.csdn.net/zuoyamin/article/details/8813424
World Space(世界坐标):我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的。transform.position可以获得该位置坐标。&&&&&&&&&&&&
Screen Space(屏幕坐标):以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),Z的位置是以相机的世界单位来衡量的。注:鼠标位置坐标属于屏幕坐标,Input.mousePosition可以获得该位置坐标,手指触摸屏幕也为屏幕坐标,Input.GetTouch(0).position可以获得单个手指触摸屏幕坐标。
ViewPort Space(视口坐标):视口坐标是标准的和相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)点,Z的位置是以相机的世界单位来衡量的。(用的不多,反正我暂时没有用到~呵呵~)
绘制GUI界面的坐标系:这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height)。
世界坐标&屏幕坐标:camera.WorldToScreenPoint(transform.position);这样可以将世界坐标转换为屏幕坐标。其中camera为场景中的camera对象。
屏幕坐标&视口坐标:camera.ScreenToViewportPoint(Input.GetTouch(0).position);这样可以将屏幕坐标转换为视口坐标。其中camera为场景中的camera对象。
视口坐标&屏幕坐标:camera.ViewportToScreenPoint();
视口坐标&世界坐标:camera.ViewportToWorldPoint();
案例1&&在鼠标点击的位置上绘制一张图片出来(关于绘制GUI界面坐标系与屏幕坐标系之间的关系)。
using UnityE
using System.C
public class test : MonoBehaviour
//储存鼠标的位置坐标
private Vector2
void OnGUI()
//鼠标左击,获取当前鼠标的位置
if (Input.GetMouseButton(0))
pos = Input.mouseP
//绘制图片
GUI.DrawTexture(new Rect(pos.x,Screen.height - pos.y,100,100), img);
案例2&&坐标显示和坐标转换(这个是触摸方面的。如果没有触摸屏,那就将那个if去掉吧!)
using UnityE
using System.C
public class test: MonoBehaviour
//场景的相机,拖放进来
//场景的物体
private GameO
void Start()
obj = GameObject.Find("Plane");
void Update ()
if (Input.touchCount & 0)
print("世界坐标" + obj.transform.position);
print("屏幕坐标" + Input.GetTouch(0).position);
print("世界坐标&屏幕坐标" + camera.WorldToScreenPoint(obj.transform.position));
print("屏幕坐标&视口坐标" + camera.ScreenToViewportPoint(Input.GetTouch(0).position));
print("世界坐标&视口坐标" + camera.WorldToViewportPoint(obj.transform.position));
场景中有一个照3D物体的透视摄像机,NGUI使用自己独立的正交摄像机,转换步骤如下:&
1. 使用透视摄像机把世界坐标转换到屏幕坐标
Vector3 pos = Camera.main.WorldToScreenPoint(worldPos);
pos.z = 0f; & //z一定要为0.
2. 使用UI摄像机转换到NGUI的世界坐标
Vector3 pos2 = UICamera.currentCamera.ScreenToWorldPoint(pos);
3. 赋值给NGUI控件
temp.transform.position = pos2;&//temp为NGUI控件.
所有坐标系统间转换, 可以通过屏幕坐标作为桥梁, 各坐标系映射到屏幕坐标再转换到目标坐标系。
阅读(...) 评论()??各位大家好,欢迎大家关注我的,我是秦元培,我的博客地址是。今天博主想和大家聊聊Unity3D中各种坐标系。自从Unity4.6版本推出uGUI后,Unity3D坐标系的大家庭中便增加了RectTransform这个新成员,如果你不想被各种坐标系搞得晕头转向的话,那么请随我一起来梳理下Unity3D中各种各样的坐标系!
一、Unity3D中有哪些坐标系?
??坐标系这个概念最早是由法国数学家笛卡尔提出的,并由此创造了用代数方法来研究几何图形的数学分支——解析几何。解析几何的基本思想是将几何图形抽象成点的运动轨迹,从而点可以作为组成图形的基本,而描述一个点的位置首先需要建立合适的坐标系。所以,首先我们来了解下Unity3D中都有哪些坐标系吧!Unity3D中的坐标系目前可以分为以下四类:世界坐标、屏幕坐标、视图坐标和GUI坐标。下面我们来对这5类坐标进行详细说明:
??世界坐标按照笛卡尔坐标系定义出来的绝对坐标系,下面的各种坐标系都建立在世界坐标的基础上。我们知道二维平面内任意一个点可以用二维坐标(x,y)来表示,如果将这个概念延伸到三维内,那么三维空间内任意一个点都可以用三维坐标(x,y,z)来表示。这就是世界坐标的概念啦,坐标系通常可以分为左手坐标系和右手坐标系,而Unity3D采用的是左手坐标系。在Unity3D中我们可以使用transform.position来获取场景中一个物体的世界坐标,通常情况下中的Inspector窗口是以世界坐标来描述一个3D物体的位置的,除非当一个3D物体存在父物体的时候,它会以相对坐标来描述其位置。
??屏幕坐标是以像素来定义的,它的范围是以左下角为(0,0),右上角为(Screen.width,Screen.height)定义的这样一个矩形。屏幕坐标是一个3D坐标,Z轴是以相机的世界单位来衡量的。屏幕坐标和相机之间满足:Screen.width=Camera.pixelWidth和Screen.height=Camera.pixelHeight这两个条件。例如我们将相机正对着场景中的原点(0,0,0),相机的Z轴分量为-10,按照屏幕坐标的定义,假设屏幕为800X640的大小,则此时原点转化为屏幕坐标后应该是(400,320,10)。在Unity3D中我们可以使用WorldToScreenPoint来将一个世界坐标转换为屏幕坐标。
??视口坐标是标准化后的屏幕坐标。标准化的概念我们可以引申到向量的标准化中,比如一个向量(x,y)将过标准化后可以得到一个单位向量(x’,y’)。类似地,视口坐标是以0到1间的数字来表示的,它的范围是以左下角为(0,0),右上角为(1,1)定义的这样一个矩形。视口坐标是一个3D坐标,Z轴是以相机的世界单位来衡量的。通过对比可以发现视口坐标和屏幕坐标特别的相似,所以这里大家可以对比着来学习。同样以屏幕坐标中的例子来将这里的转换,例如我们将相机正对着场景中的原点(0,0,0),相机的Z轴分量为-10,按照屏幕坐标的定义,假设屏幕为800X640的大小,则此时原点转化为屏幕坐标后应该是(0.5,0.5,10)。在Unity3D中我们可以使用WorldToViewportPoint来将一个世界坐标转换为视口坐标。
??GUI坐标是指通过OnGUI方法绘制UI时使用的坐标。这个坐标系和屏幕坐标类似,它同样是以像素来定义的,它的范围是以左上角为(0,0),右下角为(Screen.width,Screen.height)定义的这样一个矩形,GUI坐标是一个2D坐标(绝对坐标)。因为GUI在早期的中曾有所设计,属于Unity3D中较为基础的内容,此外我们知道使用绝对坐标来进行布局的话是没有办法做自适应的,所以这部分内容我们就不展开讲了,UI自适应的一个主要观点就是不要使用绝对坐标!不要使用绝对坐标!不要使用绝对坐标!重要的事情要说三遍的嘛!这里想特别说说Unity4.6以后推出的全新UI支持:uGUI。在uGUI的Screen Space模式下,Unity3D的编辑器以屏幕坐标来显示UI元素的位置;在World Space模式下,Unity3D的编辑器以世界坐标来显示UI元素的位置。相信这一点大家在使用的时候都没有注意到,最近在看一个论坛帖子的时候发现对uGUI坐标转换的相关一片茫然,所以对这部分内容进行了深入的研究,最终得出的结论是:uGUI的坐标本质上是特殊的屏幕坐标,因为uGUI的Anchor决定了该坐标系的原点,pivot决定了元素本身坐标系的原点,正是这两个属性让uGUI的坐标看起来显得扑朔迷离。RectTransform组件继承自Transform,所以它们的position和localPosition是等价的,都是世界坐标;anchoredPosition是UI元素的屏幕坐标,在对UI元素进行操作的时候应该考虑使用这个坐标。
二、Unity3D各种坐标系间的转换
??虽然Unity3D里提供了各种坐标系间的转换API,可是我们这是在写博客不是在说API不是?所以从实用性的角度出发,我们这里提供了一个Unity3D各种坐标系间转换的FAQ!
1、屏幕坐标如何转换为世界坐标?
在Unity3D中通过camera.ScreenToWorldPoint(Vector3 v)方法可以将一个屏幕坐标转化为世界坐标。其中,camera是场景中的场景相机。通过Input.mousePosition或者
Input.touches[0].position可以获得鼠标或者单根手指的屏幕坐标。典型的应用场景是第一人称射击游戏中子弹的发射和RPG游戏中点击地面移动角色。
2、世界坐标如何转换为屏幕坐标?
在Unity3D中通过camera.WorldToScreenPoint(Vector3 v)方法可以将一个世界坐标转化为屏幕坐标。其中,camera是游戏场景中的UI相机。比如我们需要将一个世界坐标转换到NGUI坐标的时候,可以使用场景相机将世界坐标转为屏幕坐标,然后再利用UI相机将屏幕坐标转换为世界坐标,最后再赋值给NGUI控件。典型的应用场景是NPC头顶的文字显示和怪物头顶的血条显示。
3、屏幕坐标如何转换为视口坐标?
在Unity3D中可以通过camera.ScreenToViewportPoint()来将一个屏幕坐标转换为视口坐标,其中camera是游戏场景中的场景相机。当我们了解了视口坐标本质就是屏幕坐标的标准化坐标以后,这个真心没有什么可说的。
4、世界坐标如何转换为视口坐标?
在Unity3D中可以通过camera.WorldToViewportPoint()来将一个世界坐标转换为视口坐标,其中camera是游戏场景中的场景相机。当我们了解了视口坐标本质就是屏幕坐标的标准化坐标以后,这个真心没有什么可说的。
5、屏幕坐标如何转化为GUI坐标?
我们注意到屏幕坐标和GUI坐标的根本差异在于坐标系原点选定不同,即屏幕坐标的原点在左下角,而GUI坐标的原点在左下角。因此我们可以定义一个ScreenToGUIPoint方法:
private Vector2 ScreenToGUIPoint(Vector2 v)
return new Vector2(v.x,Screen.height-v.y)
6、GUI坐标如何转换为屏幕坐标?
一个更为神奇的事情是你可以继续调用ScreenToGUIPoint方法。
7、屏幕坐标如何转换为uGUI坐标?
当我们接触到uGUI以后常常会遇到类似NGUI需要为uGUI控件坐标赋值的问题,此时我们我们有以下两种思路处理:
直接把屏幕坐标赋值给transform.position,这种方式简单粗暴在ScreenSpace-Overlay模式下没有问题,然而在ScreenSpace-Camera模式下会出现因为深度数值不正确而引发的问题,需要注意(并且需要确保被赋值的物体在Canvas的根节点下),前段时间有人在群里问我position和localPosition的区别,我就呵呵哒,现在人都是一般的浮躁啊,宁肯整天钻研某某插件的用法都不愿意钻研下API文档、图形学、3D数学这些东西。
通过RectTransformUtility.ScreenPointToWorldPointInRectangle方法将屏幕坐标转化为世界坐标然后再赋值给transform.position。两种方法看起来大同小异,然而这种方法是更为保险的,因为它在这两种模式下都能稳定地运行。更重要的是它可以和uGUI的事件系统完美地融合。我猜测它是直接改变UI元素的世界坐标,因为它是赋值给transform.position。可是话说回来,以前给怪物头顶显示血条的时候都是直接把世界坐标转屏幕坐标再赋值给transform.position,这样看来当初的想法可能是错误的呀,如果要给UI控件屏幕坐标那不是应该给anchoredPosition赋值吗?好吧,这块儿暂时还没有搞明白,如果有朋友知道怎么回事,可以告诉我,谢谢!
好了,今天的内容就是这样啦,如果对文章中的内容有不明白或者质疑的地方,欢迎在博客里留言。目测今天写了篇虎头蛇尾的文章啊,然而最近一直没有比较好的状态怎么破,感觉快被自己打败了,哈哈!
版权声明:本文为博主原创文章,未经博主允许不得转载。转载请注明本文作者及出处,谢谢!

我要回帖

更多关于 unity 2d 坐标 的文章

 

随机推荐