This is a simplification of the method to create a look-at or camera matrix from 2017. Based on DirectX documentation, it creates the matrix in one step, without multiplication. The matrix is created transposed for OpenGL. This method takes in a Vector3
Position and Direction.
This matrix doesn't work when looking straight up or down, because in that case the x-axis cross product fails. To solve this, manually set the x-axis in that case.
bool isVertical = direction.X == 0 && direction.Z == 0; var up = new Vector3(0, 1, 0); var zAxis = direction.Normalized(); var xAxis = isVertical ? new Vector3(1, 0, 0) : Vector3.CrossProduct(up, zAxis).Normalized(); var yAxis = Vector3.CrossProduct(zAxis, xAxis); return new Matrix( xAxis.X, xAxis.Y, xAxis.Z, -Vector3.DotProduct(xAxis, position), yAxis.X, yAxis.Y, yAxis.Z, -Vector3.DotProduct(yAxis, position), zAxis.X, zAxis.Y, zAxis.Z, -Vector3.DotProduct(zAxis, position), 0, 0, 0, 1 );