Как умножить 2D-точку на 4D-матрицу

Как я могу преобразовать точку 2D (или 3D с Z = 0) в точку 2D (где Z игнорируется) с матрицей 4D?

Я использую Microsoft Silverlight для проецирования 2D-элемента управления как псевдо3D с использованием Matrix3D определение Matrix3D

Я знаю начальную 2D-координату точки в непреобразованном элементе управления, и мне нужна 2D-позиция точки после преобразования.

API Silverlight скудно относится к 3D-методам.

Пожалуйста, предложите базовую математику для выполнения расчета.

Это продолжение silverlight конкретный вопрос

Изменить дополнительные сведения

это не работает. я использую

x = x0 * matrix[0][0] + y0 * matrix[1][0] + z0 * matrix[2][0] +
    w0 * matrix[3][0];

y = x0 * matrix[0][1] + y0 * matrix[1][1] + z0 * matrix[2][1] +
    w0 * matrix[3][1];

z = x0 * matrix[0][2] + y0 * matrix[1][2] + z0 * matrix[2][2] +
    w0 * matrix[3][2];

и вход x и y равен 0,0, а результат x, y равен 0, 58,5786, матрица

HasInverse  true    bool
IsIdentity  false   bool
M11 1.0 double
M12 0.0 double
M13 0.0 double
M14 0.0 double
M21 0.0 double
M22 0.70710676908493042 double
M23 0.70710676908493042 double
M24 0.0 double
M31 0.0 double
M32 -0.70710676908493042    double
M33 0.70710676908493042 double
M34 0.0 double
M44 1.0 double
OffsetX 0.0 double
OffsetY 58.578643798828125  double
OffsetZ -141.42135620117187 double

который производит поворот на угол 45 градусов по Z, где точка вращения является нижней частью плоскости.

все значения M1n, включая OffsetX, равны 0,0, в результате чего x всегда является исходным значением.

Что я делаю неправильно ?

Вот мои четыре примера значений с результатами приведенной выше математики.

0, 0, 0, 1 -> 0, 58.5786437988281, -141.421356201172, 1
50, 0, 0, 1 -> 50, 58.5786437988281, -141.421356201172, 1
0, 100, 0, 1 -> 0, 129.289320707321, -70.7106792926788, 1
100, 100, 0, 1 -> 100, 129.289320707321, -70.7106792926788, 1

Глядя на полученное изображение, плоскость 400x400 имеет верхний левый угол 45 135 и верхний правый угол 355 135, нижний левый угол 0,400 и нижний правый угол 400 400.

поэтому для тестового значения 0,0,0,1.0 я бы ожидал, что x и y равны 45 135


person rob    schedule 21.02.2011    source источник


Ответы (2)


Разверните свой 2D-вектор в 4D-вектор - (X, Y, 0, 1); это трехмерный вектор, указанный в однородных координатах. Умножьте 4D-вектор на 4D-матрицу, получив таким образом новый 4D-вектор, из которого вы берете первые 2 компонента.

Если матрица указывает какую-то перспективную проекцию, то вам нужно будет разделить на последний компонент, т.е. если ваш результирующий вектор (x, y, z, w), то окончательные координаты (x/w, y/ ш, з/ш). Если матрица не имеет перспективной проекции, то w = 1, а конечный вектор равен (x, y, z).

person Stefan Dragnev    schedule 23.02.2011

Я не уверен, есть ли для этого ярлык, но вы хотите:

newX = oldx * mat.M11 + oldY * mat.M21 + mat.OffsetX;
newX = oldx * mat.M12 + oldY * mat.M22 + mat.OffsetY;

(при условии, что ваш oldZ равен нулю, и вы собираетесь игнорировать значение newZ).

Изменить: лучший способ сделать это:

Vector3D oldPos(oldx, oldy, 0.0f);
Vector3D newPos = oldPos * matrix;

Ваши новые координаты: newPos.X и newPos.Y;

person Jackson Pope    schedule 21.02.2011
comment
@rob: Каковы значения матрицы? - person Jackson Pope; 03.03.2011
comment
Я опубликовал большой длинный подробный ответ в качестве ответа, так как не видел возможности добавить ответ здесь, и администратор подробно его описал. Было бы неплохо, если бы они могли проверить, был ли я новым пользователем, и вместо того, чтобы просто удалить его, либо оставили для меня примечание, либо добавили его к вопросу. Детали теперь добавлены к исходному вопросу. - person rob; 08.03.2011
comment
@rob, ваша матрица смещается на 58,57 ... в направлении Y (см. OffsetY), поэтому вывод правильный. Как вы генерируете матрицу - похоже, что матрица - это не то, что вы хотите, а не матрица * векторная операция не работает. - person Jackson Pope; 08.03.2011
comment
Я использовал встроенную проекцию Silverlight, а затем взял созданную ею матрицу, но, похоже, проблема в том, что все значения X равны 0. - person rob; 08.03.2011
comment
Можете ли вы предоставить мне 4-мерную матрицу, которая описывает плоскость под углом 45 градусов по оси Y, где точка вращения является основанием, например. большая картина падает от вас. Или сайт, который может генерировать такую ​​вещь, я бы предпочел избежать математики. - person rob; 08.03.2011