Blitz3D Архив
Главная | Каталог статей | Регистрация | Вход
Вторник
12.12.2017
03:46
Приветствую Вас Гость | RSS
Главная » Статьи » Программирование

Tokamak DLL
Что означают все TOK*** команды:
Для начала все команды делятся на основные разделы:
TOKSIM - команды симулятора tokamak. Эти команды в основном устанавливают глобальные переменные симулятора.
TOKRB - команды для жестких тел. Это вещи, которые нас окружают. Для их использования можно использовать только 3 примитива - box, cylinder, и sphere, но вы можете объединять их с помощью операций конъюнкций и делать более сложные объекты, такие как стул или стол.
TOKAB - эти команды для движущихся тел. На них не действует физика, а двигать и вращать их должна ваша программа. Эти объекты создаются так же, как и жесткие тела - из примитивов. Используйте объекты этого типа для создания движущихся платформ, дверей, ловушек и т.п.
TOKGEOM - эти команды предназначены для модификации параметров предыдущих двух групп.
TOKJOINT - эти команды используются для создания шарниров, к которым присоединяются жесткие тела. Используйте их для создания тряпичных кукол, ловушек, оборудования и т.п.

Как написать программу использующую tokamak?
Первое что вы должны сделать это установить симулятор подобно этому:

TOKSIM_CreateSimulator(0,-10,0)

