Программирование 3D-игр в DirectX на Delphi
 
         
    [Главная] [Новости] [Статьи] [Игры] [Проекты] [Автор]  
         
  Основы 3D-программирования DirectX8.1 в Delphi 6-7: теоретические и практические основы создания игр.  
     
  [Все уроки]  
     
  В упражнениях даются примеры модификаций исходного кода примера и краткое описание того, что при этом наблюдается и как это объясняется. Выполняя упражнения Вы лучше вникнете в суть проблемы.  
     
 

Для начала откомпилируйте пример и запустите приложение. Убедитесь, что всё работает. (Если нет, то читайте файл readme.txt приложенный к архиву, а также замечания!)

нормальная работа примера
 
     
 

Мы наблюдаем вид подводной сцены с бликами на морском дне и поверхности подлодки. Подводная лодка перемещается по круговой орбите. Можно управлять камерой клавишами: [влево], [вправо], [вверх], [вниз], [+]/[-] (на цифровой клавиатуре), [Home]/[End],[Insert]/[PageUp],[Delete]/[PageDown].

 
     
 

Отрисовка статичных объектов сцены производится в методе function CSubmarineD3DApp.Render. Попробуем разобраться где отрисовываются наши объекты.

в коде указанного метода найтиде строчку

RenderFog;

закомментируйте ее, т.е. измените на строку содержащую комментарий - вот так

//RenderFog;

или так

{RenderFog;}

при этом данная строка кода (и соответствующий метод) не компилируются и, следовательно, не исполняются в приложении. Откомпилируйте Ваше приложение.

После компиляции вы получите подсказку о результатах компиляции:

[Hint] Main.pas(192): Private symbol 'RenderFog' declared but never used

 
     
  Понятно, что метод объявлен, но нигде не вызывается, поэтому мы и получили такое сообщение! Однако запустим наше откомпилированное приложение и посмотрим, что в нём изменилось.  
     
  Вы увидите, что туман, имитирующий подводную среду исчез. Теперь Вы знаете, что данный метод (RenderFog) управляет выводом тумана в нашем приложении и можете посмотреть его исходный код, чтобы узнать как это осуществляется.  
     
  Если Вам стала понятна суть наших манипуляций, то Вы нашли способ, каким можно экспериментировать с нашим примером и узнавать много нового и интересного! Если снова раскомментировать строку и перекомпилировать код, то всё возвращается на исходную позицию.  
     
  Попробуем еще?  
     
  Если Вы закомментируете строчку RenderScene;в том же методе (function CSubmarineD3DApp.Render), то увидите, что всё кроме подлодки и бликов на ней исчезнет! Значит реализация отрисовки объектов сцены находится ... Правильно! В методе RenderScene.  
     
 

Экспериментируя с временным отключением отдельных частей кода (путем их комментирования), Вы узнаете, где и что в данном методе отрисовывается.

Конечно, чтобы детально разобраться во всех подробностях Вам обязательно понадобится чтение документации по DirectX8.1 (DX SDK). Я же здесь пока не даю подробных описаний, поскольку они выходят за рамки данной публикации. Поэтому имейте в виду! Чтобы детально изучить создание DirectX-приложений Вам неминуемо потребуется изучение первоисточника, т.е. DirectX SDK на английском языке!

 
     
  Там же, т.е. в методе (function CSubmarineD3DApp.Render), отключим строку RenderCaustic; - исчезло всё!  
     
  Т.к. в данном приложении все вершины проходят через вершинный шейдер используемый как раз в этом методе, то мы и наблюдаем полное исчезновение всего - т.е. полное отсутствие каких-либо отрисовываемых вершин.  
     
  Теперь Вы знаете, где искать вывод бликов.  
     
  Все анимации осуществляются внутри метода function CSubmarineD3DApp.FrameMove  
     
  Поэкспериментируйте с кодом этого метода и установите: что и где отрисовывается. Т.е. как осуществляется движение подлодки и каким образом анимировано движение бликов.  
     
  В папке media из архива данного примера Вы найдете модели, текстуры и код шейдеров.  
     
 

Еще об некоторых интересных вещах: наверное Вы обнаружили в коде метода function CSubmarineD3DApp.RenderScene, когда исследовали его, строчки, помеченные таким комментарием:

//** m_pWaterPlane.Render(m_pd3dDevice);

попробуйте раскомментировать и откомпилировать (звездочки ** естественно тоже нужно убрать! иначе получите синтаксическую ошибку компиляции).

если раскомментировать данную строку и откомпилировать приложение, то при подъеме на некоторую высоту (клавишей [-] на цифровой клавиатуре) исчезает вид морского дна.

На самом деле это выводится плоскость имитирующая поверхность морской воды (т.е. разделение сред вода/воздух). Но, поскольку объемный туман не используется, никакого разделения не происходит. Поверхность "затуманивается".

Если теперь попробовать закомментировать строку RenderFog; в методе CSubmarineD3DApp.Render, то вы увидите вид поверхности воды.

 
     
  Но подлодка при этом как бы плавает в воздухе. Как это исправить?  
     
 

Если Вы были усидчивы и разбирались с содержимым метода CSubmarineD3DApp.FrameMove, то наверное нашли строки, в которых происходит перемещение подлодки в трехмерном пространстве:

// Animate file object - анимировать файл-объект
D3DXMatrixScaling(m_matSubmarine, 0.2, 0.2, 0.2);
// отмасштабировать модель в 0.2 раза (т.е. уменьшить на 20%)
D3DXMatrixTranslation(mat, 2.0, 1.0, 0.0);
// переместить (сместить) модель на указанное расстояние от центра координат
D3DXMatrixMultiply(m_matSubmarine, m_matSubmarine, mat);
// перемножить полученные матрицы (масштабирования и смещения)
D3DXMatrixRotationY(mat, 0.3 * m_fTime);
// осуществлять вращение по оси Y. Поскольку m_fTime - значение таймера текущего времени DirectX-приложения, то здесь он и используется для задания текущего угла и следовательно, угловой скорости (умножение на коэффициент 0.3)
D3DXMatrixMultiply(m_matSubmarine, m_matSubmarine, mat);
// снова перемножаем полученные матрицы, запоминая результат в матрице модели субмарины m_matSubmarine

 
     
 

Если Вы еще не догадались что Вам следует теперь сделать, то вот Вам подсказка:

найдите строчку

D3DXMatrixTranslation(mat, 2.0, 1.0, 0.0);

и измените смещение по оси Y на -0.1, т.е.

D3DXMatrixTranslation(mat, 2.0, -0.1, 0.0);

и подлодка уходит в воду аж по самую ватерлинию! (не забудьте откомпилировать, чтобы изменения кода вступили в силу :))))

 
     
  Теперь о шейдерах.  
     
  [Назад] [Все уроки]  
     
    [Главная] [Новости] [Статьи] [Игры]    
         
(c) Мега Информатик 2006-2007    
Hosted by uCoz