Эта функция убивает всю трансформацию (поворот, скейл, особенно последнее). Дело в том что такие вещи как ScaleEntity (или масштабирование объекта целиком в максе [не фрагментов сетки]) не меняют реально положение вершин. Например создали дом размером 1. Отмасштабили его в 10 раз. Но вершины так и остались размером 1. И в таком виде они и передались в PhysX (или в другой движок) отсюда несоответствие трансформации видимого меша и физического.
В принципе можно это сделать и в самом блитзе, но я бы советовал заранее.
Вот функция, которая делает это (KillTransformMatrix):
Function KillTransformMatrix(mesh)
ScaleMesh mesh, GetScaleX(mesh),GetScaleY(mesh),GetScaleZ(mesh)
RotateMesh mesh, EntityPitch(mesh,1), EntityYaw(mesh,1), EntityRoll(mesh,1)
PositionMesh mesh, EntityX(mesh,1), EntityY(mesh,1), EntityZ(mesh,1)
End Function
;масштаб по X
Function GetScaleX#(Entity)
S_Componentx# = GetMatElement(Entity, 0, 0)
S_Componenty# = GetMatElement(Entity, 0, 1)
S_Componentz# = GetMatElement(Entity, 0, 2)
Return Sqr(S_Componentx#*S_Componentx# + S_Componenty#*S_Componenty# + S_Componentz#*S_Componentz#)
End Function
;масштаб по Y
Function GetScaleY#(Entity)
S_Componentx# = GetMatElement(Entity, 1, 0)
S_Componenty# = GetMatElement(Entity, 1, 1)
S_Componentz# = GetMatElement(Entity, 1, 2)
Return Sqr(S_Componentx#*S_Componentx# + S_Componenty#*S_Componenty# + S_Componentz#*S_Componentz#)
End Function
;масштаб по Z
Function GetScaleZ#(Entity)
S_Componentx# = GetMatElement(Entity, 2, 0)
S_Componenty# = GetMatElement(Entity, 2, 1)
S_Componentz# = GetMatElement(Entity, 2, 2)
Return Sqr(S_Componentx#*S_Componentx# + S_Componenty#*S_Componenty# + S_Componentz#*S_Componentz#)
End Function
Спасибо H@NON'у за то что подогнал функцию получения скейла Ентити прямо в блице (я до этого использовал dll "Blitz3D+")*
*В таком виде не тестировал.