Unity坐标系、相互转换和相对自身的方位及角度。

这篇具有很好参考价值的文章主要介绍了Unity坐标系、相互转换和相对自身的方位及角度。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Unity的4种坐标系

Unity坐标系、相互转换和相对自身的方位及角度。文章来源地址https://www.toymoban.com/news/detail-496113.html

1, World Space(世界坐标):
我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的。transform.position可以获得该位置坐标。

2, Screen Space(屏幕坐标):
以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),Z的位置是以相机的世界单位来衡量的。
注:鼠标位置坐标属于屏幕坐标,Input.mousePosition可以获得该位置坐标,手指触摸屏幕也为屏幕坐标,Input.GetTouch(0).position可以获得单个手指触摸屏幕坐标。

3.ViewPort Space(视口坐标):
视口坐标是标准的和相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)点,Z的位置是以相机的世界单位来衡量的。

4, 绘制GUI界面的坐标系:
这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height)。

【四种坐标系的转换】

1、世界坐标→屏幕坐标:camera.WorldToScreenPoint(transform.position);这样可以将世界坐标转换为屏幕坐标。其中camera为场景中的camera对象。

2、屏幕坐标→视口坐标:camera.ScreenToViewportPoint(Input.GetTouch(0).position);这样可以将屏幕坐标转换为视口坐标。其中camera为场景中的camera对象。

3、视口坐标→屏幕坐标:camera.ViewportToScreenPoint();

4、视口坐标→世界坐标:camera.ViewportToWorldPoint();
二、Unity坐标系间的相互转换
全局坐标和局部坐标
点的坐标转换
Transform.TransformPoint(Vector3 position); 将一个坐标点从相对transform的局部坐标系转换为全局坐标系
Transform.InverseTransformPoint(Vector3 position); 将坐标点从全局坐标系转换到相对transform的局部坐标系

方向的坐标转换
Transform.TransformDirection(Vector3 direction); 将一个方向从局部坐标系转换到全局坐标系
Transform.InverseTransformDirection(Vector3 direction); 将一个方向从全局坐标系转换到局部坐标系
Transform.TransformVector(Vector3 vector); 将一个向量从局部坐标系转换到全局坐标系
Transform.InverseTransformVector(Vector3 vector); 将一个向量从全局坐标系转换到局部坐标系

屏幕坐标系和全局坐标系
Camera.ScreenToWorldPoint(Vector3 position); 将屏幕坐标系转换为全局坐标系
Camera.WorldToScreenPoint(Vector3 position); 将全局坐标转换为屏幕坐标
Input.mousePosition;  获取鼠标在屏幕中的坐标

例子: 屏幕坐标转为世界坐标
        Vector3 mousePos = Input.mousePosition;
        Vector3 SToW = Camera.main.ScreenToWorldPoint(new Vector3(mousePos.x,mousePos.y,1));

视口坐标(屏幕坐标的单位化,最大值是1)和屏幕坐标的转换  
Camera.ScreenToViewportPoint(Vector3 position); 将屏幕坐标转为视口坐标
Camera.ViewPortToScreenPoint(Vector3 position); 将视口坐标转为屏幕坐标

世界坐标与视口坐标 转换
Camera.WorldToViewportPoint(Vector3 position); 将全局坐标转换为视口坐标
Camera.ViewportWorldPoint(Vector3 position); 将视口坐标转换为全局坐标
三、Unity判断相对于自身的方位和角度    
[csharp] view plain copy
    //求角度 及前后左右方位  
    public void checkTargetDirForMe(Transform target)  
    {  
        //xuqiTest:  target.position = new Vector3(3, 0, 5);  
        Vector3 dir = target.position - transform.position; //位置差,方向  

        //方式1   点乘  
        //点积的计算方式为: a·b =| a |·| b | cos < a,b > 其中 | a | 和 | b | 表示向量的模 。  
        float dot = Vector3.Dot(transform.forward, dir.normalized);//点乘判断前后:dot >0在前,<0在后
        float dot1 = Vector3.Dot(transform.right, dir.normalized);//点乘判断左右: dot1>0在右,<0在左
        float angle = Mathf.Acos(Vector3.Dot(transform.forward.normalized, dir.normalized)) * Mathf.Rad2Deg;//通过点乘求出夹角  
      
        //方式2   叉乘  
        //叉乘满足右手准则  公式:模长|c|=|a||b|sin    
        Vector3 cross = Vector3.Cross(transform.forward, dir.normalized);//叉乘判断左右:cross.y>0在左,<0在右   
        Vector3 cross1 = Vector3.Cross(transform.right, dir.normalized); //叉乘判断前后:cross.y>0在前,<0在后   
        angle = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(transform.forward.normalized, dir.normalized))) * Mathf.Rad2Deg;  
          
    }  

