FairyGUI.DisplayObject.WorldToLocal C# (CSharp) Method

WorldToLocal() public method

转换世界坐标点到等效的本地xy平面的点。等效的意思是他们在屏幕方向看到的位置一样。 返回的点是在对象的本地坐标空间,且z=0
public WorldToLocal ( Vector3 worldPoint, Vector3 direction ) : Vector3
worldPoint UnityEngine.Vector3
direction UnityEngine.Vector3
return UnityEngine.Vector3
        public Vector3 WorldToLocal(Vector3 worldPoint, Vector3 direction)
        {
            Vector3 localPoint = this.cachedTransform.InverseTransformPoint(worldPoint);
            if (localPoint.z != 0) //如果对象绕x轴或y轴旋转过,或者对象是在透视相机,那么z值可能不为0,
            {
                //将世界坐标的摄影机方向在本地空间上投射,求出与xy平面的交点
                direction = this.cachedTransform.InverseTransformDirection(direction);
                float distOnLine = Vector3.Dot(Vector3.zero - localPoint, Vector3.forward) / Vector3.Dot(direction, Vector3.forward);
                if (float.IsInfinity(distOnLine))
                    return new Vector2(0, 0);

                localPoint = localPoint + direction * distOnLine;
            }
            else if (_transformMatrix != null)
            {
                Matrix4x4 mm = (Matrix4x4)_transformMatrix;
                Vector3 camPos = new Vector3(_pivot.x * _contentRect.width, -_pivot.y * _contentRect.height, _focalLength);
                Vector3 center = new Vector3(camPos.x, camPos.y, 0);
                center -= mm.MultiplyPoint(center);
                mm = mm.inverse;
                //相机位置需要变换!
                camPos = mm.MultiplyPoint(camPos);
                //消除轴心影响
                localPoint -= center;
                localPoint = mm.MultiplyPoint(localPoint);
                //获得与平面交点
                Vector3 vec = localPoint - camPos;
                float lambda = -camPos.z / vec.z;
                localPoint.x = camPos.x + lambda * vec.x;
                localPoint.y = camPos.y + lambda * vec.y;
                localPoint.z = 0;

                //在这写可能不大合适,但要转回世界坐标,才能保证孩子的点击检测正确进行
                HitTestContext.worldPoint = this.cachedTransform.TransformPoint(localPoint);
            }
            localPoint.y = -localPoint.y;

            return localPoint;
        }

Usage Example

 static public int WorldToLocal(IntPtr l)
 {
     try {
         FairyGUI.DisplayObject self = (FairyGUI.DisplayObject)checkSelf(l);
         UnityEngine.Vector3    a1;
         checkType(l, 2, out a1);
         UnityEngine.Vector3 a2;
         checkType(l, 3, out a2);
         var ret = self.WorldToLocal(a1, a2);
         pushValue(l, true);
         pushValue(l, ret);
         return(2);
     }
     catch (Exception e) {
         return(error(l, e));
     }
 }