better fpscontrols
This commit is contained in:
parent
0497ff9ac7
commit
e43a73d316
@ -14,12 +14,12 @@ type FPSControls struct {
|
|||||||
position mgl32.Vec3
|
position mgl32.Vec3
|
||||||
rotation mgl32.Vec2
|
rotation mgl32.Vec2
|
||||||
|
|
||||||
currentMove mgl32.Vec3
|
|
||||||
currentLook mgl32.Vec2
|
|
||||||
lastMousePos mgl32.Vec2
|
lastMousePos mgl32.Vec2
|
||||||
|
|
||||||
view mgl32.Mat4
|
view mgl32.Mat4
|
||||||
|
|
||||||
|
window *glfw.Window
|
||||||
|
|
||||||
lastTime float64
|
lastTime float64
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -28,19 +28,54 @@ var instance *FPSControls
|
|||||||
func (c *FPSControls) Update() {
|
func (c *FPSControls) Update() {
|
||||||
time := glfw.GetTime()
|
time := glfw.GetTime()
|
||||||
|
|
||||||
deltaTime := time - c.lastTime
|
var deltaTime float32 = float32(time - c.lastTime)
|
||||||
c.lastTime = time
|
c.lastTime = time
|
||||||
|
|
||||||
forward, right, up := c.directions()
|
_, right, _ := c.directions()
|
||||||
|
|
||||||
globalUp := mgl32.Vec3{0, 1, 0}
|
globalUp := mgl32.Vec3{0, 1, 0}
|
||||||
move := right.Mul(c.currentMove.X()).Add(globalUp.Mul(c.currentMove.Y())).Add(forward.Mul(c.currentMove.Z()))
|
|
||||||
c.position = c.position.Add(move.Mul(float32(deltaTime) * c.moveSpeed))
|
|
||||||
|
|
||||||
c.rotation = c.rotation.Add(c.currentLook.Mul(float32(deltaTime) * c.lookSpeed))
|
move := mgl32.Vec3{0, 0, 0}
|
||||||
c.currentLook = mgl32.Vec2{}
|
|
||||||
c.view = mgl32.LookAtV(c.position, c.position.Add(forward), up)
|
|
||||||
|
|
||||||
|
if c.window.GetKey(glfw.KeyA) == glfw.Press {
|
||||||
|
move[0] += 1
|
||||||
|
}
|
||||||
|
if c.window.GetKey(glfw.KeyD) == glfw.Press {
|
||||||
|
move[0] -= 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.window.GetKey(glfw.KeySpace) == glfw.Press {
|
||||||
|
move[1] += 1
|
||||||
|
}
|
||||||
|
if c.window.GetKey(glfw.KeyLeftShift) == glfw.Press {
|
||||||
|
move[1] -= 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.window.GetKey(glfw.KeyW) == glfw.Press {
|
||||||
|
move[2] += 1
|
||||||
|
}
|
||||||
|
if c.window.GetKey(glfw.KeyS) == glfw.Press {
|
||||||
|
move[2] -= 1
|
||||||
|
}
|
||||||
|
|
||||||
|
move = right.Mul(move.X()).Add(globalUp.Mul(move.Y())).Add(right.Cross(globalUp).Mul(move.Z()))
|
||||||
|
c.position = c.position.Add(move.Mul(deltaTime * c.moveSpeed))
|
||||||
|
|
||||||
|
x, y := c.window.GetCursorPos()
|
||||||
|
look := mgl32.Vec2{
|
||||||
|
float32(y) - c.lastMousePos.X(),
|
||||||
|
c.lastMousePos.Y() - float32(x),
|
||||||
|
}.Mul(deltaTime * c.lookSpeed)
|
||||||
|
|
||||||
|
c.rotation = c.rotation.Add(look)
|
||||||
|
c.rotation = mgl32.Vec2{
|
||||||
|
min(max(-89.9, c.rotation.X()), 89.9),
|
||||||
|
float32(int32(c.rotation.Y())%360) + c.rotation.Y() - float32(int32(c.rotation.Y())),
|
||||||
|
}
|
||||||
|
c.lastMousePos[0] = float32(y)
|
||||||
|
c.lastMousePos[1] = float32(x)
|
||||||
|
|
||||||
|
forward, _, _ := c.directions()
|
||||||
|
c.view = mgl32.LookAtV(c.position, c.position.Add(forward), globalUp)
|
||||||
}
|
}
|
||||||
|
|
||||||
func Get(lookSpeed, moveSpeed float32, position mgl32.Vec3, rotation mgl32.Vec2, window *glfw.Window) *FPSControls {
|
func Get(lookSpeed, moveSpeed float32, position mgl32.Vec3, rotation mgl32.Vec2, window *glfw.Window) *FPSControls {
|
||||||
@ -53,43 +88,9 @@ func Get(lookSpeed, moveSpeed float32, position mgl32.Vec3, rotation mgl32.Vec2,
|
|||||||
lookSpeed: lookSpeed,
|
lookSpeed: lookSpeed,
|
||||||
position: position,
|
position: position,
|
||||||
rotation: rotation,
|
rotation: rotation,
|
||||||
|
window: window,
|
||||||
}
|
}
|
||||||
|
|
||||||
window.SetKeyCallback(func(window *glfw.Window, key glfw.Key, scancode int, action glfw.Action, mods glfw.ModifierKey) {
|
|
||||||
var val float32
|
|
||||||
|
|
||||||
switch action {
|
|
||||||
case glfw.Repeat:
|
|
||||||
return
|
|
||||||
case glfw.Press:
|
|
||||||
val = 1
|
|
||||||
case glfw.Release:
|
|
||||||
val = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
switch key {
|
|
||||||
case glfw.KeyW:
|
|
||||||
instance.currentMove[2] = val
|
|
||||||
case glfw.KeyS:
|
|
||||||
instance.currentMove[2] = -val
|
|
||||||
case glfw.KeyA:
|
|
||||||
instance.currentMove[0] = val
|
|
||||||
case glfw.KeyD:
|
|
||||||
instance.currentMove[0] = -val
|
|
||||||
case glfw.KeySpace:
|
|
||||||
instance.currentMove[1] = val
|
|
||||||
case glfw.KeyLeftShift:
|
|
||||||
instance.currentMove[1] = -val
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
window.SetCursorPosCallback(func(window *glfw.Window, y float64, x float64) {
|
|
||||||
pos := mgl32.Vec2{float32(x), float32(y)}
|
|
||||||
instance.currentLook = instance.lastMousePos.Sub(pos)
|
|
||||||
instance.currentLook[0] *= -1
|
|
||||||
instance.lastMousePos = pos
|
|
||||||
})
|
|
||||||
|
|
||||||
window.SetInputMode(glfw.CursorMode, glfw.CursorDisabled)
|
window.SetInputMode(glfw.CursorMode, glfw.CursorDisabled)
|
||||||
|
|
||||||
return instance
|
return instance
|
||||||
|
Loading…
Reference in New Issue
Block a user