Развертывание многоугольника из трехмерного пространства в двухмерное (с использованием треугольников) для координат текстуры

Итак, я создал модель в Ogre3D, и эта модель состоит из ряда треугольников произвольного вращения и положения. Я хотел бы «развернуть» модель, как это делают многие программы моделирования, чтобы все треугольники отображались в 2d (x, y), но размеры треугольников сохранялись. Это для нанесения декалей. Причина, по которой размеры треугольников должны быть сохранены, чтобы при наложении текстуры не было растяжения.

Это было то направление, в котором я думал идти, но у меня возникли проблемы с его визуализацией и достижением правильных алгоритмов:

//Verticies will have a converted bool;

func( triangle x):
     for each of x's vertices:
           map to x,y coordinates if not converted;
           check other triangles for common vertex if so call func(common_tri);

Как только это вернется, будет преобразованная версия всех треугольников, так что все они будут развернуты и размещены на текстуре, где у меня проблема, это сопоставление с пространством x, y. Я не уверен, как преобразовать треугольник в трехмерном пространстве в двухмерное, чтобы он сохранял все свои атрибуты (например, переход от углового обзора к перпедикулярному виду поверхности). Любая помощь будет принята с благодарностью.


person Pete L    schedule 30.01.2011    source источник
comment
Если никто не может вам ответить, вы можете проверить исходный код блендера, УФ-развертка должна быть где-то там. svn.blender.org/svnroot/bf-blender/trunk/blender   -  person Benjamin Lindley    schedule 30.01.2011
comment
Что ж, я смотрел на такие действия в XSI, но ни одно из них даже не достигло того, что я пытался сделать. Они будут зацикливаться, и я хотел бы, чтобы это было просто плоско на материале. Спасибо за предложение.   -  person Pete L    schedule 30.01.2011
comment
Я не уверен, делаете ли вы предположение, что данная вершина отображается в единственную точку в xy. Если модель топологически является сферой, ее отображение на плоскости таким образом невозможно (например, рассмотрим простой куб). Соответственно, если вы хотите избежать растяжения, даже три стороны куба в одной вершине не могут все карты иметь общую вершину на плоскости. Поэтому я думаю, что вам нужно либо обрабатывать каждый треугольник отдельно, либо иметь растяжение, и в последнем случае по крайней мере некоторые вершины потребуют нескольких сопоставлений.   -  person Keith    schedule 01.02.2011
comment
В общем, вы не можете отобразить 3D-поверхность в 2D без каких-либо искажений. См., Например, en.wikipedia.org/wiki/Map_projection. Если вы готовы допустить некоторое искажение, существует множество алгоритмов отображения / разворачивания.   -  person brainjam    schedule 01.02.2011
comment
Перенос треугольника из трехмерного пространства в двумерное пространство не должно приводить к искажению его трех точек, поскольку двумерный треугольник имеет одинаковую площадь, одинаковые углы и длину ребер, он всегда должен быть одинаковым. Я просто не знаю, как это сделать :)   -  person Pete L    schedule 02.02.2011
comment
Один треугольник - да, но вам нужна модель, в которой много треугольников. Хотите ли вы сохранить пространственные отношения без изменений (например: сохранить соединение треугольника со своими соседями)? Если это так, не существует обобщенного отображения из 3D в 2D, которое сохраняло бы геометрию всех соответствующих треугольников.   -  person Ron Warholic    schedule 09.02.2011
comment
@Ron Warholic, справа, и обычная UV-развертка выполняется путем установки швов в вашей сетке, так что вы уменьшаете искажения, вырезая треугольную сетку там, где поверхность очень изогнута.   -  person Aaron H.    schedule 09.02.2011


Ответы (1)


Я бы думал о вершинах как о векторах.

Итак, вы можете нормализовать каждый вектор, затем удалить координату Z, а затем снова применить умножение. т.е. tri = vec1, vec2, vec3, vec1Length = vec1.getLength () newVec1 = vec1.normalize () * vec1Length

Так как это сохранит размер векторов, но отобразит их на 2-мерную плоскость. (или должно быть, я не на 100% считаю, что это математически правильно.)

Другой способ сделать это - представить себе треугольник как 2d плоскость, а затем преобразовать векторы из этого локального пространства в 2d плоскость мирового пространства.

Так, например, мировое происхождение (0,0,0)

сам треугольник представляет собой плоскость, определяемую тремя точками, вы используете один вектор в качестве координаты X, находите вектор, перпендикулярный этому, и вы определяете координату y. Вы также можете определить перекрестное произведение Z на X Y, это даст вам «смещение» от начала координат мира, затем вы можете отобразить их обратно на плоскость 2d, представленную векторами X, Y из начала координат мира (т. Е. (1 , 0) и (0,1)). Для этого должна быть математика во многих книгах по базовой компьютерной графике.

person vantreeseba    schedule 08.02.2011