Войти
Уголок tool-программФорум

Нюансы при экспорте из 3DS MAX (комментарии) (3 стр)

Страницы: 1 2 3
#30
14:44, 19 мая 2009

Festern
ты забыл про ситуацию, когда после сглаживания на одну вершину всё равно приходится одна нормаль.
например для большинства выпуклых объектов.
т.е. нормаль как бы усредняется между соотв поликами. и новые не создаются.
т.е. полигоны шарят не тока одну вершину, но и одну нормаль.
т.е. нормали в углах поликов не параллельны, но и группы сглаживания нет, за ненадобностью.

а если в этом случае экпортить фейсовые нормали, то получается мы просто отбрасываем результат сглаживания.

де я неправ? :)

------------
апд:

Я НЕПРАВ!!!!!!!!!!!!!!!!!!!!!
читать ниже.

#31
15:50, 19 мая 2009

Если группы сглаживания нет, то не сглаживаются вообще.
Очень часто при моделинге (особенно технических объектов) нужно создавать геометрию с резкими ребрами.
И в этом случае smgroup у них 0.
Почитай документацию моделерам по поводу Smoothing Groups.

>ты забыл про ситуацию, когда после сглаживания на одну вершину всё равно приходится одна нормаль.
>например для большинства выпуклых объектов.

Вот эта строчка из моего кода описывает  возврат нормали вершины в случае если она одна (rv->ern==0)

return rv->rn.getNormal();
[code]
#32
16:24, 4 июня 2009

Я тут написал "правильный" экпорт транфсормаций :)) Ловите кому нужно.

Данный код WSM не учитывает(вроде)
А "правильный" в каком смысле?
Он позволяет экпортировать каждый узел не в мировой системе координат, а как иерархию. А также учитывает Object Offset т.е. пивот

Для получения  матрицы данного узла делаете следуещее:

    if(parent == null)
    {
      // родителя нет поэтому берём матрицу напрямую
      Matrix = node->GetNodeTM(Source->MaxInterface->GetTime());
    }
    else
    {
      // родитель есть, поэтому вычислям локальную матрицу данного узла по формуле NodeLocalTM = NodeWorldTM * Inverse(ParentWorldTM)
      Matrix3 pnm = node->GetParentTM(Source->MaxInterface->GetTime());
      Matrix =  node->GetNodeTM(Source->MaxInterface->GetTime()) * Inverse(pnm);
    }

    // переворачиваем оси, для получения DirectX системыкоординат
    Matrix3 zy(Point3(1, 0, 0), Point3(0, 0, 1), Point3(0, 1, 0), Point3(0, 0, 0));
    Matrix = zy * Matrix * zy;

Пи экспорте вершин, все нормали и вершины домножаем на Offset матрицу которорую получаем так:

    Matrix3 nodeTMi = node->GetNodeTM(s->MaxInterface->GetTime());
    nodeTMi.Invert();
    
    OffsetMatrix = node->GetObjectTM(s->MaxInterface->GetTime()) * nodeTMi; // вершины домножаем на эту матрицу
    
    OffsetMatrixForNormals = OffsetMatrix; // а нормали - на эту
    OffsetMatrixForNormals.Orthogonalize();
    OffsetMatrixForNormals.NoScale();
    OffsetMatrixForNormals.NoTrans();

при этом нормали экспортируются таким образом:

  Point3 GetVertexNormal(int fi, int j)
  {
    Point3 out;
  
    bool specified = false;
    if(SpecifiedNormals != null)
    {
      int normalID = SpecifiedNormals->GetNormalIndex(fi, j);
      if(normalID!=-1 && SpecifiedNormals->GetNormalExplicit(normalID))
      {
        out = SpecifiedNormals->GetNormal(fi, j) * OffsetMatrixForNormals;
        specified = true;
      }
    }

    if(!specified)
    {
      Face * f    = &MaxMesh->faces[fi];
      RVertex* rv    = MaxMesh->getRVertPtr(f->v[j]);
      DWORD smg    = f->smGroup;
      int numNormals  = rv->rFlags & NORCT_MASK;
  
      if(rv->rFlags & SPECIFIED_NORMAL)
      {
        out = rv->rn.getNormal() * OffsetMatrixForNormals;
      }
      else if(smg)
      {
        if(numNormals == 1)
        {
          out = rv->rn.getNormal() * OffsetMatrixForNormals;
        }
        else if(numNormals>1)
        {
          int i;
          for(i=0; i<numNormals; i++)
          {
            if((rv->ern[i].getSmGroup() & smg)== smg)
            {
              out = rv->ern[i].getNormal() * OffsetMatrixForNormals;
              break;
            }
          }
          if(i==numNormals)
          {
            Failed = true;
            UI->ReportError(L"Normal for %d smooth group not found\r\n", smg);
          }
        }
      }
      else
      {
        out =  MaxMesh->getFaceNormal(fi); // не умножать на матрицу(проблема отвертки)!!!!!!!!!!!!!!!!!!!! была долго, сцуко, причиной артефактов
      }
    }

    out = out.Normalize();
    return out;
  }
#33
3:19, 8 июня 2009

у кого были артефакты в освещении попробуйте мой вариант кода, мне таки удалось сделать его безглючным по крайней мере на всех моих моделях

Прошло более 1 года
#34
19:56, 27 дек 2010

Вначале статьи говорится
>Поскольку системы разносторонние, то не существует такого поворота, с помощью которого можно перейти от одной системы к другой. Тут требуется еще и отражение >относительно одной из координатных плоскостей.

А затем приводится матрица, что такое преобразование существует

Изображение

Или я чего-то не понимаю?

#35
20:19, 27 дек 2010

uelkfr
> Вначале статьи говорится
> > оскольку системы разносторонние, то не существует такого поворота, с помощью
> > которого можно перейти от одной системы к другой. Тут требуется еще и
> > отражение >относительно одной из координатных плоскостей.
> А затем приводится матрица, что такое преобразование существует
>
> Или я чего-то не понимаю?

Матрица содержит не только поворот, но и отражение (  изменение направления оси ).

Прошло более 1 года
#36
19:46, 23 дек 2012

Я правильно понял, чтобы анимировать кость, созданную в 3DSMax, в DirectX  следует использовать следующую формулу:

финальная_позиция_кости = позиция_кости * ( обратная_матрица_смены_оси * матрица_поворота_кости * матрица_смены_оси))

?

Страницы: 1 2 3
Уголок tool-программФорум

Тема в архиве.