Как нарисовать и текстурировать УФ-сферу с OpenGL 2.0 для Android
Я создаю приложение виртуальной реальности для Android, и я хотел бы создать сферу в openGL для моих целей. На первом шаге я нашел этот поток ( Draw Sphere - порядок вершин), где в первом ответе есть хороший урок о том, как автономно визуализировать сферу. В этом же ответе приведен пример кода сферы ( http://pastebin.com/4esQdVPP), который я использовал для своего приложения, а затем я успешно отобразил 2D-текстуру на сфере.
Однако этот пример сферы имеет плохое разрешение, и я хотел бы создать лучшее, поэтому я продолжил следовать некоторым учебникам по blender, чтобы сгенерировать сферу, а затем экспортировать файл.obj и просто взять координаты точек и индекс и проанализировать их в Java-код
Проблема при этом заключается в том, что при добавлении текстуры она выглядит разбитой на полюсах сферы, в то время как на остальной части сферы она выглядит хорошо (пожалуйста, посмотрите на следующие рисунки).
Я не знаю, что я делаю неправильно, поскольку алгоритм отображения текстуры должен быть таким же, поэтому я думаю, что, возможно, проблема в индексе сгенерированных точек. Это алгоритм, который я использую для отображения текстуры: https://en.wikipedia.org/wiki/UV_mapping
Это файл.obj, автоматически сгенерированный с помощью blender: http://pastebin.com/uP3ndM2d
И оттуда мы извлекаем индекс и координаты: это индекс точки: http://pastebin.com/rt1QjcaX
И это координаты точки: http://pastebin.com/h1hGwNfx
Не могли бы вы дать мне совет? Что-то я делаю не так?
2 ответа
Хорошо, проблема решена сейчас. Текстуры не работали должным образом, потому что сгенерированные точечные индексы начинаются с 1, а не с 0. Вычитая 1 для всех индексов, проблема решена...:)
Прежде всего, при определении координат текстуры на (или даже вблизи) полюсах необходимо соблюдать осторожность. Использование UV-алгоритма, предложенного для s-координаты на полюсе, не даст вам того, что вы хотите, с выбранной тесселяцией (например, s = 0,5 + arctan2(1,0)/(2*pi) будет использоваться для всех указывает на северный полюс). На изображении ниже вершины M+1 в верхнем ряду представляют одну и ту же вершину на северном полюсе - каждая из них будет иметь одинаковое t- значение, но должно иметь разные s-значения для координат текстуры:
Во-вторых, использование этого типа тесселяции приведет к появлению проблем с наложением рядом с полюсами, поскольку небольшое расстояние между соседними фрагментами приводит к большой разнице между s-значениями. Вы должны максимально уменьшить псевдонимы, используя фильтр mipmap. На следующих изображениях показана проекция Меркатора на Землю и текстурированные на сфере вертикальные красные полосы (полосы - хороший тестовый пример):
Лучшая сферическая тесселяция состоит в том, чтобы подразделить икосаэдр, который даст почти экваториальные треугольники. Вот пример нормальной отображаемой сферы, которая избегает этих проблем с наложением: