Тема: BoundingBox
Показать сообщение отдельно
Старый 14.01.2013, 15:33   #6
Wegox
Бывалый
 
Аватар для Wegox
 
Регистрация: 17.12.2011
Сообщений: 862
Написано 443 полезных сообщений
(для 1,133 пользователей)
Ответ: BoundingBox

Сообщение от burovalex Посмотреть сообщение
А чтоб занести бокс

;Надо найти центр бокса
x#=(EntityBox_Right+EntityBox_Left)/2
y#=(EntityBox_Top+EntityBox_Bottom)/2
z#=(EntityBox_Front+EntityBox_Back)/2
;найти размеры сторон
lx#=abs(EntityBox_Right-EntityBox_Left)
ly#=abs(EntityBox_Top-EntityBox_Bottom)
lz#=abs(EntityBox_Front-EntityBox_Back)
;у блитца есть полезная функция для этого, но точно не помню какие параметры надо заносить. Она подгоняет Меш под нужные размеры и выставляет ему новый осевой центр.
FitMesh(x,y,z,lx,ly,lz,false)
Можно избавится от FitMesh так:
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

sphere
=CreateSphere(4)
EntityColor sphere,255,0,0
ScaleEntity sphere
,2,2,2


While Not KeyDown(1)

mxs=mxs+MouseXSpeed()
mys=mys+MouseYSpeed()
RotateEntity cam,mys,-mxs,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

If Detect(sphere,box)
Color 500,0,0
Text 300
,300,"Detec Sphere"
EndIf

Flip
Wend
End 
(Offline)
 
Ответить с цитированием