Как мога да конвертирам 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