I think I found a bug in init(eye:, center:, up:) of MathLibrary.swift. It says

```
let W = float4(w.x, w.y, x.z, 1)
```

but the third argument should be w.z rather than x.z.

This fix alone seems not address the look-at transformation, though…

Ken

I think I found a bug in init(eye:, center:, up:) of MathLibrary.swift. It says

```
let W = float4(w.x, w.y, x.z, 1)
```

but the third argument should be w.z rather than x.z.

This fix alone seems not address the look-at transformation, though…

Ken

@kwakita - the `lookAt`

matrix is back-to-front. It’s used only twice in the book I think, for shadows, and the code there compensates for it being back-to-front by negating the eye position before calling it.

Try this `lookAt`

matrix:

```
init(eye: float3, center: float3, up: float3) {
let z = normalize(center - eye)
let x = normalize(cross(up, z))
let y = cross(z, x)
let X = float4(x.x, y.x, z.x, 0)
let Y = float4(x.y, y.y, z.y, 0)
let Z = float4(x.z, y.z, z.z, 0)
let W = float4(-dot(x, eye), -dot(y, eye), -dot(z, eye), 1)
self.init()
columns = (X, Y, Z, W)
}
```

For further insight about `viewMatrix`

and various camera matrices, check out: https://www.3dgep.com/understanding-the-view-matrix/ - although be aware that he is using a right handed coordinate system.

(And while it’s not relevant here, OpenGL uses NDC coordinates of (-1, 1) on the z axis, whereas Metal uses (0, 1) on the z axis.)

1 Like