Не могу понять эти координаты текстуры UV (диапазон НЕ от 0.0 до 1.0)

9

Я пытаюсь нарисовать простой трехмерный объект, сгенерированный 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

Я попытался экспортировать одну и ту же модель в разные форматы, collada, fbx и x. Все это дает одно и то же.

дельта
источник

Ответы:

8

Вы правы, УФ-лучи обычно идут от 0 до 1, хотя, как сказал Дэвид X, это не является обязательным требованием. В вашем случае проблема заключается в частоте сгенерированных UV-координат SketchUp. Например, если ваша ось Y (координата V) переходит от 0 до 46, то эта текстура, если включена обтекание, будет повторяться 46 раз в направлении V. Обтекание также делает его меньше, потому что вам приходится многократно дублировать изображение на одной и той же поверхности. Реэкспорт в FBX или Collada ничего не решает, потому что в любом случае это тот же UV. Чтобы это исправить, вам нужно вернуться в SketchUp и изменить способ генерации УФ для цилиндра. Возможно, вы можете указать УФ-диапазон самостоятельно или, возможно, вам придется изменить параметры геометрии. Я никогда не использовал SketchUp, поэтому я не

Наконец, похоже, что намотка вершины цилиндра может быть противоположностью ваших кубов. Графические API, такие как OpenGL и DirectX, используют обмотку вершин треугольника, чтобы определить, в каком направлении стоит треугольник. Вот как они выполняют выборку задней поверхности - не визуализируя треугольники, обращенные от камеры, в качестве оптимизации. В случае вашего цилиндра кажется, что вид смотрит в цилиндр, потому что треугольники, расположенные ближе всего к камере, направлены в неправильном направлении. Еще раз, это проблема, которую необходимо решить в SketchUp, и это можно проверить, посмотрев направление нормали грани для каждого треугольника (она должна быть направлена ​​наружу, а не внутрь).

Corillian
источник
1

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

Дэвид Х
источник
1

Если вы хотите, чтобы ваши координаты uv были точно между 0 и 1, вы можете использовать масштабную матрицу для вашей модели.

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

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

Конечно, это всего лишь обходной путь, и вы могли бы лучше найти способ установить Sketchup в правильных настройках (я думаю, что ваш экспортер или сам Sketchup здесь работают неправильно). Но если это не сработает, создайте свой пост-загрузочный процессор и сохраните матрицу масштабирования текстуры.

Marnix
источник
@Marmix Это очень простое, эффективное и элегантное решение !!!
3d-indiana-
0

Похоже, SketchUp не нормализует ваши координаты текстуры или не использует собственную метрику. Наличие texcoords <0 или> 1 и GL_REPEAT в качестве обтекания текстуры означает, что текстура будет уменьшена, чтобы соответствовать геометрии и повторена по горизонтали и вертикали.

Попробуйте импортировать сетку в другой пакет моделирования (MilkShape, Blender) и исправить там ультрафиолетовую карту.

r2d2rigo
источник
4
Наличие texcoords <0 или> 1 и GL_REPEAT в качестве обтекания текстуры означает, что текстура будет [ удалена ошибочная инструкция ] повторяться по горизонтали и вертикали.
Кромстер