/// <summary> /// 世界空间到观察空间变换对比 /// 这里是透视相机,没有做正交相机的 /// </summary> void TestWorldSpaceToViewSpace() { //注意这里是透视相机,没有做正交相机变换矩阵 cam = Camera.main; //世界空间坐标到观察空间坐标 Vector3 viewPos = TransformationMatrixUtil.WToVPosition(trans1.position); //结果是z轴相反,因为世界空间是左手坐标系,而观察空间是右手坐标系 Debug.LogFormat("世界空间:{0},观察空间:{1}", trans1.position, viewPos); //世界空间到观察空间 Matrix4x4 matrix = TransformationMatrixUtil.WToVMatrix(); Debug.LogFormat("matrix:\n{0}\n\n worldToCameraMatrix:\n{1}\n\n是否相等:{2}", matrix, cam.worldToCameraMatrix, matrix == cam.worldToCameraMatrix); }
/// <summary> /// 测试模型空间到屏幕空间的变换 /// 只验证 屏幕坐标xy,不验证zw /// 注意这里是透视相机,没有做正交相机变换矩阵 /// </summary> void TestModelSpaceToScreenSpace() { Transform _parent = trans1.parent; //模型空间转世界空间 Vector3 worldPos = TransformationMatrixUtil.MToWPosition(_parent.localScale, _parent.localEulerAngles, _parent.localPosition, trans1.localPosition); //世界空间转观察空间 Vector3 viewPos = TransformationMatrixUtil.WToVPosition(worldPos); //观察空间转透视裁剪空间 Vector4 clipPos = TransformationMatrixUtil.VToPPosition(viewPos); //裁剪空间到屏幕空间变换 Vector4 screenPos = TransformationMatrixUtil.PToScreenPosition(clipPos); Vector4 screenPos1 = cam.WorldToScreenPoint(trans1.position); //Vector4 viewportPos = cam.WorldToViewportPoint(trans1.position); Debug.LogFormat(" worldPos:{0},trans1.positon:{1}\n viewPos:{2}\n clipPos:{3}\n screenPos:{4},screenPos1:{5}", worldPos, trans1.position, viewPos, clipPos, screenPos, screenPos1); }