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