// 判断物体是否在眼前 和 背后  fangxiang>0在眼前 , <0在背后
Vector3 dir =  target.transform.position - fpsPlayer.transform.position;
fangxiang = Vector3.Dot(fpsPlayer.transform.forward, dir.normalized);

1.判断目标在自己的前后方位可以使用下面的方法:
   Vector3.Dot(transform.forward, target.position)
       返回值为正时,目标在自己的前方,反之在自己的后方

2.判断目标在机子的左右方位可以使用下面的方法:
   Vector3.Cross(transform.forward, target.position).y
      返回值为正时,目标在自己的右方,反之在自己的左方

3.在这里顺便解说下关于空间向量的点积和叉积:
A.点积
  点积的计算方式为:  a·b=|a|·|b|cos  其中|a|和|b|表示向量的模,
表示两个向量的夹角。另外在 点积 中,和 夹角是不分顺序的。
  所以通过点积,我们其实是可以计算两个向量的夹角的。
  另外通过点积的计算我们可以简单粗略的判断当前物体是否朝向另外一个物体: 只需要计算当前物体的transform.forward向量与 otherObj.transform.position 的点积即可, 大于0则在前方,否则在后方。

B.叉积
  叉积的定义: c =a x b  其中a,b,c均为向量。即两个向量的叉积得到的还是向量!    性质1: c⊥a,c⊥b,即向量c垂直与向量a,b所在的平面 。    性质2: 模长|c|=|a||b|sin    性质3: 满足右手法则 。从这点我们有axb ≠ bxa,而axb = – bxa。所以我们可以使用叉积的正负值来判断向量a,b的相对位置,即向量b是处于向量a的顺时针方向还是逆时针方向
4.配合使用
在Unity中,一般的rpg基本可以满足了,但是在一些特定定制功能中,要求比较苛刻,配合Unity相机视野范围使用。(比如要求,要在视野范围内,而且目标物体不是npc,不能转身,方向是固定的,要判断是否在物体正面还是背面的需求)。
案例:      
 void OnBecameVisible()
        {
            //Debug.LogError(this.name + "摄像机视野内");
            isVisib = true;
        }

        void OnBecameInvisible()
        {
            //Debug.LogError(this.name + "在摄像机视野外");
            isVisib = false;
        }

private void Update()
        {
            if (isVisib)
            {
               
                Vector3 cross = this.transform.InverseTransformPoint(GFGlobal.Instance.FPSPlayerObj.transform.position);
                
                if (cross.x > 0)
                {
                    if (_mediaPlayer)
                    {
                        dist = Vector3.Distance(GFGlobal.Instance.FPSPlayerObj.transform.position, this.transform.position);

                        if(dist <= maxPauseDis)
                        {
                            mPlayerPlay();
                        }else
                        {
                            mPlayerPause();
                        }
                        
                        if (dist <= minDis)
                        {
                            volume = maxvol;
                        }
                        else if (dist > maxDis)
                        {
                            volume = 0f;
                        }
                        else
                        {
                            volume = (dist - b) / p;
                        }
                        _mediaPlayer.Control.SetVolume(volume);
                    }
                }
                else
                {
                    mPlayerPause();
                }
            }

            // 判断物体是否在眼前 和 背后  fangxiang>0在眼前 , <0在背后
            //Vector3 dir =  this.transform.position - fpsPlayer.transform.position;
            //fangxiang = Vector3.Dot(fpsPlayer.transform.forward, dir.normalized);
        }

