Как да умножите 2D точка с 4D матрица

Как мога да конвертирам 2D точка (или 3D със Z=0) в 2D точка (където Z се игнорира) с 4D матрица?

Използвам Microsofts Silverlight, за да прожектирам 2D контрола като псевдо 3D с помощта на Matrix3D дефиниция на Matrix3D

Знам първоначалната 2D координата на точка в нетрансформираната контрола и искам 2D позицията на точката след трансформацията.

Silverlight API е оскъден по отношение на 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); това е 3D вектор, определен в хомогенни координати. Умножете 4D вектора по 4D матрицата, като по този начин получавате нов 4D вектор, от който вземате първите 2 компонента.

Ако матрицата указва някакъв вид перспективна проекция, тогава ще трябва да разделите на последния компонент, т.е. ако полученият ви вектор е (x, y, z, w), тогава крайните координати са (x/w, y/ w, z/w). Ако матрицата няма перспективна проекция, тогава 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
Можете ли да ми предоставите 4d матрица, която описва равнина под ъгъл от 45 градуса в Y, където точката на въртене е основата, напр. голяма картина пада от теб. Или сайт, който има способността да генерира такова нещо, бих предпочел да избегна математиката. - person rob; 08.03.2011