Festern
ты забыл про ситуацию, когда после сглаживания на одну вершину всё равно приходится одна нормаль.
например для большинства выпуклых объектов.
т.е. нормаль как бы усредняется между соотв поликами. и новые не создаются.
т.е. полигоны шарят не тока одну вершину, но и одну нормаль.
т.е. нормали в углах поликов не параллельны, но и группы сглаживания нет, за ненадобностью.
а если в этом случае экпортить фейсовые нормали, то получается мы просто отбрасываем результат сглаживания.
де я неправ? :)
------------
апд:
Я НЕПРАВ!!!!!!!!!!!!!!!!!!!!!
читать ниже.
Если группы сглаживания нет, то не сглаживаются вообще.
Очень часто при моделинге (особенно технических объектов) нужно создавать геометрию с резкими ребрами.
И в этом случае smgroup у них 0.
Почитай документацию моделерам по поводу Smoothing Groups.
>ты забыл про ситуацию, когда после сглаживания на одну вершину всё равно приходится одна нормаль.
>например для большинства выпуклых объектов.
Вот эта строчка из моего кода описывает возврат нормали вершины в случае если она одна (rv->ern==0)
return rv->rn.getNormal(); [code]
Я тут написал "правильный" экпорт транфсормаций :)) Ловите кому нужно.
Данный код 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; }
у кого были артефакты в освещении попробуйте мой вариант кода, мне таки удалось сделать его безглючным по крайней мере на всех моих моделях
Вначале статьи говорится
>Поскольку системы разносторонние, то не существует такого поворота, с помощью которого можно перейти от одной системы к другой. Тут требуется еще и отражение >относительно одной из координатных плоскостей.
А затем приводится матрица, что такое преобразование существует
Или я чего-то не понимаю?
uelkfr
> Вначале статьи говорится
> > оскольку системы разносторонние, то не существует такого поворота, с помощью
> > которого можно перейти от одной системы к другой. Тут требуется еще и
> > отражение >относительно одной из координатных плоскостей.
> А затем приводится матрица, что такое преобразование существует
>
> Или я чего-то не понимаю?
Матрица содержит не только поворот, но и отражение ( изменение направления оси ).
Я правильно понял, чтобы анимировать кость, созданную в 3DSMax, в DirectX следует использовать следующую формулу:
финальная_позиция_кости = позиция_кости * ( обратная_матрица_смены_оси * матрица_поворота_кости * матрица_смены_оси))
?
Тема в архиве.