本文整理汇总了C#中ICamera.GetProjectionMatrix方法的典型用法代码示例。如果您正苦于以下问题:C# ICamera.GetProjectionMatrix方法的具体用法?C# ICamera.GetProjectionMatrix怎么用?C# ICamera.GetProjectionMatrix使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ICamera
的用法示例。
在下文中一共展示了ICamera.GetProjectionMatrix方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: ProjectToCoordinate
internal static bool ProjectToCoordinate(ICamera camera, ref Vector3 position, out Vector2 coordinate, ref Vector2 targetSize)
{
Vector4 worldPositionW = new Vector4(position, 1.0f);
Matrix mat;
camera.GetViewMatrix(out mat);
Vector4.Transform(ref worldPositionW, ref mat, out worldPositionW);
camera.GetProjectionMatrix(out mat, ref targetSize);
Vector4.Transform(ref worldPositionW, ref mat, out worldPositionW);
if (worldPositionW.W != 0)
worldPositionW.W = 1.0f / worldPositionW.W;
coordinate = new Vector2(worldPositionW.X * worldPositionW.W, worldPositionW.Y * worldPositionW.W);
return worldPositionW.Z > 0;
}
示例2: ProjectFromCoordinate
//also used by Camera2D
internal static void ProjectFromCoordinate(ICamera camera, bool is2D, ref Vector2 screenPosition, float projectDepth, out Vector3 position, ref Vector2 targetSize)
{
Vector4 coordinate = new Vector4(0, 0, 0.5f, 1);
if (targetSize.X != 0)
coordinate.X = ((screenPosition.X / targetSize.X) - 0.5f) * 2;
if (targetSize.Y != 0)
coordinate.Y = ((screenPosition.Y / targetSize.Y) - 0.5f) * 2;
//this is much slower for 3D Cameras than 2D, due to matrix inversion requirements.
Matrix mat;
if (is2D)
{
//projection is always identity, so only need the inverse of the view matrix...
//which is the camera matrix
camera.GetCameraMatrix(out mat);
}
else
{
//more complex.
Matrix pm;
camera.GetProjectionMatrix(out pm, ref targetSize);
camera.GetViewMatrix(out mat);
// OUCH
Matrix.Multiply(ref mat, ref pm, out mat);
Matrix.Invert(ref mat, out mat);
}
Vector4.Transform(ref coordinate, ref mat, out coordinate);
if (coordinate.W != 0)
{
coordinate.W = 1.0f / coordinate.W;
coordinate.X *= coordinate.W;
coordinate.Y *= coordinate.W;
coordinate.Z *= coordinate.W;
coordinate.W = 1;
}
//this could probably be done better...
Vector3 cameraPos;
camera.GetCameraPosition(out cameraPos);
Vector3 difference = new Vector3();
difference.X = coordinate.X - cameraPos.X;
difference.Y = coordinate.Y - cameraPos.Y;
difference.Z = coordinate.Z - cameraPos.Z;
if (difference.X != 0 || difference.Y != 0 || difference.Y != 0)
difference.Normalize();
difference.X *= projectDepth;
difference.Y *= projectDepth;
difference.Z *= projectDepth;
position = new Vector3();
position.X = difference.X + cameraPos.X;
position.Y = difference.Y + cameraPos.Y;
position.Z = difference.Z + cameraPos.Z;
}
示例3: ProjectFromCoordinate
internal static void ProjectFromCoordinate(ICamera camera, bool is2D, ref Vector2 screenPosition, float projectDepth, out Vector3 position, ref Vector2 targetSize)
{
Vector4 coordinate = new Vector4(0, 0, 0.5f, 1);
if (targetSize.X != 0)
coordinate.X = ((screenPosition.X / targetSize.X) - 0.5f) * 2;
if (targetSize.Y != 0)
coordinate.Y = ((screenPosition.Y / targetSize.Y) - 0.5f) * 2;
Matrix mat;
if (is2D)
{
camera.GetCameraMatrix(out mat);
}
else
{
Matrix pm;
camera.GetProjectionMatrix(out pm, ref targetSize);
camera.GetViewMatrix(out mat);
Matrix.Multiply(ref mat, ref pm, out mat);
Matrix.Invert(ref mat, out mat);
}
Vector4.Transform(ref coordinate, ref mat, out coordinate);
if (coordinate.W != 0)
{
coordinate.W = 1.0f / coordinate.W;
coordinate.X *= coordinate.W;
coordinate.Y *= coordinate.W;
coordinate.Z *= coordinate.W;
coordinate.W = 1;
}
Vector3 cameraPos;
camera.GetCameraPosition(out cameraPos);
Vector3 difference = new Vector3();
difference.X = coordinate.X - cameraPos.X;
difference.Y = coordinate.Y - cameraPos.Y;
difference.Z = coordinate.Z - cameraPos.Z;
if (difference.X != 0 || difference.Y != 0 || difference.Y != 0)
difference.Normalize();
difference.X *= projectDepth;
difference.Y *= projectDepth;
difference.Z *= projectDepth;
position = new Vector3();
position.X = difference.X + cameraPos.X;
position.Y = difference.Y + cameraPos.Y;
position.Z = difference.Z + cameraPos.Z;
}