Граждане! Может кто подскажет почему в тексте плагина число вершин и число нормалей пишется одинаковое? Ведь вершина может иметь несколько нормалей... Код нужно дорабатывать на случай если есть вершины без сглаживающих групп?
Неправильно экспортируются текстурные координаты.
Чтоб добиться коректного отображения я делаю след:
1. Создал куб
2. применил UVW Map и выбрал там Plane-наложение.
3. Применяю Unwrap UVW
и только теперь импортируется правильно. Но проблема в том, что как только я разрываю вершины в Unwrap Editor'e (Detach Face Verts), чтоб правильно наложить текстуру, экспортируется уже не так как надо. Так же как и при применении Unwrap без шага 2.
Может у меня проблема с импортером? Я гружу в OpenGL ES
Слева - Что делаю в максе, справа- результат экспорта-импорта.

я тоже столкнулся с такой проблеммой. немного поразмыслив мозгами, я понял в чём дело.
дело в том что вывод у нас идёт индексированый. следовательно на 1 точку один TV. отсюда идёт вывод что может прально отоброжаться только обвёрточная текстура на 1 объекте. другя текстура будет отоброжаться правильно лишь в том случае, если позиция UV совподает с позицией UV другого треугольника имеющие смежные точки.
да автор конечно молоца что в чужом коде поменял коменты на русские и попытался разобраться в коде :)))
короч тоже столкнулся с проблемой текстурных координат и вроде как решил.. и нах переписал этот корявый плагин под свои корявые требования :))
вобщем смотрим как в прикрепленном к статье файле используются геометрические данные
for (i = 0; i < gModel.Model[n].MeshFaces.size( ); i++) for ( j = 0; j < 3; j++) { if ( gModel.Model[n].MeshTVerts.size( ) != 0) glTexCoord2fv( &gModel.Model[n].MeshTVerts[gModel.Model[n].MeshFaces[i].VertIndex[j+3]].vert[0]); glNormal3fv( &gModel.Model[n].MeshVerts[gModel.Model[n].MeshFaces[i].VertIndex[j]].normal[0]); glVertex3fv( &gModel.Model[n].MeshVerts[gModel.Model[n].MeshFaces[i].VertIndex[j]].vert[0]); }
короче тупо повертексно все делается.. никакого смысла запихивать индексы в файл ваще не вижу.. размера все равно больше получается...
короче дабы искоренить зло придумал фишку... из имеющихся текстурных координат, вертексов, индексов и текстурных индексов сделать 2 массива.. индексов и вертексов:
struct stVertex { float x,y,z; float tu, tv; }; struct stFace { int v[3]; }; void Convert(Tab<stVertex>& verts, Tab<stFace>& faces, TriObject * TObj) { stFace tmpFace; stVertex tmpVert; Mesh mesh = TObj->GetMesh( ); BitArray vMatch; vMatch.SetSize( mesh.numVerts); vMatch.ClearAll( ); verts.SetCount( mesh.numVerts); faces.SetCount( mesh.numFaces); for ( int i = 0; i < mesh.numFaces; i++) { Face face = mesh.faces[i]; TVFace tvFace = mesh.tvFace[i]; for ( int j = 0; j < 3; j++) { tmpFace.v[j] = face.v[j]; } for ( int j = 0; j < 3; j++) { UVVert tVert = mesh.tVerts[tvFace.t[j]]; Point3 vert = mesh.verts[face.v[j]]; tmpVert.x = vert.x; tmpVert.y = vert.y; tmpVert.z = vert.z; tmpVert.tu = tVert.x; tmpVert.tv = tVert.y; bool equal = false; if( ( verts[face.v[j]].tu == tmpVert.tu) && ( verts[face.v[j]].tv == tmpVert.tv)) equal = true; if ( vMatch[face.v[j]]) { if ( !equal) { tmpFace.v[j] = verts.Count( ); verts.Insert( verts.Count( ), 1, &tmpVert); } } else { verts[face.v[j]] = tmpVert; vMatch.Set( face.v[j]); } } faces[i] = tmpFace; } }
довольно грязновато) но удобно.. по крайней мере мне :)))
enjoy
Возникла странная проблема. Хочу чтоб при экспорте сначала появлялось диалаговое окно для указания некоторых настроек
экспорта. Для этого в функции DoExport, перед самим процессом экспорта, вызываю функуию DialogBox со ссылкой на нужное окно и т.п.
Вроде все правильно, да и компилится без ошибок. Но если при этом попытаться сделать экспорт в максе то вылезает такая вот муть:
http://tech3d.4sure.info/db.jpg
В окне этом ничего не работает, даже кнопка Cancel. Выйти можно только нажав в верхнем правом углу, после чего
экспорт не происходит(т.е. дальше DialogBox код уже не выполняется). И никакой ошибки не выводит.
Причем если не вызывать функцию DialogBox то все экспортится без проблем и того странного окна не вылезает.
Так же для теста пробовал вызывать MessageBox - тоже без проблем, MessageBox отображается и далее экспорт.
Кто-нить сталкивался? В чем подвох?
Может в параметрах функции DialogBox? В качестве hInstance указывал GetModuleHandle(NULL), и просто NULL.
Еще грешу на suppressPrompts, передаваемый в DoExport, смысла которого я так и не догнал. Да и что толку,
нельзя же его менять, это всего лишь передаваемый извне параметр в функцию DoExport. Что мне с ним делать.
Спасибо.
В DllEntry.cpp обьявлен
HINSTANCE hInstance;
У себя сделай
extern HINSTANCE hInstance;
и используй его.
// show dialog
showPrompts = suppressPrompts ? FALSE : TRUE;
if (showPrompts)
{
if (!DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_PANEL), iface->GetMAXHWnd(), UExporterOptionsDlgProc, (LPARAM)this))
{
return 1;
}
}CoolDev, спасибо! Все дело было в HINSTANCE.
Че то я ступил:)
Здравствуйте. При изучении этой статьи и написании своего плагина столкнулся с проблемой экспорта нормалей.
Нормали я экспортировал не так как описано в этой статье, а через Mesh.countNormal (это количество нормалей) и Mesh.gfxNormal (это сами нормали). Судя по тому, какой результат получен, я на верном пути. А загвоздка у меня вот в чём: я не знаю где хранятся данные о том к какому фейсу привязана каждая из нормалей. В хелпе к sdk не нашёл описания даже к этим переменным. Писал изучая mesh.h.
KKH не знаю что такое gfxNormal, я делал через rendervertex (rv), но алгоритм сопоставления нормалей и фейсов думаю одинаковый.
У rv можно получть нормаль из rn (одна нормаль, не сглаженая), либо считать из массива ern. Алгоритм следующий:
Нужно завести переменную (пусть будет Ncount) в которой хранится число уже считанных нормалей для данной вершины. В цикле прохода по фейсам нужно анализировать группу сглаживания фейса и взависимости от рез-а может быть три случа:
1) Если вершина с таким индеком в массиве вершин макса и такой группой сглаживания встретилась впервые - нужно брать нормаль из массива ern нормаль с индексом [Ncount], и увеличивать Ncount на один.
2) Если вершина с таким индексом и такой группой сглаживания уже встречалась, то надо брать нормаль у нее.
3) Если группа сглаживания вершине не назначена. то нужно брать нормаль не из массива ern, а из rn (нужно брать из rn, тк ern будет пустым в случае отсутствия груп сглаживания у вершины).
Я кстати тоже почему-то не смог найти в сдк, где это было б описано.
Столкнулся с такой проблемой, как экспортировать шейдеры из 3dsmax?
Вот я накладываю на объект матрериал класса DirectX 9 Shader, указываю путь к шейдеру. Вопрос как экспортнуть сцену в ASE что-бы он макс мне экспортнул путь к шейдеру? Или что нужно изменить в исходнике плагина? может кто знает? т.к по умолчанию он мне путь к шейдеру не экспортирует, ни название шейдера, ничего.
Рылся в MAX SDK, но ничего путного там не нашел
А где собственно можна слить SDK? (k 2009 MAXy)!
Как переделать код для 8 мах-а?
КЕН
Очевидно, пытаться компилировать под SDK 8 Макса. Смотреть ошибки и исправлять их. :)
у меня VS 2008,max SDK 2009,создал простой экспортер чтобы разобраться как оно работает,все компилится,но добавляю мой плагин в папку stdplugs,в максе 2008/2009 выдает ошибку:
DLL <c:\program files\...>
failed to initialize
Error code 193-%1 не является приложением Win32
http://slil.ru/28807125 - вот плагин и исходники к нему
эй,ну может кто-нибудь помочь?компилил исходники к этой статье,та же самая ошибка!создавл проект с помощью plugin wizard,но в результате выдает все туже ошибку(((((
Тема в архиве.