Навигация
· XNA FAQ
· С чего начать
· Конкурсы
· Обратная связь
· XNA Блоги
Сейчас на сайте
· Гостей: 1

· Пользователей: 0

· Всего пользователей: 3,684
· Новый пользователь: headron
Последние фото
Эх, чуть не проспал закрытие.
Эх, чуть не проспал ...
Альбом: XNA Engine

GB
GB
Альбом: XNA Engine

South Park Coon & Friends
South Park Coon & Fr...
Альбом: XNA Games

Блоги
yavshoke
» XboxOne - интерес...
dampirik
» Push уведомления ...
dampirik
» Реклама,статистик...
Chort
» XNA и StartCoroutine
Chort
» Curve Class
dampirik
» Реклама, статисти...
dampirik
» Увеличение скорос...
dampirik
» Реклама, статисти...
general
» Распаковка DxtCom...
general
» Как работать с XN...
Поддержка
microsoft.com
1gb.ru - Дом для вашего сайта
Статистика посещений:

SimpleBoundingPryzm, рефлектор и все, все, все…
Вот здесь почти началась гражданская война в комментариях, но речь сейчас пойдет не об этом, а о том, что я обещал в одном из первых комментариев до начала распрей показать как на основе BoundingFrustum, который вообще говоря используя при camera culling обычно, т.е. при определении того, что попадает в обзор камеры и что мы собственно рендерить будем, так вот при помощи этого класса и пары крепких выражений мы попытаемся описать простую шестигранную призму. Задается BoundingFrustum обычно произведением матриц вида и проекции (и его полезно хостить как свойство в самописном классе камеры как раз для вышеописанных целей) и именно поэтому в чистом виде для наших целей малопригоден.

Так вот сильно сомневаясь в практической ценности того, что будет написано ниже – думаю штука получилась довольно медленная, я тем не менее уверен, что сие творение поможет новичкам еще не знакомыми с зерцалом дядюшки Лютца. Для продолжения и слежения за моей мыслью настоятельно рекомендую сходить и закачать вот это.

Краткий экскурс. Все кто хочет осваивать XNA должны знать, что, скорее всего (но необязательно) им придется писать на C#, являющимся управляемым (managed) языком (не единственным, но предпочтительным для работы с XNA). Это понятие включает много чего и с этим вы можете ознакомиться при необходимости чуть погуглив (например, здесьдовольно внятно), но кроме всего прочего, любая библиотека или исполнимый файл (далее сборка) скомпилированный для работы с XNA (в том числе) содержит самоописательную информацию или по-другому метаданные. Т.е. сборка несет в себе много информации о себе самой – из метаданных можно узнать о классах и их членах этой сборки, а так же о тех классах на которые сборка ссылается. Например, метаданные метода содержат полное описание метода, включая класс (сборку его содержащую), тип возвращаемый методом и всех его параметров. Такое обилие информации не должно пропадать! Я надеюсь, вы с этим тоже согласны. Так вот с помощью метаданных, анализа IL в который компилируется наш код и неугомонных ручек вполне возможно восстановить исходный код сборки. Для этого есть несколько готовых программ (ildasm даже входит в комплект .NET Framework SDK), но мы скачали (я надеюсь, вы последовали моей рекомендации) признанного лидера .NET Reflector от Lutz Roeder.

Итак, устанавливаем и запускаем, в итоге видим, что-то вроде:
articles: BoundingPryzm01.png

Это оно, то, что послужит вам верой и правдой, если вы и дальше будете что-то писать под .NET. Итак, нам нужно добраться до библиотек XNA, щелкаем меню File->Open… и ищем библиотечку под названием Microsoft.Xna.Framework.dll , я ее нашел у себя по пути C:\Program Files (x86)\Microsoft XNA\XNA Game Studio\v3.0\References\Windows\x86\Microsoft.Xna.Framework.dll чего и вам желаю. Потом нас заинтересует вот эта кнопка:
articles: BoundingPryzm02.png

В появившемся справа дополнении окна мы запишем BoundingFrustum примерно так:
articles: BoundingPryzm03.png

Потом уверенно щелкаем пару раз на названии в списке и оказываемся на соответствующем классе в дереве, раскроем его:
articles: BoundingPryzm04.png

Обращаю внимание, здесь хорошо видно какой класс и какие интерфейсы наследует наш пациент (сразу запишем в карточку, что его тянет меряться с себе подобными IEquatable<BoundingFrustum>). Теперь вызовем у класса контекстное меню:

articles: BoundingPryzm05.png

Здесь нас интересует пункт Disassemble. Из-за всех наших экспериментов рефлектор должен принять примерно такой вид:
articles: BoundingPryzm06.png

