Во-первых, я НАСТОЯТЕЛЬНО рекомендую просто хранить позицию как вектор отдельно, это значительно облегчит вычисления. В любом случае ...
[x (dot) right, y (dot) up, z (dot) look]
не фактическая матрица представления. Сама матрица имеет вид:
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
где верхняя левая матрица 3x3 представляет повороты, масштаб и т. д. Вся ориентация камеры выполняется там. Оставшаяся строка и столбец используются для перевода и некоторых других сложных перспективных вещей, о которых я сейчас не буду рассказывать.
Когда вы получаете матрицу (при условии, что это матрица 4x4), перевод всегда будет храниться либо в последней строке, либо в последнем столбце, в зависимости от того, является ли ваш класс матрицы упорядочением по главному ряду или по главному столбцу.
Вероятно, вас смущает тот факт, что вам нужны точечные продукты. Происходит упрощение математической математики, в этом вопросе переполнения стека есть более подробные ответы: /programming/349050/calculating-a-lookat-matrix
Решение можно найти здесь , вам нужно взять обратную матрицу и получить перевод этого:
Vector3 ViewTrans = Matrix.Invert(ViewMatrix).Translation;
Position = ViewTrans;