Суббота, 18.05.2024, 15:28
Меню Сайта
Категории раздела
Наш опрос
Нравится ли вам новы дизайн
Всего ответов: 193
Мини-чат
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Каталог статей

Главная » Статьи » Прохoждения » Прохождения [ Добавить статью ]

3D Engine на практике у гейммейкера
3D Engine на практике у гейммейкера

Вступление

Предположим, что Вы учились в школе, знакомы с формулой окружности, тригонометрией, черчением, математикой в целом. Трехмерные игры могут Вам представляться очень сложными для понимания. Как же их делают? Действительно, мало легкого. В черчении используются интересные названия для описания проекций. Мы поговорим об аксонометрических проекциях. Эти проекции начинающим инженерам 7-ых классов средних школ иногда как заноза в пальце. Проекции не сразу понятны. Проходит время, и уже черчение становится простым и неинтересным предметом, если не считать, что не все родились художниками и не все знают ГОСТов. Черчение нам очень поможет, а математика будет всем управлять в процессе беседы.

Средство для работы.

Соперники и еще раз соперники...

Есть уже много средств (SDK) для работы с ускорителями, а без них наш движок никому не интересен давно. На сегодняшний день есть три основных средства. Бесспорно, что существуют и другие, но эти распространены лучше всех:

1.Microsoft DirectX SDK;
2.Microsoft OpenGl SDK;
3.3DFX Glide SDK.

Безусловно, что OpenGl очень хорошее средство для разработки, но почему-то движки все чаще делают на Direct3D Immediate Mode. Все известные игры под OpenGl относятся к одной крупной конторе ID Software. Возьмем, для оправдания, игры ACCLAIM Entertainment и посмотрим, как люди мастерски все делают при помощи Direct3D Immediate Mode и 3DFX Glide. Красиво, приятно смотреть на TUROK1, TUROK2, Shadow Man. А возьмите Need For Speed 4 от EA хотя бы - это же все тот же Direct3D Immediate Mode. По объективным причинам есть основания полагать, что OpenGl не совсем уже и идеален. А если сравнивать его с возможностями того же Glide, то вряд ли можно оставить свой выбор только на OpenGl. Странно, но Direct3D Immediate Mode на практике очень оказался неплох. Очень прост, несмотря на то, что при помощи него трудно и нудно организовывать доступ к видео-драйверу, если учитывать все существующие версии Microsoft DirectX. Игра Turok2: The seeds of evil от ACCLAIM Entertainment вообще не соглашается работать на системе, где не установлен DirectX 6.1. На это у них есть целый ряд причин, о которых лучше не начинать рассказывать, потому что разговор затянется на недели. Прослойка HAL - неординарный момент. С ней можно вытворять такие вещи, которые в OpenGl еще не скоро будут реализованы. Приятно осознавать, что все достаточно приятно и разрешимо. Достаточно своеобразный подход Microsoft к разработке Direct3D заставил обратить на себя внимание программистов-гейммейкеров. Очень долго уже над ним и с ним работают программисты, но бывают такие люди, которые занимаются разработкой OpenGl. Не будем тыкать пальцами, но игры от Id Software тоже смотрятся неплохо. Ужас, какие только ни попадались забавные ошибки... Очень трудно говорить о возможностях OpenGl, Glide, если с ним не работал. Есть масса интересных вещей в них, но боюсь, что многие, кто разобрался с Microsoft DirectX, слабо будут интересоваться ими. Ведь Microsoft DirectX - это комплекс всего того, что нужно Вашей игре. Кстати, нет ничего плохого, что OpenGl использует DirectInput и DirectSound. Своих средств у OpenGl нет. Просто программисту будет трудней обычного реализовать 3D звук, если вершины объектов описываются в OpenGl, а точки (вершины), откуда звук идет, описываются в DirectSound. Правда, и здесь есть огромное количество неплохих альтернативных вариантов. Не будем спорить, что лучше, а что хуже, потому что время все само расставит на свои места. Кроме того, OpenGl зарекомендовал себя как серьезное средство, где лучше говорить не об играх, а о программах для конструкторов самых разнообразных областей.

Теперь перейдем непосредственно к проблеме, которую нужно нам решить. От выбранного средства нам требуется совсем не многое знать. Вам необходимо знать, как рисуется треугольник на координатной сетке экрана. Вершины треугольника должны носить не только координатные характеристики (X и Y), но и характеристики U и V, которые будут указывать на координаты нанесения текстур на Ваш треугольник. Этим можно не ограничиваться. Можно попробовать за вершины зацепить освещение, которое может изменяться. Проще говоря, нам нужен Gouraud Shading и Specular Light, если он возможен в данном средстве. Теперь, когда треугольник рисуется, мы можем его применить в нашей работе, но только возникает вопрос: "Где взять трехмерную модель для того, чтобы можно было ее изобразить на экране?"

