Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2011, 13:35   #1
Sargonass
Пользователь
 
Аватар для Sargonass
 
Регистрация: 21.09.2011
Сообщений: 35
По умолчанию Отсечение объектов в C#

Доброго времени суток.
Возникла такая проблема: на форму ставятся трехмерные объекты 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;
                }
            }            
        }
Sargonass вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отсечение многоугольников Kovy Фриланс 7 26.02.2011 12:36
Двумерное отсечение and Работа с адаптерами Покусанный Фриланс 3 22.12.2010 09:49
Отрезок. Отсечение stscolt Помощь студентам 0 11.11.2009 00:29
Отсечение нужного кода -HunteR- Помощь студентам 6 25.06.2008 16:16