到了这里,关于Unity坐标系、相互转换和相对自身的方位及角度。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity坐标系的转换—世界坐标转为UI坐标

    直接调用WorldToAnchorPos,传入对应的参数返回UGUI坐标

    2024年04月13日
    浏览(44)
  • UE和Unity坐标系转换

    内容将会持续更新,有错误的地方欢迎指正,谢谢!   UE和Unity坐标系转换       TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取! 助力快速掌握 UE和Unity 坐标系转换 为初学者节省宝贵的学习时间,避免

    2024年01月19日
    浏览(38)
  • 位姿估计 | 目标体坐标系相对于相机坐标系的位姿估计及其Python代码

    本文接着分享空间目标位姿跟踪和滤波算法中用到的一些常用内容,希望为后来者减少一些基础性内容的工作时间。以往分享总结见文章:位姿跟踪 | 相关内容目录和链接总结(不断更新中~~~) 本文介绍如何 利用特征点求解目标体坐标系相对于相机坐标系的位姿 。 PnP(Pe

    2024年02月10日
    浏览(43)
  • 激光雷达坐标系和相机坐标系相互变换(易懂不详细)

    码字不易,路过的朋友动动小手点点赞吧 传感器融合少不了的就是联合标定,最近大火的激光雷达和相机传感器融合算法,让很多工程师学者投入精力学习,本文简单介绍一下激光雷达和相机传感器坐标系转换的原理。         传感器安装位置不同,而且每个传感器都有

    2024年02月11日
    浏览(52)
  • 机器人坐标系转换从局部坐标系转换到世界坐标系

    矩阵方式: 下面是代码: 函数方式: 根据三角函数的特性,可以进行一下简化: 下面是简化前的代码示例:

    2024年04月16日
    浏览(66)
  • RTKLIB——坐标系相互转换(ecef2pos,pos2ecef,ecef2enu,enu2ecef)

    本文代码选自RTKLIB_2.4.2版本,文中所有代码均在rtkcmn.c源文件中,宏定义在头文件中。 宏定义 上述定义分别对应:圆周率PI,WGS84椭球长半轴,WGS84椭球扁率。 工具 函数 dot函数 函数 参数声明: 向量 a ,向量 b ,维数 n 意义: 求向量 a 和向量 b 的点积,将结果存储到 c 中作为

    2024年02月13日
    浏览(63)
  • Matlab 实现图像的直角坐标系和极坐标系的相互转化

    某日需要在matlab进行图像的的极直互化,发现并没有介绍相应内容的文章,所以有了自己调研一下并写一写的想法。果然只要想就能做到,所以有了下面这篇文章。 根据直角坐标系(笛卡尔系)内数值和极坐标系关系 根据上述公式不难想出,在直角坐标系中的圆会在极坐标

    2024年02月11日
    浏览(41)
  • 坐标转换(相机坐标系、世界坐标系、图像物理坐标系、图像像素坐标系)

    一般情况下我们所涉及到的坐标包括四个,即相机坐标系、世界坐标系、图像物理坐标系、图像像素坐标系。我们本文的讲解思路是在讲解每个坐标转换之前先讲清楚每个坐标系所表示的含义。本文主要参考由高翔主编的视觉SLAM十四讲第五章相机模型。 相机将三维世界的坐

    2024年02月09日
    浏览(74)
  • 世界坐标系、相机坐标系和图像坐标系的转换

    之前只是停留在会用的阶段,一直没去读懂计算的原理,今天通读了大佬的文章,写的言简意赅,感谢感谢~~特此记录一下,仅用作个人笔记 贴链接,十分感谢~ https://blog.csdn.net/weixin_44278406/article/details/112986651 https://blog.csdn.net/guyuealian/article/details/104184551 将三维物体转换成照

    2023年04月15日
    浏览(65)
  • 相机坐标系、像素坐标系转换

    相机内参矩阵是相机的重要参数之一,它描述了相机光学系统的内部性质,例如焦距、光学中心和图像畸变等信息。在计算机视觉和图形学中,相机内参矩阵通常用于将图像坐标系中的像素坐标转换为相机坐标系中的三维坐标,或者将相机坐标系中的三维坐标投影到图像坐标

    2024年02月13日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包