Здесь мы включаем tokamak и устанавливаем вектор гравитации. В этом случае гравитация направлена вниз и равна 10. По умолчанию tokamak немного ограничен в количестве объектов и, думаю, полезно будет узнать несколько команд для настройки ограничений:
TOKSIM_SetRigidBodiesCount - максимальное количество жестких тел. По умолчанию 50. Далее в квадратных скобках.
TOKSIM_SetAnimatedBodiesCount - максимальное количество движущихся тел.[50]
TOKSIM_SetRigidParticleCount - количество жестких частиц.[50]
TOKSIM_SetControllersCount - количество контроллеров.[50]
TOKSIM_SetOverlappedPairsCount - Количество возможных перекрытых пар. По умолчанию 1225. Это будет максимум при количестве объектов равным 100. Если вы используете другое количество объектов воспользуйтесь формулой (TBodies*(TBodies-1))/2 где TBodies - количество объектов. Вы конечно можете установить меньшее значение для экономии памяти.
TOKSIM_SetGeometriesCount - количество, использующееся в жестких и подвижных объектах.[50]
TOKSIM_SetConstraintsCount - количество ограничений в симуляции.[100]
TOKSIM_SetConstraintSetsCount - Номер ограничения, устанавливается в в симуляции. Если вы неопытный пользователь, то просто пропустите это.
TOKSIM_SetConstraintBufferSize - размер буфера решающего устройства ограничения (понимайте как хотите я не понял).[2000]
TOKSIM_SetStaticMeshNodesStartCount - количество узлов хранящих треугольники местности.
TOKSIM_SetStaticMeshNodesGrowByCount - Вообщем не понял я что это, если кто знает скажите. Устал уже переводить :(....

Вот что мы пока имеем:

Const Rigid_Bodies=100,Animated_Bodies=5,Rigid_Particles=0

TOKSIM_SetRigidBodiesCount Rigid_Bodies
TOKSIM_SetAnimatedBodiesCount Animated_Bodies
TOKSIM_SetRigidParticleCount Rigid_Particles
TOKSIM_SetControllersCount 0
TOKSIM_SetGeometriesCount Rigid_bodies+Animated_Bodies ;Assuming each one only has one geometry. Not true with more complex rigid bodies and animated bodies.

TOKSIM_CreateSimulator(0,-10,0)

Мы установили здесь подходящие настройки. Здесь мы создаем сцену:

Graphics3D 800,600,0,2
Const fps=60
Global cam = CreateCamera()
PositionEntity cam,0,10,-50
l=CreateLight()
centerpoint=CreatePivot()

ground = CreateCube()
EntityColor ground,5,5,55
ScaleEntity ground,50,5,50
PositionEntity ground,0,-5,0

Так - теперь мы установим подвижное тело для земли. (Хотя в действительности мы ее двигать не будем)

abground = TOKAB_Create()
TOKAB_AddBox(abground,100.0,10.0,100.0)
TOKAB_SetPosition(abground,0.0,-5.0,0.0)

TOKAB_Create() - Создает подвижное тело и возвращает указатель на него.
TOKAB_AddBox(AnimatedBody,Width,Height,Depth) - описывает параллелограмм вокруг созданного тела.
TOKAB_SetPosition(AnimatedBody, X, Y, Z) - устанавливает позицию тела.

Вот код создания остальных стен:

wall1 = CreateCube()
EntityColor wall1,25,25,55
ScaleEntity wall1,2,10,50
PositionEntity wall1,50,0,0
abwall1 = TOKAB_Create()
TOKAB_AddBox(abwall1,4.0,20.0,100.0)
TOKAB_SetPosition(abwall1,50.0,0,0.0)

wall2 = CreateCube()
EntityColor wall2,25,25,55
ScaleEntity wall2,2,10,50
PositionEntity wall2,-50,0,0
abwall2 = TOKAB_Create()
TOKAB_AddBox(abwall2,4.0,20.0,100.0)
TOKAB_SetPosition(abwall2,-50.0,0,0.0)

wall3 = CreateCube()
EntityColor wall3,25,25,55
ScaleEntity wall3,50,10,2
PositionEntity wall3,0,0,-50
abwall3 = TOKAB_Create()
TOKAB_AddBox(abwall3,100.0,20.0,4.0)
TOKAB_SetPosition(abwall3,0.0,0,-50.0)

wall4 = CreateCube()
EntityColor wall4,25,25,55
ScaleEntity wall4,50,10,2
PositionEntity wall4,0,0,50
abwall4 = TOKAB_Create()
TOKAB_AddBox(abwall4,100.0,20.0,4.0)
TOKAB_SetPosition(abwall4,0.0,0,50.0)

Сейчас мы создадим жесткие тела:

Dim obj(Rigid_Bodies)
Dim rb(Rigid_Bodies)

i=1

obj(i) = CreateCube()
ScaleEntity obj(i),2,1,1
rb(i) = TOKRB_Create()
TOKRB_AddBox rb(i),4.0,2.0,2.0
TOKRB_SetPosition rb(i),0,10,0
TOKRB_SetLinearDamping rb(i),0.001
TOKRB_SetAngularDamping rb(i),0.02
TOKRB_SetMass rb(i),2.0
TOKRB_SetBoxInertiaTensor rb(i),4.0,2.0,2.0,2.0

В массиве мы сохраняем указатели на объекты созданные с помощью команды TOKRB_Create(). Команда TOKRB_AddBox добавляет коробку к объекту. Обратите внимание, что описываем для описания мы используем цифры большие чем в ScaleEntity - это связано с тем, что блитц создает куб размером не 1x1x1, а размером 2x2x2. Далее мы устанавливаем позицию объекта. TOKRB_SetLinearDamping и TOKRBAngularDamping устанавливает линейное и угловое торможение соответственно. TOKRB_SetMass - устанавливает массу объекта. TOKRB_SetBoxInertiaTensor - sets the inertia tensor of an object. If you only have one geometry in your mesh, use this command, except with the specified object. (Не смог понять - если кто знает, напишите мне). Если у вас была, например, сфера то использовать нужно было бы TOKRB_SetSphereInertiaTensor. Сейчас мы изменим предыдущий кусочек кода и создадим большое количество кубиков, расположенных и направленных случайно.

For i=1 To Rigid_Bodies
obj(i) = CreateCube()
ScaleEntity obj(i),1,1,1
rb(i)=TOKRB_Create()
TOKRB_AddBox rb(i),2.0,2.0,2.0
TOKRB_SetPosition rb(i),Rnd(-40,40),10,Rnd(-40,40)
TOKRB_SetLinearDamping rb(i),0.001
TOKRB_SetAngularDamping rb(i),0.02
TOKRB_SetMass rb(i),2.0
TOKRB_SetBoxInertiaTensor rb(i),4.0,2.0,2.0,2.0
TOKRB_SetVelocity rb(i),Rnd(-1,1),Rnd(-1,1),Rnd(-1,1)
TOKRB_SetTorque rb(i),Rnd(-1,1),Rnd(-1,1),Rnd(-1,1)
Next

Команды TOKRB_SetVelocity и TOKRB_SetTorque устанавливают линейную и угловую скорость жесткого тела. Теперь мы напишем скелет основного цикла:

While Not KeyHit(1)
Repeat
elapsed=MilliSecs()-time
Until elapsed

ticks=elapsed/period
tween#=Float(elapsed Mod period)/Float(period)
For k=1 To ticks
time=time+period
If k=ticks Then CaptureWorld
UpdateWorld
Next
camx#=Cos(rot#)*50
camz#=Sin(rot#)*50

rot#=rot#+0.05+MouseXSpeed()/5.0

If rot#>360 Then rot#=0
PositionEntity cam,camx#,40,camz#
PointEntity cam,centerpoint

RenderWorld tween
Flip False
Wend

Тут, думаю, все понятно. К Tokamak это никакого отношения не имеет. А вот здесь уже появляется наш Tokamak:

For k=1 To ticks
time=time+period
If k=ticks Then
CaptureWorld
For i=1 To Rigid_Bodies
PositionEntity obj(i),TOKRB_GetX#(rb(i)),TOKRB_GetY#(rb(i)),TOKRB_GetZ#(rb(i))
RotateEntity obj(i),TOKRB_GetPitch#(rb(i)),TOKRB_GetYaw#(rb(i)),TOKRB_GetRoll#(rb(i)),False
If KeyDown(57) Then
TOKRB_ApplyImpulse2 rb(i),Rnd(-.3,.3),Rnd(-1.5,3.0),Rnd(-.3,.3),Rnd(-.05,.05),Rnd(.05,.05),Rnd(-.05,.05)
EndIf
Next
EndIf
TOKSIM_Advance(1.5/FPS,1)
UpdateWorld
Next

Здесь мы изменили цикл предыдущего куска кода. Команда TOKSIM_Advance моделирует физику. Первый параметр является шагом времени - это может быть полезным для создания эффекта замедления. Второй параметр устанавливает число суб-шагов. От этого зависит точность обработки физики.

PositionEntity obj(i),TOKRB_GetX#(rb(i)),TOKRB_GetY#(rb(i)),TOKRB_GetZ#(rb(i))
RotateEntity obj(i),TOKRB_GetPitch#(rb(i)),TOKRB_GetYaw#(rb(i)),TOKRB_GetRoll#(rb(i)),False

Вращает у устанавливает новое положение жестких тел.

If KeyDown(57) Then
TOKRB_ApplyImpulse2 rb(i),Rnd(-.3,.3),Rnd(-1.5,3.0),Rnd(-.3,.3),Rnd(-.05,.05),Rnd(.05,.05),Rnd(-.05,.05)
EndIf

Здесь мы задали произвольное вращение и движение объектам. TOKRB_ApplyImpulse2 - устанавливает импульс движения и вращения объекта. Наконец, мы уничтожаем симулятор и заканчиваем программу.

TOKSIM_DestroySimulator()
End

Вот вам полный код демки:

Const Rigid_Bodies=100,Animated_Bodies=5,Rigid_Particles=0

TOKSIM_SetRigidBodiesCount Rigid_Bodies
TOKSIM_SetAnimatedBodiesCount Animated_Bodies
TOKSIM_SetRigidParticleCount Rigid_Particles
TOKSIM_SetControllersCount 0
TOKSIM_SetGeometriesCount Rigid_bodies+Animated_Bodies ;Assuming each one only has one geometry. Not true with more complex rigid bodies and animated bodies.

TOKSIM_CreateSimulator(0,-10,0)

Graphics3D 800,600,0,2
Const FPS=60
Global cam = CreateCamera()
PositionEntity cam,0,10,-50

l=CreateLight()
centerpoint=CreatePivot()

ground = CreateCube()
EntityColor ground,5,5,55
ScaleEntity ground,50,5,50
PositionEntity ground,0,-5,0
abground = TOKAB_Create()
TOKAB_AddBox(abground,100.0,10.0,100.0)
TOKAB_SetPosition(abground,0.0,-5.0,0.0)

wall1 = CreateCube()
EntityColor wall1,25,25,55
ScaleEntity wall1,2,10,50
PositionEntity wall1,50,0,0
abwall1 = TOKAB_Create()
TOKAB_AddBox(abwall1,4.0,20.0,100.0)
TOKAB_SetPosition(abwall1,50.0,0,0.0)

wall2 = CreateCube()
EntityColor wall2,25,25,55
ScaleEntity wall2,2,10,50
PositionEntity wall2,-50,0,0
abwall2 = TOKAB_Create()
TOKAB_AddBox(abwall2,4.0,20.0,100.0)
TOKAB_SetPosition(abwall2,-50.0,0,0.0)

wall3 = CreateCube()
EntityColor wall3,25,25,55
ScaleEntity wall3,50,10,2
PositionEntity wall3,0,0,-50
abwall3 = TOKAB_Create()
TOKAB_AddBox(abwall3,100.0,20.0,4.0)
TOKAB_SetPosition(abwall3,0.0,0,-50.0)

wall4 = CreateCube()
EntityColor wall4,25,25,55
ScaleEntity wall4,50,10,2
PositionEntity wall4,0,0,50
abwall4 = TOKAB_Create()
TOKAB_AddBox(abwall4,100.0,20.0,4.0)
TOKAB_SetPosition(abwall4,0.0,0,50.0)

Dim obj(Rigid_Bodies)
Dim rb(Rigid_Bodies)

For i=1 To Rigid_Bodies
obj(i) = CreateCube()
ScaleEntity obj(i),1,1,1
rb(i)=TOKRB_Create()
TOKRB_AddBox rb(i),2.0,2.0,2.0
TOKRB_SetPosition rb(i),Rnd(-40,40),10,Rnd(-40,40)
TOKRB_SetLinearDamping rb(i),0.001
TOKRB_SetAngularDamping rb(i),0.02
TOKRB_SetMass rb(i),2.0
TOKRB_SetBoxInertiaTensor rb(i),4.0,2.0,2.0,2.0
TOKRB_SetVelocity rb(i),Rnd(-10,10),Rnd(-10,10),Rnd(-10,10)
TOKRB_SetTorque rb(i),Rnd(-10,10),Rnd(-10,10),Rnd(-10,10)
Next

period=1000/FPS
time=MilliSecs()-period

imptime=MilliSecs()

While Not KeyHit(1)
Repeat
elapsed=MilliSecs()-time
Until elapsed

ticks=elapsed/period
tween#=Float(elapsed Mod period)/Float(period)
For k=1 To ticks
time=time+period
If k=ticks Then
CaptureWorld
For i=1 To Rigid_Bodies
PositionEntity obj(i),TOKRB_GetX#(rb(i)),TOKRB_GetY#(rb(i)),TOKRB_GetZ#(rb(i))
RotateEntity obj(i),TOKRB_GetPitch#(rb(i)),TOKRB_GetYaw#(rb(i)),TOKRB_GetRoll#(rb(i)),False
If KeyDown(57) Then
TOKRB_ApplyImpulse2 rb(i),Rnd(-.3,.3),Rnd(-1.5,3.0),Rnd(-.3,.3),Rnd(-.05,.05),Rnd(.05,.05),Rnd(-.05,.05)
EndIf
Next
EndIf
TOKSIM_Advance(1.5/FPS,1)
UpdateWorld
Next

camx#=Cos(rot#)*50
camz#=Sin(rot#)*50

rot#=rot#+0.05+MouseXSpeed()/5.0

If rot#>360 Then rot#=0
PositionEntity cam,camx#,40,camz#
PointEntity cam,centerpoint

RenderWorld tween
Flip False
Wend

TOKSIM_DestroySimulator()
End

PS Данная статья является переводом статьи с blitzcoder.com. Если вы нашли какие то недочеты в статье или я что-то неправильно перевел то пишите мне на AmirL@mail.ru.

Категория: Программирование | Добавил: ЗлойАдмин (25.05.2007) | Автор: Перевод: Amir (Amir@mail.ru)
Просмотров: 1038 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Категории каталога
Программирование [6]
Моделирование [0]
Форма входа
Поиск
Друзья сайта
Наш опрос
Нужен ли такой сайт?
Всего ответов: 64
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Copyright MyCorp © 2017
Конструктор сайтов - uCoz