| 113 | } |
| 114 | |
| 115 | Transform LookAt(const Point &pos, const Point &look, const Vector &up) { |
| 116 | float m[4][4]; |
| 117 | // Initialize fourth column of viewing matrix |
| 118 | m[0][3] = pos.x; |
| 119 | m[1][3] = pos.y; |
| 120 | m[2][3] = pos.z; |
| 121 | m[3][3] = 1; |
| 122 | const Vector dir = Normalize(look - pos); |
| 123 | const Vector right = Normalize(Cross(dir, up)); |
| 124 | const Vector newUp = Cross(right, dir); |
| 125 | m[0][0] = right.x; |
| 126 | m[1][0] = right.y; |
| 127 | m[2][0] = right.z; |
| 128 | m[3][0] = 0.; |
| 129 | m[0][1] = newUp.x; |
| 130 | m[1][1] = newUp.y; |
| 131 | m[2][1] = newUp.z; |
| 132 | m[3][1] = 0.; |
| 133 | m[0][2] = dir.x; |
| 134 | m[1][2] = dir.y; |
| 135 | m[2][2] = dir.z; |
| 136 | m[3][2] = 0.; |
| 137 | const Matrix4x4 camToWorld(m); |
| 138 | return Transform(camToWorld.Inverse(), camToWorld); |
| 139 | } |
| 140 | |
| 141 | bool Transform::HasScale() const { |
| 142 | //#if 0 |