Конференция "Игры" » Скелетная анимация
 
  • grisme © (28.04.07 16:21) [0]
    Загружаю меш и анимацию из формата SMD - там все просто, и скелет анимируется и рендерится правильно. Сначала я пересчитываю матрицы костей(с учетом родительских, вобщем абсолютная матрица), затем вывожу меш, опираясь на привязанную кость... и вот тут столкнулся с проблемой... я просто вывожу точку треугольника примерно следующим образом:
    M-матрица кости, к которой привязана вершина треугольника

    glVertex3f(точка_треугольника_x + M[3][0], точка_треугольника_x + M[3][1], точка_треугольника_x + M[3][2]);

    получается тихий ужас :o) меш приобретает вид вытянутого дистрофика, негодного в ряды армии. причем форма не теряется, он просто худеет и становится вытянутее по OY... подскажите пожалуйста, как бы правильно делать перерасчет точки треугольника, если известны ее координаты(исходный, так сказать меш) и матрица привязанной кости?
  • grisme © (28.04.07 16:22) [1]
    * блин %-) не поправил, конечно же
    glVertex3f(точка_треугольника_x + M[3][0], точка_треугольника_y + M[3][1], точка_треугольника_z + M[3][2]);
  • @!!ex © (28.04.07 19:44) [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         - матрица преобразований кости глобальная. Тоесть относительно начала координат.
  • grisme © (28.04.07 20:10) [3]
    т.е. насколько я понял, ты умножаешь исходный набор координат вершины(ака вектор позиции вершины в исходном меше) на уже пересчитанную(ака глобальную) матрицу модели у косточки с которой связаны? если да, то попробую, спасибо!(поправь пожалуйста, если я не правильно понял)
  • grisme © (28.04.07 21:19) [4]
    попробовал умножать вектор координат вершины треугольника из исходного меша на матрицу модели, связанной с ней, кости - колбасит меш еще больше %-)
  • @!!ex © (01.05.07 08:09) [5]
    Совсем забыл.
    После загрузки нужно провести вот такую операцию над вершинами модели.

     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;



    После этих операций применение к мешу начальной анимации не изменит меш. Что и нужно.
  • у (30.01.08 21:07) [6]
    у
  • rts111 © (31.01.08 08:02) [7]
  • rts111 © (31.01.08 11:40) [8]

    > rts111 ©   (31.01.08 08:02) [7]
    > http://tmtlib.narod.ru/smoothtex/smd-quat-noexe.rar


    P.S. Там исходники загрузчика. Только не понятно, причем здесь Гробовой?
 
Конференция "Игры" » Скелетная анимация
Есть новые Нет новых   [134431   +10][b:0][p:0.001]