Это не специфичный для java3D ответ.
В общем случае матрица может быть построена таким образом, чтобы ее описывали 4 вектора.
1) Боковой (или боковой) вектор
2) Вектор вверх
3) Вектор направления
4) Позиция
Каждая строка матрицы 4x4.
Таким образом, для простой единичной матрицы у нас есть следующая матрица (я определю главную матрицу столбца, для основной матрицы строки все, что вам нужно сделать, это поменять местами индексы матрицы так, чтобы строка 2 столбец 3 стала строкой 3 столбца 2 по всей матрице).
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
в этом первом столбце указан боковой вектор. Второй столбец вверх вектор. Третье направление и четвертое положение.
Логически мы можем видеть, что вектор (1, 0, 0, 0) указывает вдоль оси x (и, следовательно, является боковым вектором). Вектор (0, 1, 0, 0) указывает вдоль оси y (и, следовательно, является вектором вверх). Третий (0, 0, 1, 0) указывает вдоль оси Z (и, следовательно, является вектором направления). Четвертый (0, 0, 0, 1) указывает, что объекты не двигаются вообще.
Теперь предположим, что мы хотели повернуться вдоль оси X.
Очевидно, это означало бы, что у нас есть вектор (1, 0, 0, 0) для нашего вектора направления. Вверх по-прежнему будет (0, 1, 0, 0) и положение по-прежнему 0, 0, 0 1. Так, каков будет наш боковой вектор? Ну, логически это будет указывать вдоль оси Z. Но в какую сторону? Хорошо держите пальцы так, чтобы один палец указывал вперед, один в сторону, а другой вверх. Теперь поверните так, чтобы передний палец был направлен в том же направлении, что и боковой указательный палец. В какую сторону указывает указательный палец? Противоположное направление к исходному направлению указывает пальцем. Таким образом, матрица
0 0 1 0
0 1 0 0
-1 0 0 0
0 0 0 1
В этот момент все выглядит немного сложнее. Достаточно просто взять произвольную позицию и произвольную точку, чтобы взглянуть на них (я назову их vPos и vFocus). Достаточно просто сформировать вектор из vPos в vFocus путем вычитания vPos из vFocus (vFocus.x - vPos.x, vFocus.y - vPos.y, vFocus.z - vPos.z, vFocus.w - vPos.w) , Имейте в виду, что все позиции должны быть определены с помощью «1» в позиции «w», где все направления должны иметь «0». Это автоматически выполняется, когда вы выполняете вычитание выше, так как 1 в обоих ws отменит и оставит 0. В любом случае, теперь у нас есть вектор, указывающий из положения в направлении vFocus, мы назовем его vDir. К сожалению, он имеет длину разницы между vPos и vFocus. Однако если мы разделим вектор vDir на его длину (vDir.x / length, vDir.y / length, vDir.z / length, vDir.w / length), то мы нормализуем его и получим направление общей длиной 1.
В этом ponit у нас теперь есть 3-й и 4-й столбцы нашей матрицы. Теперь давайте предположим, что все еще (0, 1, 0, 0) или vUp. Можно предположить, что перекрестное произведение направления и vUp создаст вектор, перпендикулярный (а также единичной длины) плоскости, образованной vDir и vUp. Это дает нам наш боковой вектор или vLat. Теперь ... мы предположили, что вектор повышения, это не совсем правильно. Теперь мы можем точно рассчитать его, взяв перекрестное произведение vLat и vDir, и у нас есть все 4 вектора.
Таким образом, окончательная матрица определяется следующим образом:
vLat.x vUp.x vDir.x vPos.x
vLat.y vUp.y vDir.y vPos.y
vLat.z vUp.z vDir.z vPos.z
vLat.w vUp.w vDir.w vPos.w
Это не совсем полный ответ, так как у вас возникнут проблемы, если вы посмотрите на точку рядом с вашим (0, 1, 0, 0) вектором, но это должно работать для большинства случаев.