// create a look-at rotation matrix public void LookAt(Vector3d dir, Vector3d up) { //Vector3d dir = new Vector3d(direction.x, direction.y, direction.z); //dir.Normalize(); Vector3d vx = up.Cross(dir); vx.Normalize(); Vector3d vy = dir.Cross(vx); vy.Normalize(); Matrix[0, 0] = vx.x; Matrix[0, 1] = vx.y; Matrix[0, 2] = vx.z; Matrix[0, 3] = 0; Matrix[1, 0] = vy.x; Matrix[1, 1] = vy.y; Matrix[1, 2] = vy.z; Matrix[1, 3] = 0; Matrix[2, 0] = dir.x; Matrix[2, 1] = dir.y; Matrix[2, 2] = dir.z; Matrix[2, 3] = 0; Matrix[3, 0] = 0; Matrix[3, 1] = 0; Matrix[3, 2] = 0; Matrix[3, 3] = 1; }