forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Полезные функции (http://forum.boolean.name/forumdisplay.php?f=17)
-   -   AnimMesh_Size_#(Mesh) (http://forum.boolean.name/showthread.php?t=3470)

moka 28.05.2007 04:31

AnimMesh_Size_#(Mesh)
 
Значит, тут побеседовал с WaReZMEN, и написал функции, возвращающие размер анимированной модели, и "истинный" центр.
Функции размера не Реалтайм (перебор всех вертексов - ресурсоёмкий процесс), и возвращают размер и центр только первого кадра.
Примечание: Если модель масштабируется, то нужно умножать получаемые данные этих функций на коэфицент масштабируемой плоскости, например результат AnimMeshWidth, умножать на коэфицент масштабирования по X координате. Так же и с функциями узнавания центра.

Код:

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

Тэкс, после тестирования функций центра, прошлый метод (разницы максимума и минимума), решил использовать другой метод: общая арифметическая всех вертексов, так лечше выходит - во первых центр блидже на центр похож, да и в несложных моделях, центр в центре тяжести.

LLI.T.A.L.K.E.R. 06.03.2011 23:47

Ответ: AnimMesh_Size_#(Mesh)
 
MAV!

Ошибка при попытке сосчитать фейсы у чайлда:
CountSurfaces(Child)
Всё делаю продуманно, без ошибок. Просто когда дело касается этого - то MAV

Blitz3D-Update-1.9.9

И ещё.. Чайлд нашёл и попробовал ScaleEntity Child - модель сменила размер, а костяк остался прежним.
Как смотреть костяк:
http://forum.boolean.name/showpost.p...9&postcount=43


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

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