Как вы написали, матрица преобразования — это матрица перехода от одного базиса к другому. Она может содержать как поворот, так и масштабирование и прочие линейные искажения.
Одно из свойств матрицы преобразования — это то, что её строки являются векторами базиса новой системы координат. То есть, когда вы умножаете матрицу на вектор, вы последовательно умножаете скалярно исходный вектор и строки (вектора базиса), получая исходный вектор в новых координатах. Так как каждое скалярное произведение покажет, сколько того или иного базисного вектора есть в исходном векторе. Чтобы матрица преобразования была ортонормированной (содержать исключительно вращения), она должна состоять из взаимно перпендикулярных и нормализованных векторов.
Итак, строки матрицы у нас — вектора нового базиса в координатах исходного базиса. Надо их найти.
Один из векторов у нас известен — это направление взгляда, нормализуем его и записываем сразу в матрицу (для OpenGL ось взгляда — ось Z, потому записываем наш вектор в третью строку матрицы). Второй вектор ортогонален первому и некоторой примерной линии, направленной вверх. получаем его векторным произведением вектора взгляда и этого вспомогательного вектора. Получаем вектор, направленный вправо (или влево, в зависимости от порядка умножения). После нормализации записываем его в первую строку матрицы (в OpenGL ось X совпадает с осью X экрана и направлена вправо). Оставшийся вектор получаем векторным произведением уже полученных векторов и записываем во вторую строку матрицы (в OpenGL ось Y направлена вверх). Он должен получаться уже нормализованным.
Но есть нюанс. Если вектор взгляда совпадает с вспомогательным вектором вверх, то их векторное произведение будет равно нулю и матрицу посчитать не получится.