Бывалый
Регистрация: 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(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
If Detect(sphere,box) Color 500,0,0 Text 300,300,"Detec Sphere" EndIf
Flip Wend End
|