Прокрутив вниз скроллер окна Disassembler вы увидите гиперссылку Expand methods. Вот собственно и все волшебство -  перед вами текст класса.
Небольшое лирическое отступление: в процессе работы над проектами довольно часто задаешься вопросом “Почему?!!!”, почему .NET или библиотечка от сторонних производителей ведет себя  так, а не иначе и здесь рефлектор просто вне конкуренции. Порой копания в нутрах фреймворка заставляют задуматься об индийско-китайском заговоре в рядах майкрософта. Не подумайте что я программнацист, среди коллег из азии есть очень достойные профессионалы, просто поневоле вспоминается анекдот как индийский программист проверял булеву переменную на истинность:
public void SomeMethod(bool isPragMahaghama)
{
	if (isPragMahaghama.ToString().Length == 4)
        {
        	// что то делаем …
        }
}

 

Теперь по образу и подобию нам понадобится класс Gjk, методы SupportMapping из BoundingBox и BoundingSphere – потому как очень многое в библиотеках Microsoft  sealed и internal. Выкидываем инициализацию по матрице, а тупо прописываем 8 угловых точек (единственно нужно проследить чтобы они шли в нужном порядке – это нужно для того чтобы Plane переменные корректно обрабатывали нахождение объекта по “ту” и по “сю” сторону от себя). Методы можно сделать похожими на эти:
	private Vector3 BoxSupportMapping(BoundingBox box, Vector3 closestPoint)
    {
        Vector3 result = new Vector3();
        result.X = (closestPoint.X >= 0f) ? box.Max.X : box.Min.X;
        result.Y = (closestPoint.Y >= 0f) ? box.Max.Y : box.Min.Y;
        result.Z = (closestPoint.Z >= 0f) ? box.Max.Z : box.Min.Z;
        return result;
    }
 
    private Vector3 SphereSupportMapping(BoundingSphere sphere, Vector3 v)
    {
        Vector3 result = new Vector3();
        float num2 = v.Length();
        float num = sphere.Radius / num2;
        result.X = sphere.Center.X + (v.X * num);
        result.Y = sphere.Center.Y + (v.Y * num);
        result.Z = sphere.Center.Z + (v.Z * num);
        return result;
    }

 

Для инициализации получившегося класса мы будем использовать 8 точек:

articles: BoundingPryzm07.png

Именно в такой последовательности (ааа… 7  и 8 поменяйте местами). Так вот, из них мы получаем 6 плоскостей, которые затем используются в хвост и в гриву для определения пересечений.

Теперь выкидываем матричный конструктор и добавляем свой:
    public SimplePryzm(Vector3[] corners)
    {
        this.planes = new Plane[6];
        this.cornerArray = new Vector3[8];
        if (corners.Length != 8)
            throw new Exception("Дайте углов!");
        corners.CopyTo(cornerArray,0);
        SetPlanes();
    }

 

Здесь самый важный момент это метод SetPlanes, на скорую руку (не взыщите) и с учетом рисунка предыдущего выглядит он так:

    private void SetPlanes()
    {
        planes[NearPlaneIndex] = new Plane(cornerArray[0], cornerArray[1],cornerArray[2]);
        planes[BottomPlaneIndex] = new Plane(cornerArray[5], cornerArray[1], cornerArray[2]);
        planes[TopPlaneIndex] = new Plane(cornerArray[4], cornerArray[0], cornerArray[3]);
        planes[RightPlaneIndex] = new Plane(cornerArray[7], cornerArray[2], cornerArray[3]);
        planes[LeftPlaneIndex] = new Plane(cornerArray[0], cornerArray[1], cornerArray[5]);
        planes[FarPlaneIndex] = new Plane(cornerArray[4], cornerArray[5], cornerArray[7]);
    }

 

Что в сухом остатке, кто не знал – теперь знает, что такое Reflector и чем его следует закусывать, у нас есть обещанный мной в запале BoundingFrustum с произвольной инициализацией. Если у кого созреет хороший алгоритм “обжимки” мешей такой конструкцией feel free to use.
P.S.: В файле кода я указал, но на всякий случай еще раз скажу здесь – если вы хотите использовать этот класс по серьезному советую проверить инициализацию плоскостей. С лучами и другими плоскостями все будет работать нормально, но видимо где-то я напутал с точками и при проверках пересечения с объемами могут быть глюки (не с той стороны плоскости определяется фигура).

Комментарии
#1 | SolarWind 05.07.2009 22:39:43
Сразу мое ИМХО, если кому охота подискутировать на тему "статья отстой, аффтар убей сибя ап стену, куда смотрит администрация", моя точка зрения, с Word думаю знакомы многие, никто не мешает написать контрстатью на тему...
До тех пор пока у меня не будет столько статей для публикации, что я не буду знать за какую схватиться первой, я буду выкладывать, то что есть.
Итак, поехали...

