Доброго времени суток.
Возникла такая проблема: на форму ставятся трехмерные объекты Mesh. Хочу сделать так чтобы когда объект за пределами видимости экрана то он не отрисовывался. Нашел примерный код, но почему то он не действует. Помогите пожалуйста.
Вот код просчитывания плоскостей.
Код:
public Matrix Matrix1, matView, matProj;
float ZMin, Q;
public bool Construct(float ZDistance, Matrix matProj, Matrix matView)
{
Planes1 = new Plane[6];
if (device == null)
{
return false;
}
// Calculate new projection matrix based on distance provided
ZMin = -matProj.M43 / matProj.M33;
Q = ZDistance / (ZDistance - ZMin);
matProj.M33 = Q;
matProj.M43 = -Q * ZMin;
Matrix.Multiply(Matrix1, matView);
Matrix.Multiply(Matrix1, matProj);
Planes1[0].A = Matrix1.M14 + Matrix1.M13;
Planes1[0].B = Matrix1.M24 + Matrix1.M23;
Planes1[0].C = Matrix1.M34 + Matrix1.M33;
Planes1[0].D = Matrix1.M44 + Matrix1.M43;
Plane.Normalize(Planes1[0]);
Planes1[1].A = Matrix1.M14 - Matrix1.M13; // Far
Planes1[1].B = Matrix1.M24 - Matrix1.M23;
Planes1[1].C = Matrix1.M34 - Matrix1.M33;
Planes1[1].D = Matrix1.M44 - Matrix1.M43;
Plane.Normalize(Planes1[1]);
Planes1[2].A = Matrix1.M14 + Matrix1.M11; // Left
Planes1[2].B = Matrix1.M24 + Matrix1.M21;
Planes1[2].C = Matrix1.M34 + Matrix1.M31;
Planes1[2].D = Matrix1.M44 + Matrix1.M41;
Plane.Normalize(Planes1[2]);
Planes1[3].A = Matrix1.M14 - Matrix1.M11; // Right
Planes1[3].B = Matrix1.M24 - Matrix1.M21;
Planes1[3].C = Matrix1.M34 - Matrix1.M31;
Planes1[3].D = Matrix1.M44 - Matrix1.M41;
Plane.Normalize(Planes1[3]);
Planes1[4].A = Matrix1.M14 - Matrix1.M12; // Top
Planes1[4].B = Matrix1.M24 - Matrix1.M22;
Planes1[4].C = Matrix1.M34 - Matrix1.M32;
Planes1[4].D = Matrix1.M44 - Matrix1.M42;
Plane.Normalize(Planes1[4]);
Planes1[5].A = Matrix1.M14 + Matrix1.M12; // Bottom
Planes1[5].B = Matrix1.M24 + Matrix1.M22;
Planes1[5].C = Matrix1.M34 + Matrix1.M32;
Planes1[5].D = Matrix1.M44 + Matrix1.M42;
Plane.Normalize(Planes1[5]);
return true;
}
bool CheckSphere(float XCenter, float YCenter, float ZCenter, float Radius)
{
short i;
// Make sure radius is in frustum
for (i = 0; i < 6; i++)
{
if (Plane.DotNormal(Planes1[i], new Vector3(XCenter, YCenter, ZCenter)) < -Radius/2)
return false;
}
return true;
}
Вот код отрисовки объекта и проверки его на нахождение в поле видимости.
Код:
public void DrawObjects(float ObjectPosX, float ObjectPosY, float ObjectPosZ)
{
device.Transform.World = Matrix.RotationX((float)Math.PI / 2); // Изначально ось Z направлена от вас, а X и Y, соответственно,
// по горизонтали и вертикали экрана. Исправим это досадное упущение.
for (int i = 0; i < 50; i++)
{
if (CheckSphere(ObjectPosX, ObjectPosY, ObjectPosZ, 10.0f) == true)
{
TexturedMeshService.Draw(MeshObject[0], ObjectPosX, ObjectPosY, ObjectPosZ);
x = x + 1;
}
}
}