Тема: BoundingBox
Показать сообщение отдельно
Старый 14.01.2013, 22:11   #9
burovalex
Разработчик
 
Аватар для burovalex
 
Регистрация: 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(203Then sx#=sx#-1
If KeyDown(205Then sx#=sx#+1
If KeyDown(19Then sy#=sy#+1
If KeyDown(18Then sy#=sy#-1
If KeyDown(200Then sz#=sz#+1
If KeyDown(208Then 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(203Then sx#=sx#-1
    
If KeyDown(205Then sx#=sx#+1
    
If KeyDown(19Then sy#=sy#+1
    
If KeyDown(33Then sy#=sy#-1
    
If KeyDown(200Then sz#=sz#+1
    
If KeyDown(208Then 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.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Wegox (15.01.2013)