| |
КАК ОСУЩЕСТВЛЯЕТСЯ ИЗЛОЖЕНИЕ
МАТЕРИАЛА (на примере
курса "Создание 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
|
 |