Skip to content

Commit

Permalink
Add orbital camera
Browse files Browse the repository at this point in the history
  • Loading branch information
Jhonnyg committed Dec 27, 2022
1 parent c1c792a commit 2c94088
Show file tree
Hide file tree
Showing 7 changed files with 157 additions and 108 deletions.
3 changes: 3 additions & 0 deletions game.project
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,6 @@ bundle_identifier = com.defold.example.basic3d
[library]
include_dirs = vantage

[input]
game_binding = /vantage/vantage.input_bindingc

28 changes: 0 additions & 28 deletions input/game.input_binding

This file was deleted.

24 changes: 23 additions & 1 deletion main/main.collection
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ embedded_instances {
" z: 0.0\n"
" w: 1.0\n"
" }\n"
" property_decls {\n"
" }\n"
"}\n"
"components {\n"
" id: \"main\"\n"
Expand All @@ -31,6 +33,8 @@ embedded_instances {
" z: 0.0\n"
" w: 1.0\n"
" }\n"
" property_decls {\n"
" }\n"
"}\n"
"components {\n"
" id: \"quad\"\n"
Expand All @@ -46,6 +50,8 @@ embedded_instances {
" z: 0.0\n"
" w: 1.0\n"
" }\n"
" property_decls {\n"
" }\n"
"}\n"
"components {\n"
" id: \"sphere\"\n"
Expand All @@ -61,10 +67,12 @@ embedded_instances {
" z: 0.0\n"
" w: 1.0\n"
" }\n"
" property_decls {\n"
" }\n"
"}\n"
""
position {
x: 0.0
x: -1.53
y: 0.0
z: 0.0
}
Expand Down Expand Up @@ -96,6 +104,18 @@ embedded_instances {
" z: 0.0\n"
" w: 1.0\n"
" }\n"
" properties {\n"
" id: \"orbital_camera\"\n"
" value: \"true\"\n"
" type: PROPERTY_TYPE_BOOLEAN\n"
" }\n"
" properties {\n"
" id: \"movement_speed\"\n"
" value: \"0.1\"\n"
" type: PROPERTY_TYPE_NUMBER\n"
" }\n"
" property_decls {\n"
" }\n"
"}\n"
"embedded_components {\n"
" id: \"camera\"\n"
Expand All @@ -105,6 +125,8 @@ embedded_instances {
"near_z: 0.1\\n"
"far_z: 1000.0\\n"
"auto_aspect_ratio: 1\\n"
"orthographic_projection: 0\\n"
"orthographic_zoom: 1.0\\n"
"\"\n"
" position {\n"
" x: 0.0\n"
Expand Down
5 changes: 0 additions & 5 deletions main/main.script
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,6 @@ function init(self)
msg.post("@render:", "use_camera_projection")
msg.post("camera", "acquire_camera_focus")

-- rotate the cube
go.animate(".", "euler.z", go.PLAYBACK_LOOP_FORWARD, 360, go.EASING_INOUTQUAD, 6)
go.animate(".", "euler.x", go.PLAYBACK_LOOP_FORWARD, 360, go.EASING_INOUTQUAD, 9)
go.animate(".", "euler.y", go.PLAYBACK_LOOP_FORWARD, 360, go.EASING_INOUTQUAD, 12)

-- tint the cube and the sphere
model.set_constant("#cube", "tint", vmath.vector4(1,1,0,1))
model.set_constant("#sphere", "tint", vmath.vector4(1,0,0,1))
Expand Down
8 changes: 8 additions & 0 deletions vantage/vantage.input_binding
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,11 @@ mouse_trigger {
input: MOUSE_BUTTON_1
action: "VANTAGE_MOUSE_1"
}
mouse_trigger {
input: MOUSE_BUTTON_2
action: "VANTAGE_MOUSE_2"
}
mouse_trigger {
input: MOUSE_BUTTON_3
action: "VANTAGE_MOUSE_3"
}
98 changes: 24 additions & 74 deletions vantage/vantage_component.script
Original file line number Diff line number Diff line change
@@ -1,102 +1,52 @@
local vantage = require 'vantage.vantage_core'

go.property("orbital_camera", false)
go.property("movement_speed", 20)
go.property("rotation_speed", 0.25)
go.property("zoom", 5)

local function make_camera(id)
return {
local function make_camera(id, type)
local camera = {
id = id,
forward = 0,
sidestep = 0,
up = 0,
yaw = 0,
pitch = 0,
zoom = 0,
zoom_offset = 0,
movement_speed = 0,
rotation_speed = 0,
}
end

function init(self)
msg.post(".", "acquire_input_focus")
self.camera = make_camera("#vantage_component")
end

local function move_forward(camera)
camera.forward = camera.forward - camera.movement_speed
end

local function move_backward(camera)
camera.forward = camera.forward + camera.movement_speed
end

local function move_up(camera)
camera.up = camera.up + camera.movement_speed
end

local function move_down(camera)
camera.up = camera.up - camera.movement_speed
end
if type == vantage.VANTAGE_TYPE_WASD then
camera.on_input = vantage.wasd.on_input
camera.on_update = vantage.wasd.on_update
elseif type == vantage.VANTAGE_TYPE_ORBITAL then
camera.on_input = vantage.orbital.on_input
camera.on_update = vantage.orbital.on_update
end

local function strafe_left(camera)
camera.sidestep = camera.sidestep - camera.movement_speed
return camera
end

local function strafe_right(camera)
camera.sidestep = camera.sidestep + camera.movement_speed
end
function init(self)
msg.post(".", "acquire_input_focus")

local function rotate(camera, yaw, pitch)
camera.yaw = camera.yaw - yaw * camera.rotation_speed
camera.pitch = camera.pitch + pitch * camera.rotation_speed
if self.orbital_camera then
self.camera = make_camera("#vantage_component", vantage.VANTAGE_TYPE_ORBITAL)
else
self.camera = make_camera("#vantage_component", vantage.VANTAGE_TYPE_WASD)
end
end

function update(self, dt)
self.camera.movement_speed = self.movement_speed
self.camera.rotation_speed = self.rotation_speed

local main_camera = self.camera.id
local main_camera_position = go.get_world_position(main_camera)
local forward_vec = vmath.vector3(0,0,1)
local side_vec = vmath.vector3(1, 0, 0)

local camera_yaw = vmath.quat_rotation_y(math.rad(self.camera.yaw))
local camera_pitch = vmath.quat_rotation_x(math.rad(self.camera.pitch))
local camera_rot = camera_yaw * camera_pitch

local forward_scaled = self.camera.forward * dt
local sidestep_scaled = self.camera.sidestep * dt
local up_scaled = self.camera.up * dt

forward_vec = vmath.rotate(camera_rot, forward_vec)
forward_vec = forward_vec * forward_scaled

side_vec = vmath.rotate(camera_rot, side_vec)
side_vec = side_vec * sidestep_scaled
local new_pos = main_camera_position + forward_vec + side_vec
new_pos.y = new_pos.y + up_scaled

go.set_position(new_pos, main_camera)
go.set_rotation(camera_rot, main_camera)

self.camera.forward = 0
self.camera.sidestep = 0
self.camera.up = 0
self.camera.zoom = self.zoom
self.camera:on_update(dt)
end

function on_input(self, action_id, action)
if action_id == hash(vantage.VANTAGE_W) then
move_forward(self.camera)
elseif action_id == hash(vantage.VANTAGE_S) then
move_backward(self.camera)
elseif action_id == hash(vantage.VANTAGE_A) then
strafe_left(self.camera)
elseif action_id == hash(vantage.VANTAGE_D) then
strafe_right(self.camera)
elseif action_id == hash(vantage.VANTAGE_Q) then
move_down(self.camera)
elseif action_id == hash(vantage.VANTAGE_E) then
move_up(self.camera)
elseif action_id == hash(vantage.VANTAGE_MOUSE_1) then
rotate(self.camera, action.dx, action.dy)
end
self.camera:on_input(action_id, action)
end
99 changes: 99 additions & 0 deletions vantage/vantage_core.lua
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,104 @@ M.VANTAGE_D = hash("VANTAGE_D")
M.VANTAGE_Q = hash("VANTAGE_Q")
M.VANTAGE_E = hash("VANTAGE_E")
M.VANTAGE_MOUSE_1 = hash("VANTAGE_MOUSE_1")
M.VANTAGE_MOUSE_2 = hash("VANTAGE_MOUSE_2")
M.VANTAGE_MOUSE_3 = hash("VANTAGE_MOUSE_3")

M.VANTAGE_TYPE_WASD = 0
M.VANTAGE_TYPE_ORBITAL = 1

local function move_forward(camera)
camera.forward = camera.forward - camera.movement_speed
end

local function move_backward(camera)
camera.forward = camera.forward + camera.movement_speed
end

local function move_up(camera)
camera.up = camera.up + camera.movement_speed
end

local function move_down(camera)
camera.up = camera.up - camera.movement_speed
end

local function strafe_left(camera)
camera.sidestep = camera.sidestep - camera.movement_speed
end

local function strafe_right(camera)
camera.sidestep = camera.sidestep + camera.movement_speed
end

local function rotate(camera, yaw, pitch)
camera.yaw = camera.yaw - yaw * camera.rotation_speed
camera.pitch = camera.pitch + pitch * camera.rotation_speed
end

M.wasd = {
on_update = function(self, dt)
local main_camera_position = go.get_world_position(self.id)
local forward_vec = vmath.vector3(0,0,1)
local side_vec = vmath.vector3(1, 0, 0)

local camera_yaw = vmath.quat_rotation_y(math.rad(self.yaw))
local camera_pitch = vmath.quat_rotation_x(math.rad(self.pitch))
local camera_rot = camera_yaw * camera_pitch

local forward_scaled = self.forward * dt
local sidestep_scaled = self.sidestep * dt
local up_scaled = self.up * dt

forward_vec = vmath.rotate(camera_rot, forward_vec)
forward_vec = forward_vec * forward_scaled

side_vec = vmath.rotate(camera_rot, side_vec)
side_vec = side_vec * sidestep_scaled
local new_pos = main_camera_position + forward_vec + side_vec
new_pos.y = new_pos.y + up_scaled

go.set_position(new_pos, self.id)
go.set_rotation(camera_rot, self.id)

self.forward = 0
self.sidestep = 0
self.up = 0
end,
on_input = function(self, action_id, action)
if action_id == hash(M.VANTAGE_W) then
move_forward(self)
elseif action_id == hash(M.VANTAGE_S) then
move_backward(self)
elseif action_id == hash(M.VANTAGE_A) then
strafe_left(self)
elseif action_id == hash(M.VANTAGE_D) then
strafe_right(self)
elseif action_id == hash(M.VANTAGE_Q) then
move_down(self)
elseif action_id == hash(M.VANTAGE_E) then
move_up(self)
elseif action_id == hash(M.VANTAGE_MOUSE_1) then
rotate(self, action.dx, action.dy)
end
end
}
M.orbital = {
on_update = function(self, dt)
local camera_yaw = vmath.quat_rotation_y(math.rad(self.yaw))
local camera_pitch = vmath.quat_rotation_x(math.rad(self.pitch))
local camera_rot = camera_yaw * camera_pitch
local camera_position = vmath.rotate(camera_rot, vmath.vector3(0, 0, self.zoom + self.zoom_offset))
go.set_position(camera_position, main_camera)
go.set_rotation(camera_rot, self.id)
end,
on_input = function(self, action_id, action)
if action_id == hash(M.VANTAGE_MOUSE_1) then
rotate(self, action.dx, action.dy)
elseif action_id == hash(M.VANTAGE_MOUSE_2) then
self.zoom_offset = self.zoom_offset + action.dy * self.movement_speed
end
end
}

return M

0 comments on commit 2c94088

Please sign in to comment.