Неможливо зрозуміти ці координати текстур УФ (діапазон НЕ від 0,0 до 1,0)


9

Я намагаюся намалювати простий 3D-об’єкт, згенерований Google SketchUp 8 Pro на моєму додатку WebGL, модель - простий циліндр.

Я відкрив експортований файл і скопіював положення вершин, індекси, нормалі та координати текстури у файл .json, щоб мати можливість використовувати його у javascript. Здається, все добре працює, за винятком координат текстури, які мають досить великі значення, наприклад 46,331676, а також негативні значення. Тепер я не знаю, чи помиляюсь, але хіба 2D текстурні координати повинні бути в діапазоні від 0,0 до 1,0?

Ну а малювання моделі за допомогою цих координат текстури надає мені абсолютно дивний вигляд, і я можу зрозуміти текстуру належним чином лише тоді, коли я дуже близький (не дуже я, кулачок) до моделі, як ніби текстура була шалено зменшено в розмірах і нескінченно повторюється на обличчях моделі. (так, я використовую GL_REPEAT для цієї обертання текстури)

Що я помітив, це те, що якщо я отримаю всі ці координати і поділяю їх на 10 або 100, я отримую набагато «нормальний» вигляд, але все ще не в діапазоні від 0,0 до 1,0.

Ось мій файл json: http://pastebin.com/Aa4wvGvv

Ось мої GLSL шейдери: http://pastebin.com/DR4K37T9

А ось файл .X, експортований SketchUp: http://pastebin.com/hmYAJZWE

Я також намагався намалювати цю модель за допомогою XNA, але все ще не працює. Використовуючи ці шейдери HLSL: http://pastebin.com/RBgVFq08

Я спробував експортувати ту саму модель у різні формати, коладу, fbx та x. Усі ці результати дають одне і те ж.

Відповіді:


8

Ви правильні, що ультрафіолетові виходять зазвичай від 0-1, хоча, як згадував Давид X, це не є обов'язковою умовою. У вашому випадку проблема полягає в частоті утворених SketchUp УФ-координат. Наприклад, якщо ваша вісь Y (координата V) йде від 0 до 46, тоді ця текстура, якщо ввімкнено обгортання, повториться 46 разів у напрямку V. Обертання також робить його меншим, оскільки вам доведеться дублювати зображення багато разів на одній і тій же поверхні. Повторний експорт як FBX або Collada не робить нічого для вирішення проблеми, оскільки це так само, як і УФ. Щоб виправити це, вам потрібно повернутися до SketchUp та змінити, як він генерує ультрафіолетові промені для циліндра. Можливо, ви можете самі вказати УФ-діапазон або, можливо, вам доведеться змінити параметризованість геометрії. Я ніколи не використовував SketchUp, тому не роблю '

Нарешті, схоже, що вершинна обмотка циліндра може бути протилежною вашим кубам. Графічний API на зразок OpenGL та DirectX використовують обмотку вершини трикутника, щоб визначити, в якому напрямку трикутник спрямований. Ось так вони виконують відсікання задньої поверхні - не виводячи трикутники, звернені до камери, як оптимізацію. У випадку з вашим балоном виявляється, що погляд дивиться в циліндр, тому що трикутники, найближчі до камери, стикаються в неправильному напрямку. Ще раз це питання, яке потрібно було б вирішити в SketchUp, і його можна перевірити, дивлячись на напрямок обличчя, нормальне для кожного трикутника (воно повинно бути спрямоване назовні, а не всередину).


1

(Координати текстури, безумовно, можуть бути за межами 0-1.) Я думаю, що це просто дивно OpenGL. IIRC, сфери використовують текстурні координати, які ставлять квадрат 0-1 на ~ 1/16 поверхні, і я не здивувався б, якщо циліндри роблять щось подібне. Як виправдано, можливо, вам доведеться написати власний код циліндра, видаючи відповідні текстурні координати.


1

Якщо ви хочете, щоб ваші координати uv були точно між 0 і 1, ви можете використовувати матричну шкалу для вашої моделі.

Отже, завантажуючи свою модель, ви можете перевірити свою максимум координата u та v та створити матрицю масштабування, яка зробить її більш "нормальною". Таким чином, це замінить ваші вручну масштабування 10 або 100. Отже, щоб домогтися його, вам доведеться масштабувати свої координати уф до [0,1].

|1/uMax|0     |
|0     |1/vMax|

Звичайно, це лише обхідне рішення, і ви можете краще знайти спосіб встановити Sketchup у правильних налаштуваннях (я думаю, ваш експортер чи сам Sketchup тут не виходить). Але якщо це не допоможе вам, створіть ваш процесор після завантаження і збережіть матрицю масштабування текстури.


@Marmix Це дуже просте, ефективне та елегантне рішення !!!
3d-indiana-jones

0

Схоже, SketchUp не нормалізує координати текстури або не використовує власну метрику. Якщо текстові слова <0 або> 1 та GL_REPEAT як обгортання текстури означають, що текстура буде зменшена відповідно до геометрії та повториться по горизонталі та вертикалі.

Спробуйте імпортувати сітку в інший пакет для моделювання (MilkShape, Blender) і виправити звідти карту uv.


4
Якщо текстові слова <0 або> 1 та GL_REPEAT як обгортання текстури означають, що текстура буде [ видалено помилковим твердженням ] повторена горизонтально та вертикально.
Кромстер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.