Преобразование координат точки из трехмерного пространства в общую двухмерную плоскость в SlimDX

Мне нужно спроектировать SlimDX.Vector3 (компоненты X, Y и Z) в общей 2D-плоскости (определенной с SlimDX.Plane, с 3 Vector3). Обратите внимание, что плоскость является общей и не является плоскостью экрана (в противном случае можно использовать Vector3.Project). Мне нужно определить Матрицу Транформации (или Кватернион) из трехмерного пространства в двухмерную плоскость, но я не знаю как. Начало плоскости может быть любым, например, первая точка, используемая для определения плоскости.

Кто-нибудь может помочь?

2 ответа

Я думаю, что вы хотите, это разделение точки на плоскости (по нормали), которая дается с

float h = Plane.DotNormal(plane, point);

Затем вычтите это количество вдоль плоскости нормали от точки

Vector3 proj = point - h*plane.Normal;

Полученная точка должна лежать на плоскости.

Ваш вопрос все еще очень неясен. Тем не менее, я пытаюсь выстрел в темноте.

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

Мы можем построить матрицу, найдя изображения принципалов. Происхождение довольно простое. Как вы указали, источник должен быть сопоставлен с первой точкой (v1). Ось Z также проста. Это самолет нормальный. Следовательно, матрица:

    /  .           .           .          . \
M = |  .           .           .          . |
    | p.Normal.X  p.Normal.Y  p.Normal.Z  0 |
    \ v1.X        v1.Y        v1.Z        1 /

Теперь начинается та часть, в которой вашему описанию не хватает информации. Нам нужна локальная ось х на плоскости. Я предполагаю, что эта ось определяется вторым вектором:

Vector3 x = Vector3.Normalize(v2 - v1);

Тогда результирующая локальная ось Y имеет вид:

Vector3 y = Vector3.Normalize(Vector3.Cross(p.Normal, x));

А также:

    / x.X         x.Y         x.Z         0 \
M = | y.X         y.Y         y.Z         0 |
    | p.Normal.X  p.Normal.Y  p.Normal.Z  0 |
    \ v1.X        v1.Y        v1.Z        1 /

Как уже упоминалось, вам нужна эта матрица 'обратная. Следовательно:

       /  x.X     y.X     p.Normal.X  0 \
M^-1 = |  x.Y     y.Y     p.Normal.Y  0 |
       |  x.Z     y.Z     p.Normal.Z  0 |
       \ -v1.X   -v1.Y      -v1.Z     1 /

Более компактно, поскольку вам не нужно третье и четвертое измерения (хотя это может быть не самым удобным представлением для SDX):

       /  x.X     y.X  \
   T = |  x.Y     y.Y  |
       |  x.Z     y.Z  |
       \ -v1.X   -v1.Y /
Другие вопросы по тегам