Да, вы можете сделать это, не думая об углах вообще.
Поскольку у вас есть куб, предположим, что вы выбрали один угол, а затем задали 3 ребра, выходящие из него, как векторы f0, f1, f2 (это векторы направления относительно выбранного вами угла). Нормализуйте их и запишите их в виде столбцов в матрице F
(f0x f1x f2x)
(f0y f1y f2y)
(f0z f1z f2z)
Теперь сделайте то же самое для векторов t0, t1, t2 куба, в который вы хотите повернуть, и назовите его матрицей T.
Теперь матрица R = T * Обратная (F) - это матрица, которая поворачивается от ориентации первого куба к ориентации второго (поскольку обратная F отображает, например, f0 в (1 0 0) ', а затем T карты (1 0 0) 'в t0).
Если вы хотите знать, почему это работает, подумайте с точки зрения базисных векторов системы координат: если вы хотите повернуть оси XY и Z в новую систему координат, то столбцы матрицы вращения - это просто нужные вам векторы (1 0 0) ', (0 1 0)' & (0 0 1) 'для сопоставления. T * Inverse (F) эффективно поворачивает ваш куб от его первоначальной ориентации к выровненной оси, а затем к желаемой ориентации.
(Извините, выше для векторов столбцов и преобразований слева, в стиле OpenGL. Кажется, я помню, что Direct3D - это векторы строк и преобразований справа, но должно быть очевидно, как его переключать).
Это также одинаково применимо к матрицам 4x4 с компонентом перевода.