3D Studio MAX для моделирования.

За и против

3D Studio MAX - подходящая вещь для моделирования Ваших трехмерных героев. Может, и не совсем лучшая, но мы будем ею пользоваться в связи с тем, что вряд ли у Вас есть под рукой Maya, trueSpace, SoftImage. Нарисуем в нем куб и нанесем на него UVW Map. Потом зайдем в окно Materials, укажем на свободном месте (где написано Diffuse) новый материал, который будет называться Bitmap. Если Вы все правильно сделали, то перед вами покажется меню настроек Coordinates, где можно указать UV, нужный вам для куба. Учтите, что текстуры нужно использовать следующих размеров: 256x256, 128x128, 64x64, 32x32, 16x16. Другие для Direct3D не подойдут, хотя вряд ли текстуры других размеров можно наносить в OpenGl и Glide. Давайте вернемся к нашему кубу. Экспортируйте его в старый знакомый формат 3DS или в текстовый формат X. Если у Вас есть соответствующие Plugin'ы, то попробуйте использовать их.

Конечный файл должен быть именно текстовый X, потому что он содержит все необходимое нам. Если Вы не имеете plugin'а, то Вам нужно экспортировать модель в 3DS, а затем, имея под руками программу конвертации 3DS в X, которая есть в Microsoft DirectX SDK и называется conv3ds.exe, проделайте преобразование. Если мы это сделали, то можем заняться уже X файлом. В текстовом формате X можно обнаружить теперь примерно следующие строки:
xof 0302txt 0064
Header {1;0;1;}
Mesh Box01 {
8; // Vertices Count
-30.881754;-28.540426;62.713676;,
...
-30.881744;31.363005;190.249878;;
12; // Face Count
3;0;1;2;,
...
3;4;7;1;;
MeshTextureCoord {
4; // UV Count
0.999501;0.000500;,
...
0.000500;0.000500;;
12; // Face Count
3;0;1;2;,
...
3;1;2;3;;
}
}

Конечно, координаты там будут Ваши, а там, где стоят "...", пропущены строки с координатами за ненадобностью в их описании в статье. Возьмите, к примеру, строчку, где написано '8; // Vertices Count'. Понятно, что таких строчек не две должно быть, а восемь, и все эти точки описывают не что иное, как вершины куба. Вершины куба у нас уже есть. Теперь нам нужно зацепить за них треугольники. Проще говоря, индексы в массиве точек будут соответствовать трем вершинам треугольника. Вы видите, что в кубе 6 граней, но треугольников (faces) должно быть 12, т.к. одна грань куба состоит из двух треугольников. Не верите? Можете посчитать. Обратите внимание на строчку '3;0;1;2;,'. Первое число говорит о том, сколько же должно быть вершин у фигур. У нас используется треугольник, как рабочая единица, и поэтому любая строчка будет начинаться с тройки. Далее идет 3 указателя на наши вершины. Вершин у нас всего 8, а значит, диапазон находится между 0 и 7 (включительно 0 и 7). Кстати, этой информации уже достаточно, чтобы рисовать объекты без текстур. Однако, без текстур ни одна из игр не может претендовать на бестселлер. Итак, текстуры наносятся по схожему принципу. Посмотрите на строчку, где написано '4; // UV Count'. Вершин, которые характеризуют координаты UV, всего 4, но исходя из выводов, что вершин 8, - что-то не сходится. И что же? Для примера, не зря был взят куб. Куб содержит все 6 граней, на которые при правильном "коробочном" наложении текстуры (Box UVMap) можно получить частный случай, когда 6 граней могут описываться одной, т.е. только 4 вершины и нужно. Когда вы видите второй раз в тексте надпись, говорящую о количестве треугольников, - это не что иное, как описание наложении UV-вершин. Конечно же, треугольников должно быть столько же, сколько их было и в первый раз, но только они теперь должны все лежать в диапазоне от 0 до 3 и указывать на UV-вершины, а не на координатные вершины. Вот Вам и текстура на модель.

Итак, подведем итоги. У нас должны быть данные о том, сколько координатных вершин, треугольников, UV-вершин, и сами данные с указателями на индексы и координаты.

О самом главном

Что ж, давайте попробуем теперь вывести эту модель на экран. Для начала не будем лезть в дебри и возьмем аксонометрию.

