Что означают все 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.
|