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)
 | 
						|
}
 |