diff --git a/gglm/transform.go b/gglm/transform.go index f8d87e7..070f1c7 100755 --- a/gglm/transform.go +++ b/gglm/transform.go @@ -145,7 +145,29 @@ func NewRotMat(q *Quat) *TrMat { } } -func LookAt(pos, targetPos, worldUp *Vec3) *TrMat { +// LookAtRH does a right-handed coordinate system lookAt (RH is the default for OpenGL). +// Can be used to create the view matrix +func LookAtRH(pos, targetPos, worldUp *Vec3) *TrMat { + + forward := SubVec3(targetPos, pos).Normalize() + right := Cross(forward, worldUp).Normalize() + up := Cross(right, forward) + + return &TrMat{ + Mat4: Mat4{ + Data: [4][4]float32{ + {right.Data[0], up.Data[0], -forward.Data[0], 0}, + {right.Data[1], up.Data[1], -forward.Data[1], 0}, + {right.Data[2], up.Data[2], -forward.Data[2], 0}, + {-DotVec3(pos, right), -DotVec3(pos, up), DotVec3(pos, forward), 1}, + }, + }, + } +} + +// LookAtLH does a left-handed coordinate system lookAt. +// Can be used to create the view matrix +func LookAtLH(pos, targetPos, worldUp *Vec3) *TrMat { forward := SubVec3(targetPos, pos).Normalize() right := Cross(worldUp, forward).Normalize() @@ -157,7 +179,7 @@ func LookAt(pos, targetPos, worldUp *Vec3) *TrMat { {right.Data[0], up.Data[0], forward.Data[0], 0}, {right.Data[1], up.Data[1], forward.Data[1], 0}, {right.Data[2], up.Data[2], forward.Data[2], 0}, - {-DotVec3(pos, right), -DotVec3(pos, up), DotVec3(pos, forward), 1}, + {-DotVec3(pos, right), -DotVec3(pos, up), -DotVec3(pos, forward), 1}, }, }, } diff --git a/main.go b/main.go index ec43f3e..9dd6018 100755 --- a/main.go +++ b/main.go @@ -180,7 +180,7 @@ func main() { camPos := gglm.NewVec3(0, 0, 3) worldUp := gglm.NewVec3(0, 1, 0) targetPos := gglm.NewVec3(0, 0, 0) - viewMat := gglm.LookAt(camPos, targetPos, worldUp) + viewMat := gglm.LookAtRH(camPos, targetPos, worldUp) println(viewMat.String()) //Mat2Col