Показать сообщение отдельно
Старый 21.09.2005, 19:00   #6
SubZer0
Администратор
 
Аватар для SubZer0
 
Регистрация: 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. эта функция является НЕПЕРЕНОСИМОЙ потому, что для каждого случая пришлось бы переписывать ее заново, поскольку она не принимает никаких параметров, т.е. эта функция очень узкоспециализирована (имеется ввиду размер, цвет, позиция и угол)...

я говорил вот про такие случаи...
__________________
Как минимум я помог многим (с)
(Offline)
 
Ответить с цитированием