unity3d 获取坐标_unity3d获取鼠标坐标 - CSDN
  • unity3D鼠标点击获取地面坐标

    千次阅读 2015-11-19 10:51:28
    写在前面:本人初学unity3D,仅仅是菜鸟的一点小心得,想记录下来,欢迎大神来指导,也欢迎其他初学者同学来交流,互相勉励,共同进步 unity中有关于鼠标位置的函数,Input.mousePosition。但不得不说,这个函数不...

    账号被盗,文章被修改,博主已将博文删除

    展开全文
  • Unity3D世界坐标和局部坐标的关系,之间转换浅谈 目录 1、博文介绍 2、内容 (1) 相对性 (2)世界坐标 (3)局部坐标 (4)局部坐标转世界坐标 (5)世界坐标转局部坐标 3、推送 4、结语 1、博文介绍 ...

                 Unity3D世界坐标和局部坐标的关系,之间转换浅谈


    目录

    1、博文介绍

    2、内容

    (1) 相对性

    (2)世界坐标

    (3)局部坐标

    (4)局部坐标转世界坐标

    (5)世界坐标转局部坐标

    3、推送

    4、结语


    1、博文介绍

    浅谈Unity3D内的世界坐标和局部坐标,以及两者之间的相互转换。


    2、内容

    (1) 相对性

    首先我们要理解的最重要的一点就是,位置的相对性,只有相互对照我们才能判断位置

    (2)世界坐标

    世界坐标是在最高层级下的物体参照Unity3D内的世界坐标系所对应出来的位置,唯一。处于最高层级的物体,其Inspector面板内的position即为世界坐标,在Transform的API中有position属性,该属性可以直接获取物体的世界坐标,无论处于任何层级之内,获取的均是该物体的唯一世界坐标。

    (3)局部坐标

    以任意物体作为参考系,而不再是以世界零点作为参考系所获得的位置信息,即为局部坐标,例如:物体A,其子物体B,B在Inspector面板内的position信息即为B以A作为零点所得到的局部坐标,所以我们可以得到一个信息,B若不再是A的子物体,而是和A同层级,那么B的坐标就应该等于之前的局部坐标+A的坐标,如果A是世界坐标内的物体,那么所得结果就是B的世界坐标。

    (4)局部坐标转世界坐标

    由(1)可知,可直接通过transform.position获取物体世界坐标

    由(3)可知,若物体A的父级B为世界坐标系内物体,物体A的世界坐标 = 物体A的局部坐标+B的世界坐标。

    Transform的API提供一个方法TransformPoint,可以获取物体世界坐标相对于任意一点的位置,所以下面vect的值就是cube的世界坐标。

    var vect = cube.TransformPoint(new Vector3(0,0,0));

    (5)世界坐标转局部坐标

    Transform的API提供一个方法InverseTransformPoint,可以获得任意物体相对于另一个物体的局部坐标,以下代码中,所得值vect即为若cube作为fat的子物体时的局部坐标。 

    public Transform fat;
    
    public Transform cube;
    
    var vect = fat.InverseTransformPoint(cube.transform.position);

    3、推送

    博主Github:https://github.com/KingSun5


    4、结语

            若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

           QQ交流群:806091680(Chinar)

           该群为CSDN博主Chinar所创,推荐一下!我也在群里!

           本文属于原创文章,转载请著名作者出处并置顶!!!!

     

    展开全文
  • Unity3d中常见的坐标系有: 1.世界坐标系。引擎提供的空间坐标系,可通过transform.position获取坐标 2.视口坐标系。是相对于相机的坐标系,屏幕左下角为(0,0),右上角为(1,1),z轴的方向是从屏幕指向外面的...

    Unity3d中常见的坐标系有:

    1.世界坐标系。引擎提供的空间坐标系,可通过transform.position获取坐标

    2.视口坐标系。是相对于相机的坐标系,屏幕左下角为(0,0),右上角为(1,1),z轴的方向是从屏幕指向外面的,z的数值是在世界空间中z的相反数,如果Camera在世界空间中是(0,0,0),那么在屏幕上的所有点的视口坐标的z都是0,如果Camera在世界空间中是(0,0,-10),那么在屏幕上的所有点的视口坐标的z都是10

    3.屏幕坐标系。是以显示设备的分辨率来定义的,左下角为(0,0),右上角为(Screen.widthScreen.height),z轴与视口坐标相同

    4.NGUI坐标系。通常NGUI的根节点在世界空间中的位置都是(0,0,0),但是根节点会有缩放Scale.

     

    坐标变换:

    API提供的坐标变换方法

    ScreenToViewportPoint  屏幕转视口

    ScreenToWorldPoint      屏幕转世界

    ViewportToScreenPoint  视口转屏幕

    ViewportToWorldPoint    视口转世界

    WorldToScreenPoint       世界转屏幕

    WorldToViewportPoint     世界转视口

    常用的坐标变换方式:


        Vector3 NGUI2World(Vector3 pos,float z)
        {
            pos.z = 0;
            pos = SceneObjMgr.Instance.UICamera.WorldToScreenPoint(pos);
            pos.z = z;
            return Camera.main.ScreenToWorldPoint(pos);
        }

        Vector3 World2World(Vector3 pos, float z)
        {
            pos = Camera.main.WorldToScreenPoint(worldPos);
            pos.z = z;
            return Camera.main.ScreenToWorldPoint(pos);
        }

        Vector3 Screen2NGUI(Vector3 pos)
        {
            return SceneObjMgr.Instance.UICamera.ScreenToWorldPoint(pos);
        }

      Vector3 NGUI2Screen(Vector3 pos)
        {
            pos.z = 100;
            pos = Camera.main.WorldToScreenPoint(pos);
            pos.z = 0;
            return pos;
        }

    注意一个事,凡是与世界空间相关的坐标,z轴需要在视锥体之内,因为在视锥之外是看不见的,转换无意义

    展开全文
  • Unity3D】世界坐标与屏幕坐标

    万次阅读 2017-05-08 17:42:04
    Unity3D由于是在三维世界中编程,而最终的结果是需要反馈到肉眼所示的2D屏幕之上的。这就产生了一种比较需要考虑的问题,尤其在一些涉及屏幕与Unity3D的3D世界交互的情况。网络上对于这方面的文字,大部分罗列了许...

    Unity3D由于是在三维世界中编程,而最终的结果是需要反馈到肉眼所示的2D屏幕之上的。这就产生了一种比较需要考虑的问题,尤其在一些涉及屏幕与Unity3D的3D世界交互的情况。网络上对于这方面的文字,大部分罗列了许许多多文字与代码或者API,甚至连什么视口坐标也带上了。其实在于我个人看来,关键是世界坐标与屏幕坐标之间的互转。

    在Unity3D中一打开就会有一个主照相机Main Camera,根据版本不同的初始坐标会在不同的位置。拿Unity3D 4.x的(0,-1,-10)做例子,他的视距,默认是0.3~1000。


    主摄像机会对外无间断的发出投影面,将投影面所截取得到的东西,通通投影到屏幕。比如下图,这是一张极其简单的图,(0,-1,-10)的主摄像机将(0,0,0)的正方体投影出来的结果。


    现在这个正方体的世界坐标是(0,0,0),如果我们要获取屏幕坐标该怎么做呢?这注定需要用脚本来获取的,而且根据上面的示意图大家也可以知道,屏幕的大小的不同导致最后产生出来的屏幕坐标是不同的。因为Unity3D对屏幕坐标定义是这样的:


    以下脚本展示了屏幕坐标和世界坐标的互转:

    using UnityEngine;
    using System.Collections;
    
    public class CoordinateChange : MonoBehaviour
    {
        void Start()
        {
            Debug.Log("屏幕宽:" + Screen.width + "高:" + Screen.height);//获取屏幕的长和宽
            Vector2 screenPos = Camera.main.WorldToScreenPoint(new Vector3(0, 0, 0));//世界坐标(0,0,0),一般可以用transform.position获取->屏幕坐标
    
            //屏幕坐标->世界坐标
            Debug.Log(screenPos.x + "," + screenPos.y);
            Vector3 worldPos1 = Camera.main.ScreenToWorldPoint(new Vector3(0, 0, Camera.main.nearClipPlane));
            Debug.Log(worldPos1.x + "," + worldPos1.y + "," + worldPos1.z);
            Vector3 worldPos2 = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, -Camera.main.transform.position.z));
            Debug.Log(worldPos2.x + "," + worldPos2.y + "," + worldPos2.z);
        }
    }
    
    运行结果如下:


    上面脚本有几点需要说明的:

    1、Camera.main.XX能够直接对主摄像机操作,无须像网上部分文章需要利用的GameObject.Find之类的找主摄像机。

    2、世界坐标与屏幕坐标互转直接就是用WorldToScreenPoint/ScreenToWorldPoint两个方法,这方法凡是照相机对象就有。在部分设置多摄像机编程的程序,就是转换到调用的摄像机所对应的屏幕的世界。

    3、WorldToScreenPoint世界坐标转屏幕坐标,很好理解,大家也看到(0,0,0)这个世界的三维坐标转到的(431.5,174.4537)这个屏幕的二维坐标Vector2 screenPos。这里屏幕宽:863高:422,处于(0,0,0)的长方体被投影到屏幕的中央偏下的位置,这和实际是吻合的。

    当然实际操作中,其实这个屏幕坐标的多少对于我们来说是没意义的,但这个屏幕坐标所处的位置是在屏幕的百分之多少是很有意义的。所以,这一般还要配合Screen.width/height求屏幕的宽和高用。

    4、对于ScreenToWorldPoint,屏幕坐标转世界坐标,可能有人会有疑问,屏幕坐标不是一个二维坐标,怎么这里试图对一个三维坐标转换?还在Z轴附带一些奇怪奇怪的位置。这里的Z轴,是投影面底部所处的Z轴位置距离摄像机Z轴的多少。上面的投影示意图,已经可以说明投影面是多个的,但只会投影到一个2D屏幕平面而已,世界中的物体/对象只能有一个,那么就形成一种 一个世界坐标只会对应一个屏幕坐标,一个屏幕坐标可能对应多个世界坐标。所以我们要补上一个Z轴,告诉程序,我要的是哪个屏幕坐标。

    这里展示了将(0,0)这个左下角的屏幕坐标,转到距离摄像机最近的投影面上面,要拿这个投影面,如脚本所示,可以直接用Camera.main.nearClipPlane来取。还展示了将(Screen.width, Screen.height)这个右上角的屏幕坐标,放到Z轴为0,也就是世界屏幕的这个位置,因为摄像机所处的Z=-10,要放到世界坐标z=0,所以这里的Z轴要填上-Camera.main.transform.position.z,刚好就是-10-0。结果如上图所示。

    理论上,投影面距离摄像头越近,他的投影面越小。所以大家看到如果转到距离摄像机最近的投影面上面,边角的坐标是0.x级别的,放到z=0这个投影面上面,边角的坐标则去到个位数级别。

    展开全文
  • 这是一个unity提供的地理位置的接口。 三个属性: ●isEnabledByUser:检测是否有了GPS开启。 ●lastData:上一次更新位置信息的数据,初始化都为0。LocationInfo类型。 ●status:更新进程的状态。状态有Stopped、...
  • Unity3D整理——坐标

    千次阅读 2018-03-06 14:45:03
    Unity3D中,坐标系至少存在如下三种:世界坐标系、屏幕坐标系和视口坐标系。(当然,在世界坐标系中的坐标叫世界坐标; 屏幕坐标 和 视口坐标 定义同理,不再赘述。)其一,世界坐标世界坐标,是Unity3D里面每一个...
  • unity3d鼠标点击,获取世界坐标

    万次阅读 2014-07-04 02:38:10
    unity中有关于鼠标位置的函数,Input.mousePosition。但不得不说,这个函数不到位,可以用一个print函数输出一下这个坐标会发现,只有X,Y值在改变,Z值没有发生变化,并且在屏幕的左下角固定为(0,0,0),查看文档后...
  • 获取当前鼠标position:Input.mousePosition; 转载于:https://www.cnblogs.com/iack/p/3570573.html
  • Unity3D坐标变化

    2016-09-23 15:30:06
    Unity3D坐标变化。世界坐标和模型坐标之间的变换函数及其作用。
  • Unity3D世界坐标转成UI坐标

    千次阅读 2017-02-23 18:25:54
    Unity3D // 世界坐标转成UI坐标 // UI以UICamera 的形式存在  public bool WorldToUI(Vector3 world, GameObject parent, out Vector3 pos)  {  Vector3 in_main_vp = MainCamera.WorldToViewportPo
  • unity 射线获取坐标

    2020-06-15 08:38:38
    射线:碰到障碍物就会断开 鼠标点击屏幕获得一个二维坐标,通过相机的射线转换为三维世界坐标 private Vector3 worldPos;... if (Input.GetMouseButton(1)) { ... Vector3 mouse=Input.mousePosition
  • 在用transfrom .up等函数是,如果直接挂在物体上用this则会调用自身坐标,而用 public gameObject 声明变量挂物体的方式用的则是世界坐标是为什么
  • 理解Unity3D中的四种坐标体系

    千次阅读 2018-01-02 11:11:32
    coffeecato写在前面:本文比较了unity3d中的四种坐标系,在使用unity3d开发的过程中,已经多次被坐标转换之类的问题卡住,这篇文章可以说是系统的对四种坐标系进行了总结,结合实际的使用经验收获良多。
  • 【Unity】unity3d 获取手机地理位置

    千次阅读 2016-11-30 11:03:27
    怎么用unity3d 获取手机地理位置呢?unity的某些场景中,如果需要定位地理位置的话,但是unity却没有提供相应的接口。对于安卓(这里举例,IOS暂没研究)这个时候只能用java写个获取地理位置的方法,然后与unity交互...
  • Unity3D坐标

    2016-12-27 15:23:50
    世界坐标 世界坐标按照笛卡尔坐标系定义出来的绝对坐标系,下面的各种坐标系都...这就是世界坐标的概念啦,坐标系通常可以分为左手坐标系和右手坐标系,而Unity3D采用的是左手坐标系。在Unity3D中我们可以使用transfo
  • unity3d中的屏幕坐标系 是以 屏幕 左下角为(0,0)点 右上角为(Screen.Width,Screen.Height) 鼠标位置坐标与屏幕坐标系一致 视口坐标是以摄像机为准 以屏幕的左下角为(0,0)点 右上角为(1,1)点 绘制GUI界面...
  • Unity3D的世界坐标与局部坐标转化

    万次阅读 2018-09-22 10:26:31
    Unity3D中分世界坐标(World Space)和局部坐标。而Transform组件上所显示Position,Rotation,Scale均为局部坐标。 本文均为个人理解,有误希望大神能指出得以学习。 局部坐标是一种相对坐标,相对层级视图...
  • Unity3D中的四种坐标坐标

    万次阅读 2016-07-23 09:33:55
    Unity3D中的四种坐标
1 2 3 4 5 ... 20
收藏数 5,945
精华内容 2,378
关键字:

unity3d 获取坐标