Опишем сначала то, что очень похоже на изометрию:

Xэкран==(X+Y);
Yэкран=(X/2)-(Y/2)-Z, где X, Y, Z - координаты одной из многочисленных вершин.

Конечно, преобразование должно произойти для каждой вершины. Полученный результат от преобразования очень неплохо смотрится, но объект мы можем увидеть только с одной стороны. Пусть будет не секрет, что уже такой движок используется в Age of Empires, т.е. все происходит на основе подобных вычислений.

Что мы должны добавить, чтобы объект начал вращаться? Не все так трудно:

Xвременный=(X*Cos(angle))+(Y*Sin(angle));
Yвременный=(Y*Cos(angle))-(X*Sin(angle));
Xэкран==(Xвременный+Y);
Yэкран=(Xвременный/2)-(Yвременный/2)-Z, где X, Y, Z - координаты одной из многочисленных вершин, angle - угол поворота на горизонтальной плоскости. Теперь Вы поймете, что объект вращается только влево и вправо. Не трудно теперь будет перестроить преобразование, если нужно будет вращать все вверх и вниз, но Вам и этого пока достаточно знать про аксонометрию.

Давайте посмотрим на то, как же устроена перспективная проекция.

Xэкран=Xцентр+X+(X*Z)/(Zoff);
Yэкран=Yцентр+Y+(Y*Z)/(Zoff), где X, Y, Z - координаты одной из многочисленных вершин, Xцентр, Yцентр - выравнивание на центр экрана (например, при разрешении 640x480 - Xцентр=320, а Yцентр=240). Zoff - такой делитель указывает дальность точки горизонта. Чем больше число, тем больше перспективная проекция похожа на аксонометрическую.

Теперь повторим то, что сделали с аксонометрией:

Xвременный=(X*Cos(angle))+(Y*Sin(angle));
Yвременный=(Y*Cos(angle))-(X*Sin(angle));
Xэкран=Xцентр+Xвременный+(Xвременный*Z)/(Zoff);
Yэкран=Yцентр+Yвременный+(Yвременный*Z)/(Zoff), где X, Y, Z - координаты одной из многочисленных вершин, Xцентр, Yцентр - выравнивание на центр экрана (например, при разрешении 640x480 - Xцентр=320, а Yцентр=240). Zoff - такой делитель указывает дальность точки горизонта. Здесь будет происходить то же самое, что и в предыдущем случае.

На этом дело не кончается. Для всех face'ов еще необходимо сделать сортировку Z-sorting. Используя пузырьковый метод, можно аккуратно переместить все треугольники, которые изображаются не целиком, на первые места. Т.е. они будут изображаться первыми, а последние треугольники будут их частично закрывать.

В играх, как Вы догадываетесь, все намного сложнее, но принцип остается принципом.

Если хотите узнать много интересного про то, как же делают трехмерные игры, почитайте англоязычные издания:

1. Bargen, Bradley and Peter Donnelly, "Inside DirectX", Microsoft Press, 1998;
2. Foley, James D., "Computer Graphics: Principles and Practice", Addison-Wesley, 1991 (2nd edition);
3. Hearn, Donald and M. Pauline Baker, "Computer Graphics", Prentice-Hall, 1986.
4. Blinn, James, "Jim Blinn's Corner: A Trip Down the Graphics Pipeline", Morgan Kaufmann, 1996;
5. Watt, Alan H., and Mark Watt, "Advanced Animation and Rendering Techniques", Addison-Wesley, 1992;
6. Petzold, Charles, "Programming Windows 95", Microsoft Press, 1996 (4th edition);
7. Thompson, Nigel, "3D Graphics Programming for Windows 95", Microsoft Press, 1996;
8. Begault, Durand R., "3D Sound for Virtual Reality and Multimedia", Academic Press, 1994;

К сожалению, книги на русском языке на эту тему большая редкость, но не исключено, что Вам может повезти и Вы наткнетесь на хороший перевод. Кстати, если Вы не найдете ничего интересного в Internet на эту тему, то это еще раз докажет, что Internet все еще не серьезная игра.

Гость для того чтобы скачать "3D Engine на практике у гейммейкера", Вам нужно кликнуть по 1 из рекламных ссылок.
Категория: Прохождения | Добавил: SergBrNord (28.12.2007) | Автор: Сергей E
Просмотров: 855 | Комментарии: 1 | Рейтинг: 0.0/0
Всего комментариев: 1
1 Hvyudf  
0
lipitor brand <a href="https://lipiws.top/">atorvastatin 20mg tablet</a> buy atorvastatin pills

Имя *:
Email *:
Код *: