Найдите длину одной (s, t) единицы координат текстуры в единицах мирового пространства на плоскости

ОТРЕДАКТИРОВАНО:

У меня есть набор текстурных координат и декартовых координат реального мира («мировое пространство») (в метрах) для формы, и из этих координат я хотел бы найти длину мирового пространства одной единицы каждого из s и t координаты текстуры, когда линия, соответствующая этой длине, ориентирована горизонтально и вертикально соответственно в пространстве текстуры. Но я изо всех сил пытаюсь вычислить это, когда у меня нет хотя бы одного края, ориентированного горизонтально, и одного края, ориентированного вертикально в пространстве текстуры.

По сути, я хотел бы иметь возможность узнать, чему равна 1 s единица в метрах и чему равна 1 t единица в метрах. Чтобы проиллюстрировать это, используя пример формы треугольника - см. ниже список значений координат - я хочу найти длину вертикальных и горизонтальных линий с красными стрелками в метрах...

(Я также хотел бы, чтобы решение работало для любого треугольника или многоугольника, учитывая эквивалентный набор координат)

По сути, я хочу найти длину вертикальных и горизонтальных линий с красными стрелками в метрах

Отображение текстур здесь непараметрическое, все 3D-точки также компланарны, и, следовательно, поверхность можно разворачивать. Отображение в мировом пространстве на плоскости является изометрическим (глобальное масштабирование), поэтому интерполяция в 2D может быть линейной.

(так как я работаю в MATLAB - я накладываю текстуру и хочу иметь возможность преобразовывать любую координату текстуры на моей разрабатываемой поверхности с глобальным масштабированием в декартовы координаты)

В качестве примера у меня есть треугольник с набором текстурных координат (s, t) следующим образом...

ОТРЕДАКТИРОВАННЫЕ ЗНАЧЕНИЯ (дважды):

(1) 1.7942553649452966 0.8511551466745527
(2) 1.756240725743247 0.8674815156738774
(3) 1.730892921329496 0.8328561344213196
(1) 1.7942553649452966 0.8511551466745527

... который имеет соответствующие реальные (декартовы) координаты (x, y, z) с единицами измерения метров ...

ОТРЕДАКТИРОВАННЫЕ ЗНАЧЕНИЯ (дважды):

(1) 660050.0702952344 5868605.033820355 20.442670747055647
(2) 660050.3347344951 5868606.121563466 20.574639679143946
(3) 660050.4376411334 5868606.55473629 19.53932546324279
(1) 660050.0702952344 5868605.033820355 20.442670747055647

К вашему сведению, это от CityGML, который использует метод COLLADA для наложения текстур.

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

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

К вашему сведению, это связано с моим текущим вопросом здесь.

Спасибо


person Jon Slade    schedule 29.10.2016    source источник


Ответы (1)


Я, вероятно, понимаю это неправильно, но здесь идет.

У вас есть треугольник с декартовыми координатами в мировом пространстве и координатами текстуры. Вы хотите найти расстояние в мировом пространстве единицы в каждом измерении текстуры.

Для удобства вершины треугольника A,B,C структурированы:

{p:{x,y,z},s,t} 

Чтобы вычислить расстояние в мировом пространстве единицы T:

Отсортируйте вершины в направлении S — давайте поместим их в массив V[]

Пример: Если B.s < A.s < C.s, то:

V[0] = B
V[1] = A 
V[2] = C 

Найдите дробь вдоль ребра, противоположного V[1], где оно пересекается. (т.е. проецируется в направлении T)

fraction = (V[1].s-V[0].s)/(V[2].s-V[0].s)

Найдите координаты этой точки на ребре с помощью линейной интерполяции между V[0] and V[2] . (интерполировать все скаляры в объекте)

P = (V[0] * (1 - fraction)) + (V[2] * fraction)

Теперь у вас есть конечные точки вертикально выровненного пролета в T, и вы можете найти его длину:

dT = abs(V[1].t - P.t)

И вы можете рассчитать расстояние этого промежутка в мировом пространстве с помощью Пифагора:

dW = distanceBetween(V[1].p, P.p)

Тогда расстояние в мировом пространстве единицы T:

uT = dW/dT

Вы можете сделать то же самое для S, конечно.

EDIT: Подробнее.... введите здесь описание изображения

На изображении выше идея состоит в том, чтобы определить координаты P. Получив это, вы можете определить длину линии V[1]-P в направлении t и в направлении x,y,z, чего достаточно для получения желаемого результата.

Если мы знаем скалярный (0->1) параметр P вдоль линии V[0]V[2] (доля), то мы можем найти все компоненты P(x,y,z,t) посредством линейной интерполяции. Оказывается, этот параметр такой же, как и у компонента S из V[1] по пролету в S из V[0]V[2], показанного красными горизонтальными линиями.

Линейная интерполяция подобна взвешенной смеси. Предположим, что дробь равна 0,33, тогда вы можете добавить:V[2]*0.33 + V[0]*(1 - 0.33), чтобы найти промежуточную точку. Это работает для всех компонентов, потому что линия V[0]V[2] является прямой линией в декартовом пространстве и в текстурном пространстве. Если бы вы сохранили другие значения для этих вершин, например, для цветов вершин в RGBA, вы могли бы интерполировать их таким же образом и узнать значения цвета и альфа-канала в точке P.

person Julian Mann    schedule 01.11.2016
comment
Выглядит хорошо, спасибо: из моих значений я получаю uT 25,55 м и uS 27,54 м; чтобы проверить результаты для каждого ребра, я формирую двумерный прямоугольный треугольник, нахожу длину пространства текстуры противоположного и соседнего (выровненного по осям st), умножаю их на uT или uS, затем использую Пифагор, чтобы получить длину гипотенузы и проверить результат с краем длины, рассчитанные с использованием 3D Pythagoras ... всего один запрос, прежде чем указать ваш ответ, и я, возможно, немного тусклый, извините: почему вы делаете шаг линейной интерполяции таким образом и почему шаг линейной интерполяции работает для все скаляры (s, t, x, y и z)? - person Jon Slade; 04.11.2016
comment
Привет @JonSlade, я обновил ответ диаграммой, которая была у меня в голове :) - person Julian Mann; 04.11.2016
comment
Спасибо, обновлено, как ответили. К вашему сведению, я имел в виду uT (для t) и uT (для s), а не uT и uS - person Jon Slade; 07.11.2016