forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   BoundingBox (http://forum.boolean.name/showthread.php?t=17748)

Кирпи4 12.01.2013 00:19

BoundingBox
 
Блин, мужики, выручите по-братски...
Всю голову сломал, надо построить бокс вокруг меша неопределенной формы (то бишь пересчет позиций всех вертексов необходим).
Что то вот код понадобился, а написать не выходит...

Wegox 12.01.2013 00:55

Ответ: BoundingBox
 
Так:dontknow:
PHP код:

Graphics3D 800,600,32,2

CreateCamera()
CreateCube()
Box BoundEntity3D(M)
MoveEntity C,-6,5.2,4
PointEntity C
,M

CreateLight(2)
PositionEntity L,32,32,32
LightRange L
,24
LightColor L
,200,200,200
CameraClsMode C
,0,0
AmbientLight 32
,32,32
Repeat

    TurnEntity M
,-.5,-.6,-.7
    ScaleEntity M
,Abs Sin(Float(MilliSecs())/40)*2,Abs Sin(Float(MilliSecs())/80)*2,Abs Cos(Float(MilliSecs())/160)*2
    PositionEntity M
,Sin(Float(MilliSecs())/40)*3,0,Cos(Float(MilliSecs())/40)*5
    
    
If KeyHit(57Then
        Mode 
Not Mode
        
If Mode 0 Then
            ShowEntity Box
        
Else
            
HideEntity Box
        
EndIf
    EndIf
    
    If 
Mode 0 Then BoundEntity3D M,Box,.2
    UpdateWorld
    Cls
    WireFrame False
    AmbientLight 32
,32,32
    CameraClsMode C
,0,1
    RenderWorld
    CameraClsMode C
,0,0
    WireFrame True
    AmbientLight 255
,255,255
    HideEntity Box
    RenderWorld
    
If Mode 0 Then ShowEntity Box

    Flip
Until KeyHit
(1)

Function 
BoundEntity3D(Entity,Box 0,Outline#=.15)
    
If Entity 0 Then Return False
    EClass
$ = EntityClass(Entity)
    If 
Lower(EClass$) <> "mesh" Then Return False

    
If Box 0 Then
        Box 
CreateCube()
        
EntityFX Box,1+16
        T 
CreateTexture(256,256,1+16+32)
        
SetBuffer(TextureBuffer(T))
        
Color 32,32,32
        Rect 0
,0,256,256,1
        Color 0
,0,0
        Rect 6
,6,256-12,256-12,True
        
        Color 255
,255,255
        
        Line 0
,0,0,32
        Line 0
,255-32,0,255
        
        Line 256
,0,256,32
        Line 255
,255-32,255,255
        
        Line 0
,0,32,0
        Line 255
-32,0,255,0
        
        Line 0
,255,32,255
        Line 255
-32,255,255,255
        
        SetBuffer
(BackBuffer())
        
EntityTexture Box,T,0,0
        EntityBlend Box
,3
        FreeTexture T
    
EndIf
    
    
Local X#,Y#,Z#,BX#,BY#,BZ#
    
= -999999
    Y 
= -999999
    Z 
= -999999
    BX 
999999
    BY 
999999
    BZ 
999999
    
    
For Surface 1 To CountSurfaces(Entity)
        
GetSurface(Entity,Surface)
        For 
0 To CountVertices(S)-1
            TFormPoint VertexX
(S,N),VertexY(S,N),VertexZ(S,N),Entity,0
            
If TFormedX() > X Then
                X 
TFormedX()
            ElseIf 
TFormedX() < BX Then
                BX 
TFormedX()
            EndIf
            
            If 
TFormedY() > Y Then
                Y 
TFormedY()
            ElseIf 
TFormedY() < BY Then
                BY 
TFormedY()
            EndIf
            
            If 
TFormedZ() > Z Then
                Z 
TFormedZ()
            ElseIf 
TFormedZ() < BZ Then
                BZ 
TFormedZ()
            EndIf
        
Next
    Next
    
    FitMesh Box
,X+Outline,Y+Outline,Z+Outline,BX-X-Outline*2,BY-Y-Outline*2,BZ-Z-Outline*2,0
    
Return Box
End 
Function 


Randomize 12.01.2013 01:16

Ответ: BoundingBox
 
Цитата:

Сообщение от Кирпи4 (Сообщение 249114)
Блин, мужики, выручите по-братски...
Всю голову сломал, надо построить бокс вокруг меша неопределенной формы (то бишь пересчет позиций всех вертексов необходим).
Что то вот код понадобился, а написать не выходит...

Нечто вроде:
Код:

Global EntityBox_Width#, EntityBox_Height#, EntityBox_Depth#

Function GetEntityBox(entity)
            EntityBox_Width = 0
            EntityBox_Height = 0
            EntityBox_Depth = 0

            Local surf_count = CountSurfaces(entity)

        For surf_n = 0 To (surf_count - 1)

                Local surf = GetSurface(entity, surf_n)
                       
                Local vert_count = CountVertices(surf)

                For vert_n = 0 To (vert_count-1)
                       
                        EntityBox_Width = Max(VertexX(surf, vert_n), EntityBox_Width)
                        EntityBox_Height = Max(VertexY(surf, vert_n), EntityBox_Height)
                        EntityBox_Depth = Max(VertexZ(surf, vert_n), EntityBox_Depth)
                Next
        Next
End Function

Код:

Function Max#(v1#, v2#)
    If v1 > v2 Then
      Return v1
    Else
      Return v2
    EndIF
End Function

Писал прямо тут. Исправить ошибки, думаю, не трудно.
Там может быть косяк с CountSurfaces
Если у тебя AnimMesh то нужно обернуть это ещё в рекурсию и бежать по чайлдам.
И да, не злоупотребляй в цикле. Перебор - довольно ресурсоёмкая операция.

burovalex 14.01.2013 12:50

Ответ: BoundingBox
 
Спс Рандомайз, удобный код!

Только хочу добавить, что таким образом можно найти только 3 точки: самую правую, верхнюю и дальнюю. И если бокс построить по симметрии, а модель будет удлинена в другую сторону, меш вылезет за бокс.

Так что надо находить и три противоположные стороны
Извиняюсь, за корявость написания, не знаю как здесь табуляцией пользоваться..
Код:

Global EntityBox_Right#, EntityBox_Left#, EntityBox_Top#, EntityBox_Bottom#, EntityBox_Front#, EntityBox_Back#

Function GetEntityBox(entity)
EntityBox_Right =    0
EntityBox_Left =    0
EntityBox_Top =    0
EntityBox_Bottom = 0
EntityBox_Front =  0
EntityBox_Back =    0

            Local surf_count = CountSurfaces(entity)

        For surf_n = 0 To (surf_count - 1)

                Local surf = GetSurface(entity, surf_n)
                       
                Local vert_count = CountVertices(surf)

                For vert_n = 0 To (vert_count-1)
                       
EntityBox_Right =  Max(VertexX(surf, vert_n), EntityBox_Right)
EntityBox_Left =    Min(VertexX(surf, vert_n), EntityBox_Left)
EntityBox_Top =    Max(VertexY(surf, vert_n), EntityBox_Top)
EntityBox_Bottom = Min(VertexY(surf, vert_n), EntityBox_Bottom)
EntityBox_Front =  Max(VertexZ(surf, vert_n), EntityBox_Front)
EntityBox_Back =    Min(VertexZ(surf, vert_n), EntityBox_Back)

                Next
        Next
End Function

Код:

Function Max#(v1#, v2#)
    If v1 > v2 Then
      Return v1
    Else
      Return v2
    EndIF
End Function

Function Min#(v1#, v2#)
    If v1 > v2 Then
      Return v2
    Else
      Return v1
    EndIF
End Function


burovalex 14.01.2013 13:02

Ответ: BoundingBox
 
А чтоб занести бокс

Код:

;Надо найти центр бокса
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)


Wegox 14.01.2013 15:33

Ответ: BoundingBox
 
Цитата:

Сообщение от burovalex (Сообщение 249379)
А чтоб занести бокс

Код:

;Надо найти центр бокса
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 так:
PHP код:

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 


burovalex 14.01.2013 20:48

Ответ: BoundingBox
 
Вложений: 1
Работает только с прямым расположением бокса.
А заменять одну строку (FitMesh), на 20 - не вижу смысла..

Wegox 14.01.2013 21:19

Ответ: BoundingBox
 
Цитата:

Сообщение от burovalex (Сообщение 249427)
Работает только с прямым расположением бокса.
А заменять одну строку (FitMesh), на 20 - не вижу смысла..

Ну даже и не знаю, у меня в IDE всего четыре лишних строчки) да и работает быстрее чем FitMesh, а повороты тоже можно контролировать, надо просто сделать это!:-D
вот аналог с FitMesh
PHP код:

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#

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(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#

    
RenderWorld
    
    
If  Detect(sx#,sy#,sz#,sr#,bx#,by#,bz#,bw#,bh#,bd#)=True Then Text 0,0,"Detec Sphere"
    
    
Flip

Wend 


Тормоза жуткие:)

burovalex 14.01.2013 22:11

Ответ: BoundingBox
 
А НИФИГААА!! ))

