Мы должны решить эту же проблему. Вот как я это делаю:
Назовите точки P и W, поэтому у нас есть P1..P3 и W1..W3
Построить три вектора в каждом пространстве, вот так
A1 = P2-P1
A2 = P3-P1
A3 = A1 x A2
и
B1 = W2-W1
B2 = W3-W1
B3 = B1 x B2
Эти две пары из трех векторов составляют неортогональный базис, и вы хотите найти, как представить свои декартовы оси (x y и z) в одном пространстве, чтобы вы могли найти их в другом. Для этого создайте матрицу так, чтобы ее столбцы были тремя векторами, найденными выше. Затем инвертировать эту матрицу, если эта инверсия не удалась, то неортогональный базис не охватывает пространство, и проблема не может быть решена.
Затем вытащите три столбца из перевернутой матрицы. Эти столбцы являются декартовыми осями с точки зрения вашего неортогонального базиса (V1, V2 и V3). Из этого мы можем восстановить ортогональный базис, который будет служить матрицей преобразования из первого пространства во второе.
Если мы назовем эту матрицу R и обозначим R [строку, столбец] в качестве нашей записи, тогда строки (или столбцы, в зависимости от того, как вы используете матрицу) окончательной матрицы преобразования будут иметь вид:
B1 * R[0,0] + B2* R[1,0] + B3 * R[2,0]
B1 * R[0,1] + B2* R[1,1] + B3 * R[2,1]
B1 * R[0,2] + B2* R[1,2] + B3 * R[2,2]
Теперь, поскольку один из столбцов исходной матрицы до инверсии был пересечением двух других столбцов, возможно, возможно оптимизировать инверсию матрицы. Я не удосужился сделать это - особенно потому, что в нашем случае три точки P1..P3 не меняются, и поэтому инвертированная матрица может быть кэширована.
Этот метод имеет то преимущество, что если у вас есть полуприличная матрица / векторная библиотека, ее очень просто реализовать. И он не использует углы, что всегда хорошо.