68 lines
1.5 KiB
Go
68 lines
1.5 KiB
Go
package mat4
|
|
|
|
import (
|
|
"zworld/plugin/math"
|
|
"zworld/plugin/math/vec3"
|
|
)
|
|
|
|
// Orthographic generates a left-handed orthographic projection matrix.
|
|
// Outputs depth values in the range [0, 1]
|
|
func Orthographic(left, right, bottom, top, near, far float32) T {
|
|
rml, tmb, fmn := (right - left), (top - bottom), (far - near)
|
|
return T{
|
|
2 / rml, 0, 0, 0,
|
|
0, 2 / tmb, 0, 0,
|
|
0, 0, 1 / fmn, 0,
|
|
(right + left) / rml,
|
|
-(top + bottom) / tmb,
|
|
-near / fmn,
|
|
1,
|
|
}
|
|
}
|
|
|
|
// OrthographicRZ generates a left-handed orthographic projection matrix.
|
|
// Outputs depth values in the range [1, 0] (reverse Z)
|
|
func OrthographicRZ(left, right, bottom, top, near, far float32) T {
|
|
rml, tmb, fmn := (right - left), (top - bottom), (near - far)
|
|
|
|
return T{
|
|
2 / rml, 0, 0, 0,
|
|
0, 2 / tmb, 0, 0,
|
|
0, 0, 1 / fmn, 0,
|
|
-(right + left) / rml,
|
|
-(top + bottom) / tmb,
|
|
near / fmn,
|
|
1,
|
|
}
|
|
}
|
|
|
|
// Perspective generates a left-handed perspective projection matrix with reversed depth.
|
|
// Outputs depth values in the range [0, 1]
|
|
func Perspective(fovy, aspect, near, far float32) T {
|
|
fovy = math.DegToRad(fovy)
|
|
tanHalfFov := math.Tan(fovy) / 2
|
|
|
|
return T{
|
|
1 / (aspect * tanHalfFov), 0, 0, 0,
|
|
0, -1 / tanHalfFov, 0, 0,
|
|
0, 0, far / (far - near), 1,
|
|
0, 0, -(far * near) / (far - near), 0,
|
|
}
|
|
}
|
|
|
|
func LookAt(eye, center, up vec3.T) T {
|
|
f := center.Sub(eye).Normalized()
|
|
r := vec3.Cross(up, f).Normalized()
|
|
u := vec3.Cross(f, r)
|
|
|
|
M := T{
|
|
r.X, u.X, f.X, 0,
|
|
r.Y, u.Y, f.Y, 0,
|
|
r.Z, u.Z, f.Z, 0,
|
|
0, 0, 0, 1,
|
|
}
|
|
|
|
et := Translate(eye.Scaled(-1))
|
|
return M.Mul(&et)
|
|
}
|