Меню:
Главная страница Перечень курсов обучающего центра BlitzSchool Вход для слушателей Галерея О нас  
Голосование:
Результаты Оплата курсов каким способом была бы Вам наиболее удобна?
Ваш вариант WebMoney
Яндекс.Деньги
RBK-Money
Терминалы оплаты
VISA или Mastercard
Через Сбербанк
Почтовым переводом


Вы готовы предложить свой вариант?
Новости игр:


Тоже новости
Electronic Arts официально анонсировала новую игру о приключениях девочки Алисы из повестей Льюиса Кэролла, над которой работает студия Spicy Horse Games, возглавляемая Американом Макги. Экшен/адвенчура, ранее известная лишь под рабочим названием, получила имя Alice:...

Читать дальше

Бесплатный сыр EverQuest 2
Electronic Arts анонсировала третье дополнение к The Sims 3, получившее подзаголовок Late Night (российский вариант — «В сумерках»).

В поисках ночных приключений симы отправятся на клубные вечеринки и концерты,...

Читать дальше

Тоже новости


Битва файтингов


Sackboy для коллекционеров
   
 

КАК ОСУЩЕСТВЛЯЕТСЯ ИЗЛОЖЕНИЕ МАТЕРИАЛА (на примере курса "Создание 3D игр"):

Материал уроков излагается на конкретных действующих примерах. Код приводится по частям и рассматривается очень подробно. Полный код вместе с медиа-ресурсами (графика, звуки, модели и т.д.) прилагается после рассмотрения отдельных фрагментов.

В качестве демонстрации изложения фрагмента одного из уроков
, рассмотрим такой интересный пример, как управление камерой в играх от третьего лица. Для этого примера понадобится стандартная модель из комплекта поставки (
Blitz3D) робот (robotic.3ds) и набор текстур для нее.



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

В пользовательском типе Player: entity - родительский объект для модели, model - загружаемая с диска сама модель робота.
В пользовательском типе
SmartCam: entity - родительский объект для модели робота , camera - дескриптор камеры, target, heading - объекты, связанный с моделью робота, определяющие взаимоувязку его и камеры.

Загрузка всех необходимых медиа-ресурсов произведем в следующей функции:

Function LoadGameObjects()

  level=
LoadMesh( "maps\tur.b3d" )

 
ScaleEntity level,.15,.15,.15
 
EntityType level,TYPE_WALL


  player_model =
LoadAnimMesh( "ROBOT\robotic.3DS" )
 
ScaleEntity player_model,.2,.2,.2
 
LoadAnimSeq player_model, ("ROBOT\running.3DS" )
 
TurnEntity player_model,0,-180,0
 
HideEntity player_model

End Function

В качестве уровня используется объект  в формате .b3d, сделанный в редакторе CartographyShop 4.1  (ссылки на инструменты, которые мы будем использовать в курсе и другие полезные программы, смотрите тут: Полезные ссылки)
После загрузки уровня (для упрощения он представляет собой - пол, стенку и наклонные поверхности для демонстрации гравитации) он проходит масштабирование (функция
ScaleEntity) и ему присваивается тип -
TYPE_WALL (функция EntityType) для контроля столкновений с ним модели робота.
Далее происходит загрузка модели (
LoadAnimMesh) и анимационной последовательности его движения (LoadAnimSeq )

Создание самих объектов робота и камеры приведем ниже:

