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