Получить 2D-координату из 3D-точки на 3D-плоскости

У меня есть точка (x, y, z), которая находится на плоскости, определяемой ax+by+cz+d=0. Я пытаюсь выяснить, что (x', y') относительно плоскости, где она имеет начальную точку (x0, y0, z0), а ось x' определяется (1,0) и ось y' определяется (0,1).

Моя главная цель - щелкнуть мышью по поверхности и узнать 2D-координаты на конкретной поверхности. Мне удалось довольно тривиально пересечь луч на плоскости.

В качестве примечания: я использую DirectX 9 — мое знакомство с матричной/векторной математикой ограничено API-интерфейсами, предоставленными мне через библиотеки D3DX.

Одна мысль, которая у меня была, заключалась в том, чтобы использовать угол между одним из векторов осей и найти расстояние от начала координат, а также вычислить x/y с помощью простого триггера. Но я не уверен, действительно ли это идеальное решение или нет, и действительно ли оно может решить проблему.


person Mike Weir    schedule 22.05.2013    source источник
comment
Определение осей неясно, так как для них используются 2d-координаты. Вы должны каким-то образом связать эти оси с вашей трехмерной средой или указать, что вас не волнует ориентация этих осей относительно их окружения.   -  person MvG    schedule 23.05.2013
comment
@MvG Я думаю, что контекст моей цели проясняет, чего я пытаюсь достичь, и какое значение имеют мои оси.   -  person Mike Weir    schedule 23.05.2013
comment
Если бы мне это было понятно, я бы не спрашивал… А поскольку ваш комментарий тоже ничего не прояснил, боюсь, я не могу помочь с этим.   -  person MvG    schedule 23.05.2013
comment
@MvG Извините, я подумал, что вы могли это пропустить. Представьте себе 2D-изображение на 3D-плоскости. Когда я нажимаю на пиксель на экране, я хотел бы знать координаты x, y этого 2D-изображения. У меня есть 3D-координата на плоскости (я уже спроецировал луч и сделал пересечение на плоскости) - я пытаюсь получить 2D-координату изображения с 3D-плоскости, которую я сделал. пересечение с.   -  person Mike Weir    schedule 23.05.2013


Ответы (1)


Поскольку у вас есть 2D-изображение на этой плоскости, вы, очевидно, хотите сопоставить его систему координат. Для этого определите единичные векторы изображения. То есть возьмите трехмерные координаты B для позиции изображения (x,0) для любого x>0 и вычтите из них трехмерные координаты A для начала координат (0 ,0) изображения. Результирующий вектор B − A будет описывать положительное направление x вашего изображения. Сделайте то же самое для направления y. Затем нормализуйте оба этих вектора. Это означает их деление на длину, sqrt(x²+y²+z²), но в D3Dx есть функция D3DXVec3Normalize для этого. Назовем получившиеся трехмерные векторы X и Y. Чтобы вычислить координаты x и y любой 3D-точки p, просто вычтите начало координат A из p, т.е. вычислить вектор p − A. Затем вычислите скалярное произведение между результатом и единичными векторами X и Y. Это даст вам два числа: желаемые координаты. Это связано с тем, что скалярное произведение можно использовать для вычисления ортогональной проекции.

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

D3DXVECTOR3 *p;                  // input point
D3DXVECTOR3 a, b, c, ab, ac, ap; // helper vectors
FLOAT x, y;                      // output coordinates
imagePosTo3D(&a, 0, 0);          // a = origin of image
imagePosTo3D(&b, 1, 0);          // b = anywhere on positive x axis, perhaps a corner
imagePosTo3D(&c, 0, 1);          // c = anywhere on positive y axis, perhaps a corner
D3DXVec3Subtract(&ab, &b, &a);   // ab = b - a
D3DXVec3Subtract(&ac, &c, &a);   // ac = c - a
D3DXVec3Normalize(&ab, &ab);     // ab = ab / |ab|
D3DXVec3Normalize(&ac, &ac);     // ac = ac / |ac|
// the above has to be done once for the image, the code below for every p
D3DXVec3Subtract(&ap, p, &a);    // ap = p - a
x = D3DXVec3Dot(&ab, &ap);       // x = ab∙ap
y = D3DXVec3Dot(&ac, &ap);       // y = ac∙ap
person MvG    schedule 22.05.2013
comment
Как я уже упоминал, мои математические способности не совсем то, что вы ожидаете... Не могли бы вы предоставить больше конкретики/примеров или что-то в этом роде? - person Mike Weir; 24.05.2013