Function CreatePlayer.Player( x#,y#,z# )
  p.Player=
New Player
  p\entity=
CreatePivot()
  p\model=
CopyEntity( player_model,p\entity )
  p\player_y=y
 
PositionEntity p\entity,x,y,z
 
EntityType p\entity,TYPE_PLAYER
 
EntityRadius p\entity,2
 
Return p
End Function

Function
CreateSmartCam.SmartCam( entity )
  c.SmartCam=
New SmartCam
  c\entity=entity
  c\camera=
CreateCamera()

  c\target=
CreatePivot( entity )
  PositionEntity c\target,0,5,-10
  EntityType c\target,TYPE_TARGET

  c\heading=
CreatePivot( entity )
  PositionEntity c\heading,0,0,20
  Return c
End Function

При создании объекта робота (CreatePlayer.Player( x#,y#,z# )) - вначале создается пустой объект при помощи команды New. После чего инициализируем переменные объекта: entity и model.
Позиционирование в пространстве осуществляется функцией
PositionEntity. Функция EntityRadius задает радиус шара, который используется для столкновения модели с поверхностями уровня. Чем меньше радиус, тем ближе к стене может приблизиться модель.

При создании объекта камеры (
CreateSmartCam.SmartCam( entity )) - используется стандартная функция CreateCamera() Поля target и heading инициализируются как пустые объекты (pivot) и позиционируются в пространстве для установки благоприятного "видения" камерой модели.

Изменение состояние камеры и модели робота в процессе перемещения описываются следующим образом:

;================================
Function
UpdatePlayer( p.Player )

If KeyDown(203) ;поворот налево/направо
 
TurnEntity p\entity,0,5,0
Else If KeyDown(205)
 
TurnEntity p\entity,0,-5,0
EndIf

If KeyDown(30) ;движение вперед кл. А
 
If p\anim_speed<=0
    p\anim_speed=1.75
   
Animate p\model, 1, 1.5, 1, 10
 
EndIf
 
MoveEntity p\entity,0,0,1
Else If KeyDown(44) ;движение назад кл. Z
 
If p\anim_speed>=0
    p\anim_speed=-1.75
   
Animate p\model, 1, 1.5, 1, 10
 
EndIf
 
MoveEntity p\entity,0,0,-1
Else If p\anim_speed ;остановка анимации
  p\anim_speed=0
 
Animate p\model, 2, 1, 0, 10
EndIf

ty#=
EntityY(p\entity)
y_vel#=(ty-p\player_y)
p\player_y=ty

y_vel=y_vel -.5
TranslateEntity p\entity,0,y_vel,0
End Function

;================================
Function UpdateSmartCam( c.SmartCam )

If KeyDown(200)
 
TranslateEntity c\heading,0,-3,0
Else If KeyDown(208)
 
TranslateEntity c\heading,0,+3,0
EndIf

dx#=
EntityX(c\target,True)-EntityX(c\camera,True)
dy#=
EntityY(c\target,True)-EntityY(c\camera,True)
dz#=
EntityZ(c\target,True)-EntityZ(c\camera,True)

TranslateEntity c\camera,dx*ssp,dy*ssp,dz*ssp

PointEntity c\camera,c\heading

PositionEntity c\target,0,0,0
ResetEntity c\target
PositionEntity c\target,0,20,-15

End Function

В функции UpdayePlayer осуществляется реакция программы на нажатия клавиш A/Z - движение модели робота вперед/назад и стрелок вправо/влево. Изменение режимов анимации осуществляется при помощи команды Animate.  Всего этих режимов два - для перемещения робота и при отсутствии движения. Второй аргумент команды Animate как раз отвечает за смену последовательностей анимации. Движение модели робота вперед/назад осуществляется при помощи команды MoveEntity. Переменная y_vel отвечает за гравитацию. То есть, по сути, модель стремится к движению по оси Y, чему мешает пол уровня (коллизии учитываются автоматически при задании соответствующих зависисмостей ). Как только робот покидает пол, гравитация скидывает его в пропасть.

Почему модель не проваливается сквозь пол? За этот процесс отвечает контроль столкновений или коллизий описанный ниже:

Const TYPE_PLAYER=1, TYPE_TARGET=2, TYPE_WALL=3

Collisions TYPE_PLAYER,TYPE_WALL,2,2
Collisions TYPE_TARGET,TYPE_WALL,2,2

Команда Collisions устанавливает зависимости между разными объектами при их столкновении. Так зависимости установлены между объектами - "камера-уровень" и "робот-уровень".

Что касается функции
UpdateSmartCam, то она занимается синхронизацией и ориентированием камеры относительно модели робота. Клавиши вперед/назад - меняют угол наклона камеры.
переменная
ssp - отвечает за скорость (плавность) приближения камеры к модели робота. Команда
PointEntity  просто дает указание камере "смотреть" на модель.
Экран примера выглядит примерно так:


Полный текст примера находится здесь:  (
smartcam.bb) , архив программы с моделями и текстурами можно взять тут:
(smartcam.zip).


Уроки сопровождаются тестом и домашним заданием, которые не обязательны, но желательны для выполнения.
Все вопросы, касательно уроков, неясных моментов, а также предложения, комментарии и организационные вопросы просьба отсылать по электронному адресу
learning@blitz-school.info

 

 
 
Copyright© 2005-2010. Blitz-School