Навигация
Категории
C++,C#,C [19]
Уроки по средам разработки приложений с использованием C,C++,C#, а также .Net, DirectX, OpenGL и других
Delphi [14]
Уроки работы в среде программирования Delphi
Basic [13]
Уроки разработки приложений в среде Basic
DirectX [8]
Уроки по работе с DirectX, включая Direct3D и другие инструменты
Web [7]
Уроки по "Веб-программированию"
JavaScript [12]
Уроки по кодингу в Java и JavaScript
XNA [9]
Статьи и уроки программирование в среде XNA C++&C#
Профиль
Статистика
Rambler's Top100

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Locations of visitors to this page
Главная » Статьи » Программирование » Basic

Использование TokaMak.DLL в BlitzBasic

Вы можете взять врапер здесь и 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 устанавливают линейную и угловую скорость жесткого тела. Теперь мы напишем скелет основного цикла:

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


Источник: http://blitzetc.blitzmax.ru/index.php/Tokamak_DLL
Категория: Basic | Добавил: gforcer (05.11.2009) | Автор: Админ
Просмотров: 525 | Комментарии: 1 | Теги: Basic, блитц, , tokamak, blitz, Plus, физика, dll, бейсик, 3D | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск
Друзья сайта
Демотиваторы
Copyright Зямаев Денис © 2017