Показать сообщение отдельно
Старый 06.08.2010, 03:58   #15
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,372
Написано 2,478 полезных сообщений
(для 6,866 пользователей)
Ответ: Глюк с анимацией после Fitmesh entity...

Да факин щет! Всем -1!

FitMesh - Масштабирует и перемещает все вершины сетки объекта так, чтобы она вписалась в указанные размеры.

Ну чтож. Значит надо написать аналог самому.
Для этого нужно узнать Размеры аним меша.
После этого нужный_размер поделить на размер_аним_меша и вычислить фактор скейла по каждой из осей.

Moka в своё время писал:
Function AnimMeshWidth#(Mesh)
    
    
Local MinW#=999999,MaxW#=-999999
    
Local VertX#
    
Local ChildCnt%,SurfCnt%,VertCnt%
    
    
ChildCnt=CountChildren(Mesh)
    For 
n1=1 To ChildCnt
        Child
=GetChild(Mesh,n1)
        
SurfCnt=CountSurfaces(Child)
        For 
n2=1 To SurfCnt
            Surf
=GetSurface(Child,n2)
            
VertCnt=CountVertices(Surf)
            For 
n3=0 To VertCnt-1
                VertX
=VertexX(Surf,n3)
                If 
VertX>MaxW MaxW=VertX
                
If VertX<MinW MinW=VertX
            Next
        Next
    Next
    
    
Return Abs(MaxW-MinW)
    
End Function

Function 
AnimMeshHeight#(Mesh)
    
    
Local MinH#=999999,MaxH#=-999999
    
Local VertY#
    
Local ChildCnt%,SurfCnt%,VertCnt%
    
    
ChildCnt=CountChildren(Mesh)
    For 
n1=1 To ChildCnt
        Child
=GetChild(Mesh,n1)
        
SurfCnt=CountSurfaces(Child)
        For 
n2=1 To SurfCnt
            Surf
=GetSurface(Child,n2)
            
VertCnt=CountVertices(Surf)
            For 
n3=0 To VertCnt-1
                VertY
=VertexY(Surf,n3)
                If 
VertY>MaxH MaxH=VertY
                
If VertY<MinH MinH=VertY
            Next
        Next
    Next
    
    
Return Abs(MaxH-MinH)
    
End Function

Function 
AnimMeshDepth#(Mesh)
    
    
Local MinD#=999999,MaxD#=-999999
    
Local VertZ#
    
Local ChildCnt%,SurfCnt%,VertCnt%
    
    
ChildCnt=CountChildren(Mesh)
    For 
n1=1 To ChildCnt
        Child
=GetChild(Mesh,n1)
        
SurfCnt=CountSurfaces(Child)
        For 
n2=1 To SurfCnt
            Surf
=GetSurface(Child,n2)
            
VertCnt=CountVertices(Surf)
            For 
n3=0 To VertCnt-1
                VertZ
=VertexZ(Surf,n3)
                If 
VertZ>MaxD MaxD=VertZ
                
If VertZ<MinD MinD=VertZ
            Next
        Next
    Next
    
    
Return Abs(MaxD-MinD)
    
End Function


Function 
MeshCenterX#(Mesh)
    
    
Local MinW#=999999,MaxW#=-999999
    
Local ChildCnt%,SurfCnt%,VertCnt%
    
Local Count%,Ans#
    
    
ChildCnt=CountChildren(Mesh)
    For 
n1=1 To ChildCnt
        Child
=GetChild(Mesh,n1)
        
SurfCnt=CountSurfaces(Child)
        For 
n2=1 To SurfCnt
            Surf
=GetSurface(Child,n2)
            
VertCnt=CountVertices(Surf)
            For 
n3=0 To VertCnt-1
                Count
=Count+1
                Ans
=Ans+VertexX(Surf,n3)
            
Next
        Next
    Next
    
    
Return (Ans/Count)
    
End Function

Function 
MeshCenterY#(Mesh)
    
    
Local MinH#=999999,MaxH#=-999999
    
Local ChildCnt%,SurfCnt%,VertCnt%
    
Local Count%,Ans#
    
    
ChildCnt=CountChildren(Mesh)
    For 
n1=1 To ChildCnt
        Child
=GetChild(Mesh,n1)
        
SurfCnt=CountSurfaces(Child)
        For 
n2=1 To SurfCnt
            Surf
=GetSurface(Child,n2)
            
VertCnt=CountVertices(Surf)
            For 
n3=0 To VertCnt-1
                Count
=Count+1
                Ans
=Ans+VertexY(Surf,n3)
            
Next
        Next
    Next
    
    
Return (Ans/Count)
    
End Function

Function 
MeshCenterZ#(Mesh)
    
    
Local MinD#=999999,MaxD#=-999999
    
Local ChildCnt%,SurfCnt%,VertCnt%
    
Local Count%,Ans#
    
    
ChildCnt=CountChildren(Mesh)
    For 
n1=1 To ChildCnt
        Child
=GetChild(Mesh,n1)
        
SurfCnt=CountSurfaces(Child)
        For 
n2=1 To SurfCnt
            Surf
=GetSurface(Child,n2)
            
VertCnt=CountVertices(Surf)
            For 
n3=0 To VertCnt-1
                Count
=Count+1
                Ans
=Ans+VertexZ(Surf,n3)
            
Next
        Next
    Next
    
    
Return (Ans/Count)
    
End Function 

Теперь вычислив факторы можно скейлить.

Function ResizeAnimMesh(Entity,width#,height#,depth#,proporcional=0)
    
If EntityClass(Entity)="Mesh"
        
mw#=AnimMeshWidth(Entity)
        
mh#=AnimMeshWidth(Entity)
        
md#=AnimMeshWidth(Entity)

        
ScaleEntityEntitywidth/mwheight/mhdepth/md)
    EndIf
End Function 
* естественно без ResetXForm нормально работать не будет

И чо я самый умный чтоли? Не верю!
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 4090 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Arles (06.08.2010)