P.S. 2Rext доверься Word`у он знает как пишется куча слов и с запятыми зачастую в тему попадает Smile) Зачет, спасибо.
#2 | Chort 06.07.2009 10:43:26
Вот интересно... если построить BoundingFrustum по ортогональной матрице, то у нас же теоретически получится OBB B)...

P.S. Собственно весь код, если интересно
GeSHi: C#
  1. public static BoundingFrustum BoxToFrustum(BoundingBox box)
  2. {
  3. Matrix proj = Matrix.CreateOrthographicOffCenter(box.Min.X, box.Max.X,
  4. box.Min.Y, box.Max.Y, box.Min.Z, box.Max.Z);
  5.  
  6. return new BoundingFrustum(proj);
  7. }
Добавлено за 0.005 секунд, используя GeSHi 1.0.8.2
#3 | general 06.07.2009 12:19:40
статья зачет! особенно можно обратить внимание на не стандартность мышления автора, видеть в стандартных инструментах новые возможности. хорошая способность, помогает экспериментировать не изобретая велосипед.

P.S. в статье нет подписи автора.
#4 | alexG 06.07.2009 12:22:32
Ну зачем же пинать Rext'а - он тут не при чем, за запятые я учту Smile
В комментах к его статье - я обещал распотрошить рефлектором Frustum, на что он потребовал пример, вот это собственно и оно.

to Chort : ну насколько я понял пресловутого Rext'а требовалось все таки немного не то, то что ты предлагаешь- матрица ортогональной проекции. Опять же параллельно осям все будет. Человек вроде бы другого хотел...
#5 | SolarWind 06.07.2009 12:27:47
2alexG - звиняюсь, просто я в админке на момент подтверждения файла не вижу от кого он пришел, вот и решил, что от него

P.S. подписываться надо Smile
#6 | Chort 06.07.2009 12:29:43
2alexG
есть пропертя BoundingFrustum.Matrix. Умножь ее на нужную тебе матрицу трансформации и будет тебе OBB.
Пример :
GeSHi: C#
  1. bf.Matrix *= Matrix.CreateRotationY(MathHelper.PiOver2);
Добавлено за 0.004 секунд, используя GeSHi 1.0.8.2
#7 | alexG 06.07.2009 12:30:20
то SolarWind : теперь буду знать. Wink
#8 | alexG 06.07.2009 12:37:05
2 Chort: ооо, там у Matrix сеттер есть открытый - виноват Grin но лишь отчасти...
это в сути вопроса ничего не меняет, вопрос был как бы так получше обжать мэш. На практичность мое решение не претендует (ибо после недолгих раздумий и пары загубленных листов бумаги какого то достойного пути получения такой шестигранной призмы для сетки я не нашел - и в статье об этом сказано) - просто Box действительно иногда не самое лучшее геометрическое решение. Может кому и призма глянется и кто то будет удачливее меня в изысканиях. Smile
#9 | Chort 06.07.2009 12:45:15
2alexG да я собственно то ни к чему не придираюсь Cool. Просто статья натолкнула на идею такого нестандартного использования стандартных вещей, вот и решил поделится ею здесь, в комментариях
#10 | general 06.07.2009 13:18:09
такие обсуждения мне больше по душе
Добавить комментарий
Пожалуйста, залогиньтесь для добавления комментария.
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Отлично! Отлично! 50% [1 Голос]
Очень хорошо Очень хорошо 50% [1 Голос]
Хорошо Хорошо 0% [Нет голосов]
Удовлетворительно Удовлетворительно 0% [Нет голосов]
Плохо Плохо 0% [Нет голосов]
Авторизация
Логин

Пароль



Вы не зарегистрированы?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Мини-чат
Вы должны авторизироваться, чтобы добавить сообщение.

27.08.2014
Я умею немного на asp.net + html и css

22.08.2014
на ASP mvc 3 есть пару проектов. Могу помочь, если нужно. Обидно, если закроется Frown

21.08.2014
я тоже ноль

21.08.2014
Я в вебе только с php занимался да и то на уровне чтоб работало.

21.08.2014
Я в вебе полный ноль…

21.08.2014
Переводить его надо, хоть на ту же азуру. И двиг менять на что-то современное. Если есть веб-разрабы - можем скооперироваться. Один делать не буду.

21.08.2014
не знаю всех нюансов по оплате и все хорошее когда нибудь заканчивается

21.08.2014
А что случилось?

21.08.2014
похоже сайт будет работать до 28го числа

09.08.2014
Апи пока не видел. Но есть приложение в магазине Live Lock Screen BETA, так что думаю скоро будет

08.08.2014
Я про API для Update1. На нем работает это

08.08.2014
А что именно нужно? Чтото и сейчас открыто http://msdn.micro.
...105).aspx

06.08.2014
Кто-нибудь слышал об открытии доступа к Lock Screen Api?

31.07.2014
VPDExpress на базе MVS 2012, ни в какую не ловит исключения. Даже если их сам создаешь. И всех так?

25.07.2014
С днем системного администратора причастных к этой профессии! По случаю - тортик от жены

RSS каналы сайта
XNA - Новости
XNA - Статьи
XNA - Форум
XNA - Галерея
XNA - Файлы
Время загрузки: 0,11 секунд 8,709,609 уникальных посетителей