Проблемы при разборе текстурных координат Wavefront .obj - PullRequest
3 голосов
/ 12 января 2012

Я пишу свой собственный анализатор .obj в objc для OpenGL ES 2.0, чтобы лучше понять, как работает эта штука OpenGLES.Загрузка вершин и показ модели с цветами вершин на ней работает как шарм.Небольшое замечание: я использую индексный буфер.

Настоящая проблема - отображение текстур атм.Как вы увидите чуть ниже, моя текстура не отображается так, как должна быть.

Вот как я думаю, что формат .obj работает, пожалуйста, исправьте меня, если я ошибаюсь: строки "f" описывают лицо, где число перед косой чертой определяет индекс вершины и число послекосая черта определяет координату текстуры.

Рассмотрим следующий файл .obj (экспортированный Cinema 4D):

v -75 75 -50
v 75 75 -50
v -75 -75 -50
v 75 -75 -50

vt 0 0
vt 0 1
vt 1 1
vt 1 0

f 4/3 3/2 1/1
f 2/4 4/3 1/1

И следующую текстуру:

512x512 Texture

Теперь, когда я размещаю вершины в трехмерном пространстве OpenGL ES и пытаюсь отобразить координаты текстуры для каждой отдельной вершины, отображение идет неправильно.Я мог бы исправить это, перемещая некоторые значения координат текстуры, но я понимаю, что это не способ сделать это.Я также попытался отредактировать некоторые из моих настроек экспортера .obj, чтобы перевернуть оси и / или UV-отображение, но ни одно из них не привело к правильному отображению.Есть ли что-то, чего мне не хватает в моей теории относительно формата файла .obj?Я уже мог сказать одно: вчера я читал, что система координат в формате .obj определяет topleft как опорную точку текстуры.Итак, я исправил это уже в моем анализе.

Вот небольшая сводка с текущей ситуацией: Обновление: система координат текстуры - это фактическая система координат текстуры .obj, а НЕ система координат OpenGL.Я перевожу координаты в моем алгоритме синтаксического анализа, чтобы противостоять этому.

Summary

Ответы [ 4 ]

4 голосов
/ 13 января 2012

Насколько я знаю, система координат, о которой вы сообщаете, неверна.

На самом деле это что-то вроде этого:

Coordinate System

Я знаю, что это, вероятно, не реальный ответ на ваш вопрос, но я надеюсь, что он пролил некоторый свет на него.

3 голосов
/ 25 октября 2015

Я обнаружил похожую проблему при разборе файлов .obj. В моем случае кажется, что мои файлы .obj используют инвертированную ось V (2-я координата текстуры). Я решил проблему с этой строкой кода. v = 1,0f - v;

3 голосов
/ 26 июля 2012

Я собираюсь ответить на свой собственный вопрос: проблема казалась в том, что я использовал буфер индекса для повышения производительности, но мои координаты текстуры все еще были сопоставлены с исходными вершинами.

1 голос
/ 28 января 2012

Маурицио прав в своем представлении координат текстурного отображения opengl.

Глядя на ваши фотографии, я бы сказал, что вам следует лучше взглянуть на свой код objC.Если предположить, что .obj правильно экспортируется в C4D, похоже, что у вас смешаны индексы текстур.

Правдоподобное доказательство: переключите нижнюю левую вершину с нижней правой вершиной на картинке, которую вы опубликовали («Результат Opengl») и ваша текстура получится правильной.

РЕДАКТИРОВАТЬ: на самом деле, ошибка может быть в вашем коде загрузки текстуры, но это не объясняет результат, который вы получаете.Даже если бы ошибка была в загрузке текстуры, то текстура просто показалась бы вверх ногами (из-за левой-нижней системы координат opengl).Предложение: переключите vt0 и vt3 в своем коде ...

...