阅读 211

Unity3D之坐标系的转换

Unity3D之坐标系的转换

一, Unity中的常用坐标系

1⃣️,世界坐标系 (左手定则)

        this.transform.Position

2⃣️,本地坐标系(左手定则)

        this.transform.LocalPosition

3⃣️,屏幕坐标系

            1,左下角为原点(0,0)

            2,右上角为 (Screen.Width,Screen.Hight

            3,Z的位置是以相机的世界单位来衡量//及物体离相机远近

         4,和屏幕分辨率有关

         5,鼠标位置坐标属于屏幕坐标,Input.mousePosition可以获得鼠标坐标,当用Input.MousePosition获取鼠标位置的时候,他的Z轴值一直为0

                    public Vector3 MyScreenToWorld( Vector3 mousePos, Transform targetTransform ){

                                Vector3 dir = targetTransform.position - Camera.main.transform.position;

                                //计算投影

                                Vector3 normalDir = Vector3.Project( dir, Camera.main.transform.forward );

                                //物体离相机远近 (normalDir.magnitude

                                Vector3 worldPos = Camera.main.ScreenToWorldPoint( new Vector3(  mousePos.x , mousePos.y, normalDir.magnitude) );

                                return worldPos;

                    }

         6,手指触摸屏也为屏幕坐标,Input.GetTouch(0).position可以获得单个手指的手机屏幕坐标

4⃣️,视口坐标系

            1,左下角为原点(0,0)

            2,右上角为(1,1)

二,坐标系转换

        1⃣️,世界坐标和本地坐标转换

                1,本地转世界 : this.transform.TransformPoint(0,0,0);

                2,世界转本地: this.transform.InverseTransformPoint(0,0,0);

        2⃣️,世界坐标和屏幕坐标转换

                1, 世界转屏幕:Camera.main.WorldToScreenPoint( vector3 );

                2,   屏幕转世界:Camera.main.ScreenToWorldPoint(vector3);

        3⃣️,世界坐标和视口坐标转换

                1,世界转视口:Camera.main.WorldToViewportPoint(0,0,0);               

                2,  视口转世界:Camera.main.ViewportToWorldPoint(0,0,0);

        4⃣️,屏幕坐标和视口坐标转换

                1,屏幕转视口:Camera.main.ScreenToViewportPoint(0,0,0);

                2,  视口转屏幕:Camera.main.ViewportToScreenPoint(0,0,0);


  if (Input.GetMouseButtonDown(0))

        {

            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);   // 从鼠标位置发送射线

            RaycastHit hit;

            if (Physics.Raycast(ray, out hit, 100, 1 << LayerMask.NameToLayer("Plane")))

            {

                Debug.Log(hit.collider.name);

            }

        }



   if (Input.GetMouseButtonDown(0))

        {

            Ray ray = Camera.main.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0));    // 从屏幕中央发送射线

            RaycastHit hit;

            if (Physics.Raycast(ray, out hit, 100, 1 << LayerMask.NameToLayer("Plane")))

            {

                Debug.Log(hit.collider.name);

            }

        }


©著作权归作者所有:来自51CTO博客作者Aonaufly的原创作品,如需转载,请注明出处,否则将追究法律责任


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