|
DWD-009 |
|
Меню Сайта |
 |
|
 |
|
 |
__________________
|
 |
|
 |
|
 |
|
 |
|
 |
|
 |
____________________
|
 |
|
 |
|
 |
|
 |
_______________
|
 |
|
 |
|
 |
|
 |
|
 |
_______________________
|
 |
|
 |
|
 |
|
 |
|
 |
|
 |
|
 |
|
 |
|
 |
|
 |
|
 |
|
 |
|
 |
___________________
|
 |
|
 |
_________________
|
 |
|
 |
|
 |
|
 |
|
 |
|
|
 |
ToP Sites
http://mo3del.ru/
http://mir3d.3dn.ru/
http://sw-in.narod.ru/
|
Аниация и кправление камерой---
Pассмотрим такой интересный пример, как управление камерой в играх от третьего лица. Для этого примера понадобится стандартная модель из комплекта поставки (Blitz3D) робот (robotic.3ds) и набор текстур для нее.

Цель программы - привязать камеру к модели робота, чтоб всегда видеть его спину. Управление движением модели будем производить с помощью клавиатуры.
Камеру и модель опишем в виде пользовательских типов следующим образом
В пользовательском типе Player: entity - родительский объект для модели, model - загружаемая с диска сама модель робота.
В пользовательском типе SmartCam: entity - родительский объект для модели робота , camera - дескриптор камеры, target, heading - объекты, связанный с моделью робота, определяющие взаимоувязку его и камеры.
Загрузка всех необходимых медиа-ресурсов произведем в следующей функции:
Function LoadGameObjects()
level=LoadMesh( "mapstur.b3d" )
ScaleEntity level,.15,.15,.15
EntityType level,TYPE_WALL
player_model = LoadAnimMesh( "ROBOTrobotic.3DS" )
ScaleEntity player_model,.2,.2,.2
LoadAnimSeq player_model, ("ROBOTrunning.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
pentity=CreatePivot()
pmodel=CopyEntity( player_model,pentity )
pplayer_y=y
PositionEntity pentity,x,y,z
EntityType pentity,TYPE_PLAYER
EntityRadius pentity,2
Return p
End Function
Function CreateSmartCam.SmartCam( entity )
c.SmartCam=New SmartCam
centity=entity
ccamera=CreateCamera()
ctarget=CreatePivot( entity )
PositionEntity ctarget,0,5,-10
EntityType ctarget,TYPE_TARGET
cheading=CreatePivot( entity )
PositionEntity cheading,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 pentity,0,5,0
Else If KeyDown(205)
TurnEntity pentity,0,-5,0
EndIf
If KeyDown(30) ;движение вперед кл. А
If panim_speed<=0
panim_speed=1.75
Animate pmodel, 1, 1.5, 1, 10
EndIf
MoveEntity pentity,0,0,1
Else If KeyDown(44) ;движение назад кл. Z
If panim_speed>=0
panim_speed=-1.75
Animate pmodel, 1, 1.5, 1, 10
EndIf
MoveEntity pentity,0,0,-1
Else If panim_speed ;остановка анимации
panim_speed=0
Animate pmodel, 2, 1, 0, 10
EndIf
ty#=EntityY(pentity)
y_vel#=(ty-pplayer_y)
pplayer_y=ty
y_vel=y_vel -.5
TranslateEntity pentity,0,y_vel,0
End Function
;================================
Function UpdateSmartCam( c.SmartCam )
If KeyDown(200)
TranslateEntity cheading,0,-3,0
Else If KeyDown(208)
TranslateEntity cheading,0,+3,0
EndIf
dx#=EntityX(ctarget,True)-EntityX(ccamera,True)
dy#=EntityY(ctarget,True)-EntityY(ccamera,True)
dz#=EntityZ(ctarget,True)-EntityZ(ccamera,True)
TranslateEntity ccamera,dx*ssp,dy*ssp,dz*ssp
PointEntity ccamera,cheading
PositionEntity ctarget,0,0,0
ResetEntity ctarget
PositionEntity ctarget,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).
уже 16013 посетителей!
|
|