Finish lua camera controller implementation
This commit is contained in:
@@ -1,3 +1,10 @@
|
||||
TRANSLATE_SPEED = 2.5
|
||||
ROTATE_SPEED = 90.0
|
||||
ZOOM_SENSITIVITY = 2.5
|
||||
MOUSE_SENSITIVITY = 0.25
|
||||
NEAR_PLANE = 0.1
|
||||
FAR_PLANE = 100.0
|
||||
|
||||
LuaScript = {
|
||||
|
||||
camera = nil,
|
||||
@@ -11,22 +18,128 @@ LuaScript = {
|
||||
end,
|
||||
|
||||
update = function(self, deltaTime)
|
||||
self.camera = GetComponent("CameraComponent")
|
||||
LuaScript:updateOrthographic(deltaTime)
|
||||
LuaScript:updatePerspective(deltaTime)
|
||||
self.camera = getCameraComponent()
|
||||
|
||||
local tmp = self.camera.fov
|
||||
self.camera.fov = 30.0
|
||||
|
||||
--
|
||||
if self.camera.type == CameraType.Orthographic then
|
||||
LuaScript:updateOrthographic(deltaTime)
|
||||
elseif self.camera.type == CameraType.Perspective then
|
||||
LuaScript:updatePerspective(deltaTime)
|
||||
end
|
||||
end,
|
||||
|
||||
updateOrthographic = function(self, deltaTime)
|
||||
--
|
||||
|
||||
-- Update camera rotation
|
||||
|
||||
cameraRotateSpeed = ROTATE_SPEED * deltaTime
|
||||
|
||||
if Input.isKeyPressed(keyCode("GLFW_KEY_Q")) then
|
||||
self.transform.rotate.z = self.transform.rotate.z - cameraRotateSpeed
|
||||
end
|
||||
if Input.isKeyPressed(keyCode("GLFW_KEY_E")) then
|
||||
self.transform.rotate.z = self.transform.rotate.z + cameraRotateSpeed
|
||||
end
|
||||
|
||||
if self.transform.rotate.z > 180.0 then
|
||||
self.transform.rotate.z = self.transform.rotate.z - 360.0
|
||||
elseif self.transform.rotate.z <= -180.0 then
|
||||
self.transform.rotate.z = self.transform.rotate.z + 360.0
|
||||
end
|
||||
|
||||
-- Update camera translation
|
||||
|
||||
cameraTranslateSpeed = TRANSLATE_SPEED * deltaTime
|
||||
|
||||
-- WASD movement
|
||||
if Input.isKeyPressed(keyCode("GLFW_KEY_W")) then
|
||||
self.transform.translate.x = self.transform.translate.x + -math.sin(glm.radians(self.transform.rotate.z)) * cameraTranslateSpeed;
|
||||
self.transform.translate.y = self.transform.translate.y + math.cos(glm.radians(self.transform.rotate.z)) * cameraTranslateSpeed;
|
||||
end
|
||||
if Input.isKeyPressed(keyCode("GLFW_KEY_S")) then
|
||||
self.transform.translate.x = self.transform.translate.x - -math.sin(glm.radians(self.transform.rotate.z)) * cameraTranslateSpeed;
|
||||
self.transform.translate.y = self.transform.translate.y - math.cos(glm.radians(self.transform.rotate.z)) * cameraTranslateSpeed;
|
||||
end
|
||||
if Input.isKeyPressed(keyCode("GLFW_KEY_A")) then
|
||||
self.transform.translate.x = self.transform.translate.x - math.cos(glm.radians(self.transform.rotate.z)) * cameraTranslateSpeed;
|
||||
self.transform.translate.y = self.transform.translate.y - math.sin(glm.radians(self.transform.rotate.z)) * cameraTranslateSpeed;
|
||||
end
|
||||
if Input.isKeyPressed(keyCode("GLFW_KEY_D")) then
|
||||
self.transform.translate.x = self.transform.translate.x + math.cos(glm.radians(self.transform.rotate.z)) * cameraTranslateSpeed;
|
||||
self.transform.translate.y = self.transform.translate.y + math.sin(glm.radians(self.transform.rotate.z)) * cameraTranslateSpeed;
|
||||
end
|
||||
|
||||
-- Update camera zoom
|
||||
|
||||
zoomSpeed = ZOOM_SENSITIVITY * deltaTime;
|
||||
|
||||
if Input.isKeyPressed(keyCode("GLFW_KEY_EQUAL")) then
|
||||
self.camera.zoomLevel = self.camera.zoomLevel - zoomSpeed
|
||||
end
|
||||
if Input.isKeyPressed(keyCode("GLFW_KEY_MINUS")) then
|
||||
self.camera.zoomLevel = self.camera.zoomLevel + zoomSpeed
|
||||
end
|
||||
self.camera.zoomLevel = math.max(self.camera.zoomLevel, 0.25);
|
||||
self.camera.zoomLevel = math.min(self.camera.zoomLevel, 10.0);
|
||||
|
||||
end,
|
||||
|
||||
updatePerspective = function(self, deltaTime)
|
||||
--
|
||||
|
||||
-- Get mouse movement offset compared to last frame
|
||||
xOffset = Input.getXOffset() * MOUSE_SENSITIVITY;
|
||||
yOffset = Input.getYOffset() * MOUSE_SENSITIVITY;
|
||||
self.camera.yaw = self.camera.yaw + xOffset;
|
||||
self.camera.pitch = self.camera.pitch + yOffset;
|
||||
|
||||
-- Prevent gimbal lock
|
||||
if self.camera.pitch > 89.0 then self.camera.pitch = 89.0 end
|
||||
if self.camera.pitch < -89.0 then self.camera.pitch = -89.0 end
|
||||
|
||||
-- Update camera rotation, by calculating direction vector via yaw and pitch
|
||||
|
||||
self.transform.rotate = glm.vec3(
|
||||
math.cos(glm.radians(self.camera.pitch)) * math.cos(glm.radians(self.camera.yaw)),
|
||||
math.sin(glm.radians(self.camera.pitch)),
|
||||
math.cos(glm.radians(self.camera.pitch)) * math.sin(glm.radians(self.camera.yaw))
|
||||
)
|
||||
self.transform.rotate = glm.normalize(self.transform.rotate)
|
||||
-- The direction vector is based on
|
||||
-- Camera direction (z): normalize(position - target)
|
||||
-- Right axis (x): normalize(cross(up, direction))
|
||||
-- Up axis (y): cross(direction, right)
|
||||
|
||||
-- Source: https://learnopengl.com/img/getting-started/camera_axes.png
|
||||
|
||||
-- Cross = combination of two vectors in 3D space,
|
||||
-- where result is always perpendicular to both of the vectors
|
||||
|
||||
-- Update camera translation
|
||||
|
||||
cameraSpeed = TRANSLATE_SPEED * deltaTime
|
||||
|
||||
-- WASD movement
|
||||
if Input.isKeyPressed(keyCode("GLFW_KEY_W")) then
|
||||
self.transform.translate = glm.vec3( self.transform.translate + cameraSpeed * self.transform.rotate )
|
||||
end
|
||||
if Input.isKeyPressed(keyCode("GLFW_KEY_S")) then
|
||||
self.transform.translate = glm.vec3( self.transform.translate - cameraSpeed * self.transform.rotate )
|
||||
end
|
||||
if Input.isKeyPressed(keyCode("GLFW_KEY_A")) then
|
||||
self.transform.translate = glm.vec3( self.transform.translate -
|
||||
glm.normalize(glm.cross(self.transform.rotate, self.camera.up)) * cameraSpeed )
|
||||
end
|
||||
if Input.isKeyPressed(keyCode("GLFW_KEY_D")) then
|
||||
self.transform.translate = glm.vec3( self.transform.translate +
|
||||
glm.normalize(glm.cross(self.transform.rotate, self.camera.up)) * cameraSpeed )
|
||||
end
|
||||
-- Up / down movement
|
||||
if Input.isKeyPressed(keyCode("GLFW_KEY_SPACE")) then
|
||||
self.transform.translate = glm.vec3( self.transform.translate.x, self.transform.translate.y + cameraSpeed, self.transform.translate.z )
|
||||
end
|
||||
if Input.isKeyPressed(keyCode("GLFW_KEY_LEFT_SHIFT")) then
|
||||
self.transform.translate = glm.vec3( self.transform.translate.x, self.transform.translate.y - cameraSpeed, self.transform.translate.z )
|
||||
end
|
||||
|
||||
end,
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user