-
Загружаю меш и анимацию из формата SMD - там все просто, и скелет анимируется и рендерится правильно. Сначала я пересчитываю матрицы костей(с учетом родительских, вобщем абсолютная матрица), затем вывожу меш, опираясь на привязанную кость... и вот тут столкнулся с проблемой... я просто вывожу точку треугольника примерно следующим образом: M-матрица кости, к которой привязана вершина треугольника
glVertex3f(точка_треугольника_x + M[3][0], точка_треугольника_x + M[3][1], точка_треугольника_x + M[3][2]);
получается тихий ужас :o) меш приобретает вид вытянутого дистрофика, негодного в ряды армии. причем форма не теряется, он просто худеет и становится вытянутее по OY... подскажите пожалуйста, как бы правильно делать перерасчет точки треугольника, если известны ее координаты(исходный, так сказать меш) и матрица привязанной кости?
-
* блин %-) не поправил, конечно же glVertex3f(точка_треугольника_x + M[3][0], точка_треугольника_y + M[3][1], точка_треугольника_z + M[3][2]);
-
Вот так выглядит применение анимации в моем коде:
FActor.CurrentAnimation:=Animation; for txgroup:=0 to FActor.TextureGroupsCount-1 do for vertex:=0 to FActor.TextureGroups[txgroup].VertexCount-1 do FActor.TextureGroups[txgroup].AnimatedBuffer[vertex].Position:= Multiply(FActor.TextureGroups[txgroup].OriginalBuffer[vertex].Position, Animation.Frames[Frame].Transforms[FActor.TextureGroups[txgroup].OriginalBuffer[ vertex].NodeID].Global);
Где OriginalBuffer - буфер с не анимированным мешем AnimatedBuffer - соответственно с анимированным Position - вектор позиции Global - матрица преобразований кости глобальная. Тоесть относительно начала координат.
-
т.е. насколько я понял, ты умножаешь исходный набор координат вершины(ака вектор позиции вершины в исходном меше) на уже пересчитанную(ака глобальную) матрицу модели у косточки с которой связаны? если да, то попробую, спасибо!(поправь пожалуйста, если я не правильно понял)
-
попробовал умножать вектор координат вершины треугольника из исходного меша на матрицу модели, связанной с ней, кости - колбасит меш еще больше %-)
-
Совсем забыл. После загрузки нужно провести вот такую операцию над вершинами модели. for txgroup:=0 to Actor.TextureGroupsCount-1 do
for vertex:=0 to Actor.TextureGroups[txgroup].VertexCount-1 do begin
Animation.Frames[0].Transforms[Actor.TextureGroups[txgroup].OriginalBuffer[verte x].NodeID].Global.InverseTranslateVect(Actor.TextureGroups[txgroup].OriginalBuff er[vertex].Position);
Animation.Frames[0].Transforms[Actor.TextureGroups[txgroup].OriginalBuffer[verte x].NodeID].Global.InverseRotateVect(Actor.TextureGroups[txgroup].OriginalBuffer[ vertex].Position);
end; Procedure Matrix.InverseRotateVect(var pVect:vector);
var temp : vector;
begin
temp:=pVect;
temp[0]:= pVect[0]*m_matrix[0]+pVect[1]*m_matrix[1]+pVect[2]*m_matrix[2];
temp[1]:= pVect[0]*m_matrix[4]+pVect[1]*m_matrix[5]+pVect[2]*m_matrix[6];
temp[2]:= pVect[0]*m_matrix[8]+pVect[1]*m_matrix[9]+pVect[2]*m_matrix[10];
pVect:=temp;
end;
Procedure Matrix.InverseTranslateVect(var pVect:vector);
var temp : vector;
begin
temp:=pVect;
temp[0]:= pVect[0]-m_matrix[12];
temp[1]:= pVect[1]-m_matrix[13];
temp[2]:= pVect[2]-m_matrix[14];
pVect:=temp;
end; После этих операций применение к мешу начальной анимации не изменит меш. Что и нужно.
-
у
-
-
|