Уголок tool-программистов
GameDev.ru / Сообщества / Уголок tool-программ / Форум / Нюансы при экспорте из 3DS MAX (комментарии) (3 стр)

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

Страницы: 1 2 3
Barbar1anПостоялецwww19 мая 200914:44#30
Festern
ты забыл про ситуацию, когда после сглаживания на одну вершину всё равно приходится одна нормаль.
например для большинства выпуклых объектов.
т.е. нормаль как бы усредняется между соотв поликами. и новые не создаются.
т.е. полигоны шарят не тока одну вершину, но и одну нормаль.
т.е. нормали в углах поликов не параллельны, но и группы сглаживания нет, за ненадобностью.

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

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

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

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

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

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

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

return rv->rn.getNormal();
[code]

Barbar1anПостоялецwww4 июня 200916:24#32
Я тут написал "правильный" экпорт транфсормаций :)) Ловите кому нужно.

Данный код 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;
  }

Barbar1anПостоялецwww8 июня 20093:19#33
у кого были артефакты в освещении попробуйте мой вариант кода, мне таки удалось сделать его безглючным по крайней мере на всех моих моделях
uelkfrПостоялецwww27 дек. 201019:56#34
Вначале статьи говорится
>Поскольку системы разносторонние, то не существует такого поворота, с помощью которого можно перейти от одной системы к другой. Тут требуется еще и отражение >относительно одной из координатных плоскостей.

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

Изображение

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

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

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

Anders333Постоялецwww23 дек. 201219:46#36
Я правильно понял, чтобы анимировать кость, созданную в 3DSMax, в DirectX  следует использовать следующую формулу:
финальная_позиция_кости = позиция_кости * ( обратная_матрица_смены_оси * матрица_поворота_кости * матрица_смены_оси))

?
Страницы: 1 2 3

/ Форум / Уголок tool-программистов

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

2001—2018 © GameDev.ru — Разработка игр