Анимация объектов.
Почти в любой игре вы встречали анимацию, например, бег героев, врагов, вращение винта вертолёта и др. И в Blitz3D существуют специальные команды, которые позволяют воспроизводить анимацию 3D объектов. Анимационные объекты имеют "кадры" или определённые фиксированные координаты отдельных частей объекта в разные моменты времени. Теперь поговорим об анимации объектов различных форматов. У объектов форматов 3DS и X анимируют компоненты, состоящие из примитивов, но не анимируют по вершинам и треугольникам. Но формат MD2 позволяет анимировать по отдельным вершинам и треугольникам, поэтому его используют для анимации персонажей и животных. Загрузка анимационного объекта в формате 3DS и X (при успешной загрузке, переменной возвращается адрес на объект):
перем=LoadAnimMesh("файл",[родитель] )
Воспроизвести анимацию для форматов 3DS и X. Допустимые значения для параметра режим: 1 - однократная анимация, 2 - зацикленная анимация, 3 - воспроизведение вперёд-назад, 0 - анимации нет. Скорость - параметр скорости анимации. Кадр - значение начального кадра. Задержка - пауза перед анимацией:
Animate перем,[режим],[скорость#],[кадр],[задержка#]
Функция, возвращающая время анимации объекта:
Функция, возвращающая время анимации объекта:
AnimTime#(перем)
Проверка на воспроизведение анимации. Функция возвращает 1, если объект анимирует и 0, если нет:
Animating(перем)
Загрузка анимационного объекта в формате MD2. Загружается такой же командой, как и неанимационный объект:
перем=LoadMD2("файл",[родитель] )
Воспроизвести анимацию MD2. Допустимые значения для параметра режим: 1 - однократная анимация, 2 - зацикленная анимация, 3 - воспроизведение впрёд-назад, 0 - анимации нет. Скорость - параметр скорости анимации. Начанльный кадр - значение начального кадра. Конечный кадр - значение конечного кадра. Задержка - пауза перед анимацией:
Animate перем,[режим],[скорость#],[начальный_кадр],[конечный_кадр],[задержка#]
Функция, возвращающая время анимации MD2 объекта:
MD2AnimTime#(перем)
Проверка на воспроизведение анимации MD2 объекта. Функция возвращает 1, если объект анимирует и 0, если нет:
MD2Animating(перем)
Чтобы воспроизводилась анимация объектов, должна присутствовать в цикле команда UpdateWorld (значение параметра скорость по-умолчанию равно 1):
UpdateWorld [скорость#]
Столкновение объектов.
Созданные объекты при движении не будут взаимодействовать друг с другом, так как не установлены для них столкновения. Объекты будут проходить насквозь друг друга, поэтому чтобы избежать таких ситуаций, используют столкновения.
Установка режима столкновений. Используется команда Collisions, которая имеет множество параметров. Первый параметр - тип объекта (целое значение от 1 до 999), который будет сталкиваться. Второй параметр - тип объектов (целое значение от 1 до 999), об которые будут сталкиваться. Третий параметр - метод столкновения: 1 - сфера к сфере, 2 - сфера к многограннику, 3 - сфера к кубу. Четвёртый параметр - реакция сталкиваемого объекта: 1 - объект останавливается при столкновении, 2 - объект скользит при столкновении, 3 - объект скользит с трением. Общий вид команды:
Collisions тип1,тип2,метод,реакция
Чтобы объекты могли сталкиваться, нужно им применить тип (значение от 1 до 999):
EntityType перем,значение
Чтобы работала анимация, в цикле используют (та же команда для анимации объектов):
UpdateWorld
Примеры.
1 метод: метод с остановкой. Создаётся шар и конус. Тип шара - 1, а конуса - 2. В команде Collisions устанавливается первый параметр равен1, т.е. сталкивается объект с типом 1 - это шар. Второй параметр равен 2 - тип конуса, об который будет сталкиваться шар. Третий параемтр равен 2 (сфера об многогранник), лучше использовать такой метод, потому что конус - это многогранник. Последний параметр равен 1, значит, шар при столкновении остановится.
Graphics3D 640,480 ;3D графический режим
cam=CreateCamera() ;создаёт камеру
sphe=CreateSphere() ;создаёт шарик
PositionEntity sphe,4,0,8 ;позиция шарика
EntityType sphe,1 ;тип шарика
cone=CreateCone() ;создаёт конус
PositionEntity cone,-3,0,8 ;позиция конуса
EntityType cone,2 ;тип конуса
Collisions 1,2,2,1 ;устанавливает столкновения
While Not KeyHit(1)
MoveEntity sphe,-0.05,0,0
UpdateWorld ;обновляет анимацию и столкновения объектов
RenderWorld ;прорисовывает мир
Flip ;отбражает графический буфер
Wend ;конец цикла
End ;выход
2 метод: метод со скольжением. Пример ничем не отличается от первого, только последний параметр команды Collisions равен 2.
Graphics3D 640,480 ;3D графический режим
cam=CreateCamera() ;создаёт камеру
sphe=CreateSphere() ;создаёт шарик
PositionEntity sphe,4,0,8 ;позиция шарика
EntityType sphe,1 ;тип шарика
cone=CreateCone() ;создаёт конус
PositionEntity cone,-3,0,8 ;позиция конуса
EntityType cone,2 ;тип конуса
Collisions 1,2,2,2 ;устанавливает столкновения
While Not KeyHit(1)
MoveEntity sphe,-0.05,0,0
UpdateWorld ;обновляет анимацию и столкновения объектов
RenderWorld ;прорисовывает мир
Flip ;отбражает графический буфер
Wend ;конец цикла
End ;выход
3 метод: метод со скольжением и трением. Последний параметр команды Collisions равен 3.
Graphics3D 640,480 ;3D графический режим
cam=CreateCamera() ;создаёт камеру
sphe=CreateSphere() ;создаёт шарик
PositionEntity sphe,4,0,8 ;позиция шарика
EntityType sphe,1 ;тип шарика
cone=CreateCone() ;создаёт конус
PositionEntity cone,-3,0,8 ;позиция конуса
EntityType cone,2 ;тип конуса
Collisions 1,2,2,3 ;устанавливает столкновения
While Not KeyHit(1)
MoveEntity sphe,-0.05,0,0
UpdateWorld ;обновляет анимацию и столкновения объектов
RenderWorld ;прорисовывает мир
Flip ;отбражает графический буфер
Wend ;конец цикла
End ;выход
Дополнительные команды:
Отменить все столкновения:
ClearCollisions
Сбросить столкновение для определённого объекта:
ResetEntity(перем)
Установить радиус столкновения для объекта (вещественное значение) с методом столкновения сфера к сфере. Если значение меньше 1, то объект будет частично проходить другой, больше - не доходить до его поверхности.:
EntityRadius перем,знач#
Установить границу столкновения для объекта с методом столкновения сфера к кубу: x,y,z - координаты относительно объекта, а ширина, длина, высота - размер границы:
EntityBox перем,x#,y#,z#,ширина#,высота#,длина#
Функция, проверяющая произошло ли столкновение. Возвращает 1, если объекты столкнулись и 0, если нет. переменная - сталкиваемый объект, а тип - тип всех объектов, с которыми сталкивается объект:
EntityCollided(перем,тип)
Функция, возваращающая тип объекта:
GetEntityType(перем)
Функция, возваращающая количество произошедших столкновений в мире:
CountCollisions(перем)
Пример на проверку столкновений. Если первый куб столкнулся со вторым, то выходит сообщение:
Graphics3D 800,600
SetBuffer BackBuffer()
cam=CreateCamera()
cub1=CreateCube()
PositionEntity cub1,-4,0,8
EntityType cub1,125
cub2=CreateCube()
PositionEntity cub2,4,0,8
EntityType cub2,347
Collisions 347,125,1,1
Repeat
MoveEntity cub2,-0.1,0,0
UpdateWorld
RenderWorld
Flip
Until EntityCollided(cub2,125)
RuntimeError "Кубики столкнулись"
End
источник главы:blitz3d.hutz2.ru