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);

            }

        }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章