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

Я пытаюсь нарисовать простой 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

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

9 голосов | спросил Delta 4 AMpMon, 04 Apr 2011 04:35:30 +040035Monday 2011, 04:35:30

4 ответа


8

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

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

ответил Corillian 5 PMpTue, 05 Apr 2011 12:19:39 +040019Tuesday 2011, 12:19:39
1

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

ответил David X 4 AMpMon, 04 Apr 2011 07:31:05 +040031Monday 2011, 07:31:05
1

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

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

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

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

ответил Marnix 4 PMpMon, 04 Apr 2011 17:37:53 +040037Monday 2011, 17:37:53
0

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

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

ответил r2d2rigo 4 PMpMon, 04 Apr 2011 12:06:44 +040006Monday 2011, 12:06:44

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132