Интерполировать точку в 3D-треугольнике в точку в 2D-треугольнике - PullRequest
0 голосов
/ 07 февраля 2012

Может ли кто-нибудь дать мне алгоритм для решения этой проблемы:

Учитывая 3D-треугольник (p0, p1, p2) и 3D-точку внутри / на этом треугольнике (px) и 2D-треугольник (p0 ',p1 ', p2'), функция будет возвращать точку 2D, такую ​​что:

  • если px == p0, затем верните p0 '
  • , если px == p1, затем верните p1'
  • если px == p2, вернуть p2 '

и все, что между ними.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2012

Я понимаю. Любая точка px на плоскости (p0, p1, p2) может быть представлена ​​ BaryCentric координатами a0, a1, a2, такой, что px = a0*p0 + a1*p1 + a2*p2 во всех координатах. Если вам известны значения a0, a1, a2, вы можете применить их к (p0', p1', p2'), чтобы найти px' = a0*p0' + a1*p1' + a2*p2'.

Чтобы получить координаты BaryCentric, вам нужно решить 3x3 систему линейных уравнений

| px[0] |   | p0[0]  p1[0]  p2[0] | | a[0] |
| px[1] | = | p0[1]  p1[1]  p2[1] | | a[1] |
| px[2] |   | p0[2]  p1[2]  p2[1] | | a[2] |

В C решение

d = p0[0]*p1[1]*p2[2]-p0[0]*p1[2]*p2[1]-p0[1]*p1[0]*p2[2]+p0[1]*p1[2]*p2[0]+p0[2]*p1[0]*p2[1]-p0[2]*p1[1]*p2[0];
a0 = (p1[0]*p2[1]*px[2]-p1[0]*p2[2]*px[1]-p1[1]*p2[0]*px[2]+p1[1]*p2[2]*px[0]+p1[2]*p2[0]*px[1]-p1[2]*p2[1]*px[0])/d;
a1 = -(p0[0]*p2[1]*px[2]-p0[0]*p2[2]*px[1]-p0[1]*p2[0]*px[2]+p0[1]*p2[2]*px[0]+p0[2]*p2[0]*px[1]-p0[2]*p2[1]*px[0])/d;
a2 = (p0[0]*p1[1]*px[2]-p0[0]*p1[2]*px[1]-p0[1]*p1[0]*px[2]+p0[1]*p1[2]*px[0]+p0[2]*p1[0]*px[1]-p0[2]*p1[1]*px[0])/d;

С координатами для 2D-точки:

px'[0] = a0*p0'[0] + a1*p1'[0] + a2*p2'[0]
px'[1] = a0*p0'[1] + a1*p1'[1] + a2*p2'[1]
px'[2] = a0*p0'[2] + a1*p1'[2] + a2*p2'[2]
0 голосов
/ 07 февраля 2012

По сути, вы хотите проецировать 3D точку на 2D матрицу, верно?

Есть много ресурсов для этого (проверьте Википедию здесь http://en.wikipedia.org/wiki/3D_projection), но этот http://www.flipcode.com/archives/Plotting_A_3D_Point_On_A_2D_Screen.shtml - хорошее введение!

Редактировать: также эта недавняя статья является очень понятным введением http://creativejs.com/2012/01/day-12-3d-pixel-particles/

...