Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: BoundingBox
А НИФИГААА!! ))
я конечно не вникал особо в код, но как понял 2-й код в 3 раза быстрее. Это просто с камерой косяк какой то. У меня такое бывало, это гдето писать код не желательно. либо между рендером и флипом, либо ...
Сам посмотри. Пример на 10к повторов за цикл. )
И научи меня спойлеры делать.

Function EntityScaleX#(Entity)
Vx# = GetMatElement(Entity, 0, 0)
Vy# = GetMatElement(Entity, 0, 1)
Vz# = GetMatElement(Entity, 0, 2)
Scale# = Sqr(Vx#*Vx# + Vy#*Vy# + Vz#*Vz#)
Return Scale#
End Function
Function EntityScaleY#(Entity)
Vx# = GetMatElement(Entity, 1, 0)
Vy# = GetMatElement(Entity, 1, 1)
Vz# = GetMatElement(Entity, 1, 2)
Scale# = Sqr(Vx#*Vx# + Vy#*Vy# + Vz#*Vz#)
Return Scale#
End Function
Function EntityScaleZ#(Entity)
Vx# = GetMatElement(Entity, 2, 0)
Vy# = GetMatElement(Entity, 2, 1)
Vz# = GetMatElement(Entity, 2, 2)
Scale# = Sqr(Vx#*Vx# + Vy#*Vy# + Vz#*Vz#)
Return Scale#
End Function
Function Detect(Entity,FitEntity)
sr#=EntityScaleX#(Entity):w#=EntityScaleX#(FitEntity)
sr#=EntityScaleY#(Entity):h#=EntityScaleY#(FitEntity)
sr#=EntityScaleZ#(Entity):d#=EntityScaleZ#(FitEntity)
sx#=EntityX(Entity):x#=EntityX(FitEntity)
sy#=EntityY(Entity):y#=EntityY(FitEntity)
sz#=EntityZ(Entity):z#=EntityZ(FitEntity)
bw#=w+w:bx#=x-w
bh#=h+h:by#=y-h
bd#=d+d:bz#=z-d
dmin#=0
sr2#=sr*sr
If sx < bx
dmin#=dmin+((sx-bx)*(sx-bx))
ElseIf sx>(bx+bw)
dmin=dmin+(((sx-(bx+bw)))*((sx-(bx+bw))))
EndIf
If sy < by
dmin=dmin+((sy-by)*(sy-by))
ElseIf sy>(by+bh)
dmin=dmin+(((sy-(by+bh)))*((sy-(by+bh))))
EndIf
If sz < bz
dmin=dmin+((sz-bz)*(sz-bz))
ElseIf sz>(bz+bd)
dmin=dmin+(((sz-(bz+bd)))*((sz-(bz+bd))))
EndIf
If dmin<sr2
Return 1
Else
Return 0
EndIf
End Function
Graphics3D 640,480,16,2
MoveMouse 640/2,480/2
cam=CreateCamera()
PositionEntity cam,0,100,-100
RotateEntity cam,30,0,0
light=CreateLight()
box=CreateCube()
EntityColor box,123,140,200
ScaleEntity box,10,25,41
PositionEntity box,10,10,10
RotateEntity box,0,40,0
sphere=CreateSphere(4)
EntityColor sphere,255,0,0
ScaleEntity sphere,2,2,2
Global frame,xframe,time,maxTime
While Not KeyDown(1)
frame=MilliSecs()
frameNum=frameNum+1
mxs=MouseXSpeed()
mys=MouseYSpeed()
TurnEntity cam,mys*.3,-mxs*.3,0
MoveEntity cam,0,0,MouseDown(1)-MouseDown(2)
If KeyDown(203) Then sx#=sx#-1
If KeyDown(205) Then sx#=sx#+1
If KeyDown(19) Then sy#=sy#+1
If KeyDown(18) Then sy#=sy#-1
If KeyDown(200) Then sz#=sz#+1
If KeyDown(208) Then sz#=sz#-1
sx#=sx#+mx#
sy#=sy#+my#
sz#=sz#+mz#
PositionEntity sphere,sx#,sy#,sz#
RenderWorld
For i=1 To 10000
Detect(sphere,box)
Next
Text 10,10,"millisecs: "+time
Text 10,30,"maxMillisecs"+maxTime
Flip
time=MilliSecs()-frame
If time>maxTime And frameNum>30 Then maxTime=time
Wend
End

Function Detect(sx#,sy#,sz#,sr#,bx#,by#,bz#,bw#,bh#,bd#)
Local dmin#=0
Local sr2#=sr*sr
If sx < bx
dmin=dmin+((sx-bx)*(sx-bx))
Else If sx>(bx+bw)
dmin=dmin+(((sx-(bx+bw)))*((sx-(bx+bw))))
EndIf
If sy < by
dmin=dmin+((sy-by)*(sy-by))
Else If sy>(by+bh)
dmin=dmin+(((sy-(by+bh)))*((sy-(by+bh))))
EndIf
If sz < bz
dmin=dmin+((sz-bz)*(sz-bz))
Else If sz>(bz+bd)
dmin=dmin+(((sz-(bz+bd)))*((sz-(bz+bd))))
EndIf
If dmin#<=sr2# Then Return True Else Return False
End Function
width=640
height=480
Graphics3D width,height,0,2
SetBuffer BackBuffer()
MoveMouse width/2,height/2
cam=CreateCamera()
PositionEntity cam,0,100,-100
RotateEntity cam,30,0,0
light=CreateLight()
bx#=0 ; box x
by#=0 ; box y
bz#=0 ; box z
bw#=50 ; box width
bh#=50 ; box height
bd#=50 ; box depth
sx#=0 ; sphere x
sy#=0 ; sphere y
sz#=0 ; sphere z
sr#=5 ; sphere radius
box=CreateCube()
EntityColor box,255,255,0
FitMesh box,0,0,0,bw,bd,bh
PositionEntity box,bx,by,bz
sphere=CreateSphere()
EntityColor sphere,255,0,0
ScaleEntity sphere,sr,sr,sr
PositionEntity sphere,sx#,sy#,sz#
Global frame,xframe,time,maxTime
While Not KeyDown(1)
frameNum=frameNum+1
frame=MilliSecs()
mxs=MouseXSpeed()
mys=MouseYSpeed()
TurnEntity cam,mys*.3,-mxs*.3,0
MoveEntity cam,0,0,MouseDown(1)-MouseDown(2)
If KeyDown(203) Then sx#=sx#-1
If KeyDown(205) Then sx#=sx#+1
If KeyDown(19) Then sy#=sy#+1
If KeyDown(33) Then sy#=sy#-1
If KeyDown(200) Then sz#=sz#+1
If KeyDown(208) Then sz#=sz#-1
sx#=sx#+mx#
sy#=sy#+my#
sz#=sz#+mz#
PositionEntity sphere,sx#,sy#,sz#
For i=1 To 10000
Detect(sx#,sy#,sz#,sr#,bx#,by#,bz#,bw#,bh#,bd#)
Next
RenderWorld
Text 10,10,"millisecs: "+time
Text 10,30,"maxMillisecs"+maxTime
Flip
time=MilliSecs()-frame
If time>maxTime And frameNum>30 Then maxTime=time
Wend
End
__________________
Последний раз редактировалось burovalex, 15.01.2013 в 10:42.
|