Ошибка текстурирования на сфере - PullRequest
4 голосов
/ 03 октября 2009

У меня есть ряд сферических координат долготы / широты для точек на сфере, которые мне нужно визуализировать. Для этого я преобразовал точки в декартовы координаты и построил сетку из треугольников, которую я могу визуализировать с помощью VTK. Пока работает.

Теперь я хочу использовать текстуру для модели сферы. Поэтому я преобразовал сферические координаты в текстурные координаты и назначил их каждой точке. Это работает для большинства поверхностных треугольников сферы, и результат выглядит приемлемым.

Но для треугольников на противоположной стороне основного меридиана, где оборачивается текстура, треугольники текстурированы неправильно: вместо того, чтобы повторять текстуру и отображать «поверх границы текстуры», вся текстура выдавливается на единый треугольник.

Вот изображение того, как это выглядит:

image

Линия zick-zack явно неправильная, вместо нее должна быть видна синяя линия. Вся текстура нанесена на треугольники, в результате чего появляются красные и белые полосы. Это имеет смысл, поскольку для рассматриваемых треугольников координаты текстуры охватывают все пространство текстуры.

Чтобы проиллюстрировать эту проблему, которая относится не только к сферам, но и ко всем закрытым объектам, я создал следующий рисунок:

texture-seam

В верхнем прямоугольнике мы видим треугольник, который охватывает границы текстуры с вычисленными координатами текстуры A, B и C. Поскольку текстуру можно разбить на мозаику, я бы хотел, чтобы треугольник отображался.

Нижний треугольник показывает, как координаты текстуры интерпретируются в настоящее время. Координаты ребер A, B и C совпадают, но на этот раз большая часть текстуры используется для треугольника, а не для наложения текстуры на границах.

Я уверен, что я совершил довольно распространенную ошибку, но пока не нашел ничего, что могло бы мне помочь. Есть намеки на меня?

Ответы [ 3 ]

5 голосов
/ 05 октября 2009

Ответ очень прост, вам нужно нанести на карту ваши координаты текстуры по краю. Реализация зависит от вашего набора данных, но вот проблема в этом.

В компьютерной графике координаты текстур хранятся на гранях, а не на вершинах, и ваша проблема показывает причину. Когда вы накладываете текстуру на сферу, скажем, за 10 шагов вы начинаете с 0.0, затем продолжаете с шагом 0.1. Если вы идете с текстурными координатами вдоль основного меридиана, вы получите грани с текстурными координатами 0,9 и 0,0. Графическое оборудование выполняет то, что ему говорят, и интерполирует текстуру между 0.0 и 0.9.

Для решения вашей проблемы вам нужно наложить текстуру от 0,9 до 1,0.

Если вы можете, создайте полигоны таким образом или дублируйте нарушающие вершины с другими координатами текстуры.

2 голосов
/ 05 октября 2009

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

Лучше всего использовать атлас. «Атлас» - это параметризация поверхности на несколько «диаграмм», каждая из которых является связанной областью. Например, вы можете отобразить сферу примерно на 6 диаграмм, которые соответствуют сторонам куба, и каждая диаграмма будет намного лучше сохранять форму части сферы. Вы можете гуглить для параметризации нескольких графиков или что-то в этом роде. DirectX имеет встроенную генерацию UVAtlas, если вы хотите пойти по этому пути. Вопрос о том, что делать на стыках между диаграммами, на самом деле проще, поскольку треугольники всегда находятся внутри одной диаграммы, и это совершенно другая проблема.

Тем не менее, чтобы справиться со швами в вашем случае, вам нужно знать, какие треугольные ребра (сферической) сетки пересекают границы (меридиан или что-то еще). Затем вам нужно будет разбить треугольники, падающие на эти ребра, на части, которые не пересекают границу, и правильно применить координаты текстуры.

1 голос
/ 21 сентября 2017

Отвечая на очень старый вопрос, потому что я думаю, что есть более простой ответ, используя встроенный метод vtk's vtkSphereSource.

Вы хотите "разбить" сферу, чтобы не получить текстурную интерполяцию между 0,9 и 0,0 вокруг сферы. В python, вызовите sphere.SetEndTheta(360 - 1.e-4), который, по сути, вытащит крошечный кусочек из сферы. Это дает вам конечный набор вершин для текстуры для отображения на всем пути к 1.0.

...