я конечно не вникал особо в код, но как понял 2-й код в 3 раза быстрее. Это просто с камерой косяк какой то. У меня такое бывало, это гдето писать код не желательно. либо между рендером и флипом, либо ...
Сам посмотри. Пример на 10к повторов за цикл. )
И научи меня спойлеры делать.
PHP код:

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 



PHP код:

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 


pepel 14.01.2013 23:00

Ответ: BoundingBox
 
Цитата:

Сообщение от burovalex (Сообщение 249436)
И научи меня спойлеры делать.




в расширенном режиме- монхромный смайл

или так [ OFFTOP ] [ /OFFTOP ]


Wegox 15.01.2013 02:48

Ответ: BoundingBox
 
Да не быстрее он работает, это просто матрица в реальном времени долго обсчитывается что-ли... не знаю, не решил пока:-D

burovalex 15.01.2013 10:44

Ответ: BoundingBox
 
Да не отмазывайся! ))

Wegox 15.01.2013 15:31

Ответ: BoundingBox
 
Я и не отмазываюсь:-D давай по честному.
1)
For i=1 To 10000
FitMesh box,0,0,0,bw,bd,bh
Detect
(sx#,sy#,sz#,sr#,bx#,by#,bz#,bw#,bh#,bd#)
Next

2) Я же в реальном времени масштабирую объект!:)

3) А потом скомпилируй код в *exe и посмотри что быстрее!

burovalex 15.01.2013 18:37

Ответ: BoundingBox
 
Цитата:

Сообщение от Кирпи4 (Сообщение 249114)
Блин, мужики, выручите по-братски...
Всю голову сломал, надо построить бокс вокруг меша неопределенной формы (то бишь пересчет позиций всех вертексов необходим).
Что то вот код понадобился, а написать не выходит...

Вообще, Вегокс, нас просили о другом. Я просто подметил что с фитом работает быстрее, хотя в коде не разбирался. )

В твоем примере, нужно было сделать так, чтобы ты сферу двигал, а полупрозразный бокс находил его реал размеры в реал тайме. Примерно так :)


Часовой пояс GMT +4, время: 20:25.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot