Вы можете взять врапер здесь и Tokamak DLL отсюда.
Все dll-ки положите в папку с system32 или в папку с программой
(рекомендуется ложить в system32, и только при финальной сборке
программы поместить 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 устанавливают линейную и
угловую скорость жесткого тела. Теперь мы напишем скелет основного
цикла:
Тут, думаю, все понятно. К 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
Источник: http://blitzetc.blitzmax.ru/index.php/Tokamak_DLL |