camera.lua 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. local flux = require "libs.flux"
  2. local camera = lovr.math.newMat4()
  3. local defaultY = 22
  4. local target = { x = 0, y = defaultY, z = 0 }
  5. local scene = { width = 10, size = 10 }
  6. local far = 555
  7. local near = 222
  8. function loadCamera(sceneImport)
  9. scene = sceneImport
  10. end
  11. function aimCameraXZ(x,y, z)
  12. target.x = x or 0
  13. target.y = y or 0
  14. target.z = z or 0
  15. end
  16. function updateCamera(dt)
  17. flux.update(dt)
  18. camera:identity()
  19. camera:translate(lovr.math.vec3(target.x, 0, target.z))
  20. camera:rotate(math.rad(180), 0, 1, 0)
  21. camera:rotate(math.rad(45), 0, -1, 0)
  22. camera:rotate(math.rad(-60), 1, 0, 0)
  23. camera:translate(lovr.math.vec3(0, target.y, 0))
  24. camera:target(vec3(camera), vec3(target.x, 0, target.z), vec3(0, 1, 0))
  25. end
  26. function drawCamera(pass)
  27. local width, height = lovr.system.getWindowDimensions()
  28. local ratio = width / height
  29. local fov = math.rad(20)
  30. local aspect = ratio
  31. local light_projection = lovr.math.mat4():perspective(fov, aspect,near,far)
  32. pass:setProjection(1, light_projection)
  33. pass:setViewPose(1, camera)
  34. end
  35. function moveCamera(key)
  36. local size = scene.size
  37. local newPos = nil
  38. local distanceFromEdge = 4
  39. if key == "a" or key == "left" then
  40. newPos = { x = -size / 2+distanceFromEdge, y = defaultY, z = -size / 2 +distanceFromEdge}
  41. near =11
  42. far = 35
  43. end
  44. if key == "d" or key == "right" then
  45. newPos = { x = size / 2 -distanceFromEdge, y = defaultY, z = size / 2 -distanceFromEdge }
  46. near = 11
  47. far = 35
  48. end
  49. if key == "w" or key == "up" then
  50. newPos = { x = size / 2 -distanceFromEdge, y = defaultY, z = -size / 2 +distanceFromEdge}
  51. near = 11
  52. far = 35
  53. end
  54. if key == "s" or key == "down" then
  55. newPos = { x = -size / 2 +distanceFromEdge, y = defaultY, z = size / 2 -distanceFromEdge }
  56. near = 11
  57. far = 35
  58. end
  59. if key == "space" then
  60. newPos = { x = 0, y = defaultY, z = 0 }
  61. near = 11
  62. far = 35
  63. end
  64. if key == "q" then
  65. newPos = { x = 0, y = size * 3, z = 0 }
  66. near = 222
  67. far = 555
  68. end
  69. if newPos then
  70. local speed = 44
  71. local distance = vec3(target.x, target.y, target.z):distance(newPos.x,newPos.y,newPos.z)
  72. flux.to(target, speed/distance, newPos)
  73. end
  74. end