Администратор
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений (для 996 пользователей)
|
Хочу еще вот что сказать (хотя эту тему мы уже обсуждали):
Мне нравится когда люди говорят как хороши функции и как они полезны а сами творят следующее:
есть такой физический движок для Блица ODE... лежит тут, скачайте его, откройте архив... там в каталоге sample есть файл ode_tutorial_03_01.bb сожержимое файла позволю себе опубликовать:
;-----------------------------;
; BlitzODE ARKON Wrapper 0.5b;
; Tutorial 3 ;
;-----------------------------;
Const LENGTH# = 0.7 * 8
Const WIDTH# = 0.5 * 8
Const HEIGHT# = 0.2 * 8
Const RADIUS# = .16 * 8
Const STARTZ# = 5 + .5 * 8
Const CMASS# = 50
Const WMASS# = 10
Include "BlitzODE.bb"
;------ Initialize Graphics --------
Graphics3D 800, 600
SetBuffer BackBuffer()
SetFont LoadFont("Arial", 14, 1, 1, 0)
cam = CreateCamera()
PositionEntity cam, -10, 20, 0
lh = CreateLight()
PositionEntity lh, 100, 100, 100
RotateEntity lh, 90, 0, 0
LightColor lh, 100, 100, 100
AmbientLight 50, 50, 50
plane = CreatePlane()
;mirror = CreateMirror(plane)
EntityColor plane, 0, 0, 150
EntityAlpha plane, .8
SeedRnd MilliSecs()
;--------- Initialize ODE ----------
Global space = ODE_dWorldCreate(0)
;---- Setting contact parameters ---
ODE_dSetContactMode(dContactBounce)
ODE_dSetMU(40); Friction
;ODE_dWorldSetCFM(0.00001)
;-------- Create many box ---------
For i = 1 To 10
g.TODEGeom = New TODEGeom
g\body = ODE_dBodyCreate()
g\geom = ODE_dCreateBox(space, 2, 2, 2, 10)
ODE_dGeomSetBody g\geom, g\body
ODE_dBodySetPosition(g\body, Rnd(-35, 35), Rnd(15, 25), Rnd(-35, 35))
ODE_dBodySetRotation(g\body, Rand(-180, 180), Rand(-180, 180), Rand(-180, 180))
g\mesh = CreateCube()
EntityColor g\mesh, Rand(255), Rand(255), Rand(255)
EntityShininess g\mesh, 0.7
Next
;------- Create many balls ---------
For i = 1 To 10
g.TODEGeom = New TODEGeom
g\body = ODE_dBodyCreate()
g\geom = ODE_dCreateSphere(space, 1, 10)
ODE_dGeomSetBody g\geom, g\body
ODE_dBodySetPosition(g\body, Rnd(-35, 35), Rnd(15, 25), Rnd(-35, 35))
ODE_dBodySetRotation(g\body, Rand(-180, 180), Rand(-180, 180), Rand(-180, 180))
g\mesh = CreateSphere()
EntityColor g\mesh, Rand(255), Rand(255), Rand(255)
EntityShininess g\mesh, 0.7
Next
;------- Create fixed box ----------
geom = ODE_dCreateBox(space, 15, .1, 15, 10)
ODE_dGeomSetPosition(geom, 20, 2.5, 0)
ODE_dGeomSetRotation(geom, 0, 0, 20)
mesh = CreateCube()
PositionEntity mesh, 20, 2.5, 0
RotateEntity mesh, 0, 0, 20
ScaleMesh mesh, .5, .05, .5
ScaleEntity mesh, 15, 1, 15
;-----------------------------------
Function AddCCylinder()
r# = Rnd(0.4, 2)
h# = Rnd(r / 2.0, r / 2.0 + 2.5)
cr = Rand(255)
cg = Rand(255)
cb = Rand(255)
g.TODEGeom = New TODEGeom
g\body = ODE_dBodyCreate()
g\geom = ODE_dCreateCCylinder(space, r, h * 2, 1)
ODE_dGeomSetBody(g\geom, g\body)
g\mesh = CreatePivot()
cl = CreateCylinder(8, 1, g\mesh)
RotateEntity cl, 90, 0, 0
EntityColor cl, cr, cg, cb
ScaleEntity cl, r, h, r
sh1 = CreateSphere(8, g\mesh)
ScaleEntity sh1, r, r, r
PositionEntity sh1, 0, 0, h
EntityColor sh1, cr, cg, cb
sh1 = CreateSphere(8, g\mesh)
ScaleEntity sh1, r, r, r
PositionEntity sh1, 0, 0, -h
EntityColor sh1, cr, cg, cb
px# = Rnd(-60, 60)
py# = Rnd(15, 40)
pz# = Rnd(-60, 60)
ax# = Rnd(-180, 180)
ay# = Rnd(-180, 180)
az# = Rnd(-180, 180)
ODE_dBodySetPosition(g\body, px#, py#, pz#)
ODE_dBodySetRotation(g\body, ax#, ay#, az#)
PositionEntity g\mesh, px#, py#, pz#
RotateEntity g\mesh, ax#, ay#, az#
gCount = gCount + 1
End Function
For i = 1 To 20
AddCCYlinder()
Next
Global cbody%[5], joint%[4], box%[1], sphere%[4]
;----------- Crete CAR -------------
;Car body
cbody[0] = ODE_dBodyCreate()
ODE_dBodySetPosition(cbody[0], 0, STARTZ, 0)
box[0] = ODE_dCreateBox(0, LENGTH, HEIGHT, WIDTH, CMASS)
ODE_dGeomSetBody(box[0], cbody[0])
g.TODEGeom = New TODEGeom
g\body = cbody[0]
g\geom = box[0]
g\mesh = CreateCube()
EntityColor g\mesh, 255, 255, 0
CAR = g\mesh
ScaleMesh g\mesh, .5, .5, .5
ScaleEntity g\mesh, LENGTH, HEIGHT, WIDTH
ODE_dBodySetMass(cbody[0], CMASS)
ODE_dBodyTranslateMass(cbody[0], 0, -1, 0)
;Car wheels
For i = 1 To 4
cbody[i] = ODE_dBodyCreate()
ODE_dBodySetRotation(cbody[i], 90, 0, 0)
sphere[i - 1] = ODE_dCreateSphere(0, RADIUS, WMASS)
ODE_dGeomSetBody(sphere[i - 1], cbody[i])
g.TODEGeom = New TODEGeom
g\body = cbody[i]
g\geom = sphere[i - 1]
g\mesh = CreateCylinder(16)
ScaleEntity g\mesh, RADIUS, RADIUS * .2, RADIUS
EntityColor g\mesh, 20, 0, 0
ODE_dBodySetMass(cbody[i], WMASS)
Next
ODE_dBodySetPosition (cbody[1],0.5*LENGTH,-.5 + STARTZ-HEIGHT*0.5,WIDTH*0.5);
ODE_dBodySetPosition (cbody[2],0.5*LENGTH,-.5 + STARTZ-HEIGHT*0.5,-WIDTH*0.5);
ODE_dBodySetPosition (cbody[3],-0.5*LENGTH,-.5 + STARTZ-HEIGHT*0.5, WIDTH*0.5);
ODE_dBodySetPosition (cbody[4],-0.5*LENGTH,-.5 + STARTZ-HEIGHT*0.5,-WIDTH*0.5);
For i = 0 To 3
joint[i] = ODE_dJointCreateHinge2()
ODE_dJointAttach(joint[i], cbody[0], cbody[i + 1])
ODE_dJointSetHinge2Anchor(joint[i], ODE_dBodyGetPositionX(cbody[i + 1]), ODE_dBodyGetPositionY(cbody[i + 1]), ODE_dBodyGetPositionZ(cbody[i + 1]))
ODE_dJointSetHinge2Axis1 (joint[i],0,1,0)
ODE_dJointSetHinge2Axis2 (joint[i],0,0,1)
Next
For i = 0 To 3
ODE_dJointSetHinge2Param(joint[i], dParamSuspensionERP, .3)
ODE_dJointSetHinge2Param(joint[i], dParamSuspensionCFM, .065)
Next
For i = 2 To 3
ODE_dJointSetHinge2Param(joint[i],dParamLoStop,0)
ODE_dJointSetHinge2Param(joint[i],dParamHiStop,0)
Next
ODE_dBodySetPosition cbody[0], 0, 5, 0
car_space% = ODE_dSimpleSpaceCreate(space)
ODE_dSpaceAdd(car_space, box[0])
For i = 1 To 4
ODE_dSpaceAdd(car_space, sphere[i - 1])
Next
speed# = .1
CreateTriMesh()
;------------------------------------------
ODE_UpdateGeoms()
;-----------------------------------
gameFPS = 50.0
framePeriod = 1000 / gameFPS
frameTime = MilliSecs () - framePeriod
While Not KeyHit(1)
Repeat
frameElapsed = MilliSecs () - frameTime
Until frameElapsed
frameTicks = frameElapsed / framePeriod
frameTween# = Float(frameElapsed Mod framePeriod) / Float(framePeriod)
For frameLimit = 1 To frameTicks
If frameLimit = frameTicks Then CaptureWorld
frameTime = frameTime + framePeriod
;------------ Add Force and Torque ----------
If KeyHit(57)
For g.TODEGeom = Each TODEGeom
ODE_dBodyEnable g\body
ODE_dBodyAddForce g\body, 0, Rnd(20, 50), 0
ODE_dBodyAddTorque g\body, Rnd(-10, 10), Rnd(-10, 10), Rnd(-10, 10)
Next
EndIf
;-------------- Update car physics ------------
If KeyDown(200)
speed# = speed# + .1
ElseIf KeyDown(208)
speed# = speed# - .1
EndIf
If Abs(speed) > .01
speed# = speed# * .95
EndIf
If KeyDown(203)
If steer# < .75 steer# = steer# + .05
ElseIf KeyDown(205)
If steer# > -.75 steer# = steer# - .05
Else
steer# = steer# * .95
EndIf
For i = 0 To 3
ODE_dJointSetHinge2Param(joint[i],dParamVel2, speed# * 12)
ODE_dJointSetHinge2Param(joint[i],dParamFMax2, 20.0)
Next
v# = steer# - ODE_dJointGetHinge2Angle1(joint[0])
v = v * 11.0
v1# = steer# - ODE_dJointGetHinge2Angle1(joint[1])
v1 = v1 * 11.0
ODE_dJointSetHinge2Param (joint[0],dParamVel,v)
ODE_dJointSetHinge2Param (joint[0],dParamFMax, 50)
ODE_dJointSetHinge2Param (joint[0],dParamLoStop,-0.75)
ODE_dJointSetHinge2Param (joint[0],dParamHiStop,0.75)
ODE_dJointSetHinge2Param (joint[1],dParamVel,v1)
ODE_dJointSetHinge2Param (joint[1],dParamFMax, 50)
ODE_dJointSetHinge2Param (joint[1],dParamLoStop,-0.75)
ODE_dJointSetHinge2Param (joint[1],dParamHiStop,0.75)
PointEntity cam, car
;------------ Update physics world ----------
tm = MilliSecs()
ODE_dWorldQuickStep 0.1
pTime = MilliSecs() - tm
;---------- Fix car angular momuntum --------
For i = 1 To 4
ax# = ODE_dBodyGetAngularVelX(cbody[i]) * .998
ay# = ODE_dBodyGetAngularVelY(cbody[i]) * .9
az# = ODE_dBodyGetAngularVelZ(cbody[i]) * .998
ODE_dBodySetAngularVel(cbody[i], ax#, ay#, az#)
Next
ax# = ODE_dBodyGetAngularVelX(cbody[0]) * .7
ay# = ODE_dBodyGetAngularVelY(cbody[0]) * .8
az# = ODE_dBodyGetAngularVelZ(cbody[0]) * .7
ODE_dBodySetAngularVel(cbody[0], ax#, ay#, az#)
Next
;---- Set geometry position and rotation ----
ODE_UpdateGeoms()
;--------------------------------------------
RenderWorld frameTween#
; FPS counter
fr = fr + 1
If MilliSecs() - frTime >= 1000
fps = fr
fr = 0
frTime = MilliSecs()
EndIf
Color 255, 255, 255
Text 5, 5, "FPS " + fps
Text 5, 20, "Physics time " + pTime
Text 5, 580, "Space - Add Force and Torque"
Flip 0
Wend
ODE_dCloseODE()
End
Function CreateTriMesh()
mesh = LoadMesh("002.b3d")
ScaleEntity mesh, 1, 1, 1
TriMesh = ODE_dTriMeshCreate(mesh)
tex = CreateTexture(32, 32, 8)
SetBuffer TextureBuffer(tex)
ClsColor 0, 0, 100
Cls
Color 255, 255, 0
Rect 0, 0, 31, 31, 0
Rect 1, 1, 29, 29, 0
ScaleTexture tex, .025, .025
EntityTexture mesh, tex
SetBuffer BackBuffer()
End Function
смотрим внимательно на код, здесь использование функции AddCCylinder было крайне нобходимо неправда-ли?
пойдем по всем пунктам указанным Жекой:
1. удобочитаемость от этого ну прямо жутко улучшилась...
2. эта функция больше НИГДЕ не вызывалась
3. эта функция является НЕПЕРЕНОСИМОЙ потому, что для каждого случая пришлось бы переписывать ее заново, поскольку она не принимает никаких параметров, т.е. эта функция очень узкоспециализирована (имеется ввиду размер, цвет, позиция и угол)...
я говорил вот про такие случаи...
__________________
Как минимум я помог многим (с)
|