Turn OrbitControls into extension and add key speed modifier
This commit is contained in:
@@ -3,9 +3,11 @@ package org.openrndr.extras.camera
|
|||||||
import org.openrndr.*
|
import org.openrndr.*
|
||||||
import org.openrndr.math.Vector2
|
import org.openrndr.math.Vector2
|
||||||
import org.openrndr.math.Vector3
|
import org.openrndr.math.Vector3
|
||||||
|
import kotlin.math.PI
|
||||||
|
import kotlin.math.abs
|
||||||
|
import kotlin.math.tan
|
||||||
|
|
||||||
class OrbitalControls(val orbitalCamera: OrbitalCamera, val userInteraction: Boolean = true) {
|
class OrbitalControls(val orbitalCamera: OrbitalCamera, val userInteraction: Boolean = true, val keySpeed: Double = 1.0) : Extension {
|
||||||
|
|
||||||
enum class STATE {
|
enum class STATE {
|
||||||
NONE,
|
NONE,
|
||||||
ROTATE,
|
ROTATE,
|
||||||
@@ -13,13 +15,13 @@ class OrbitalControls(val orbitalCamera: OrbitalCamera, val userInteraction: Boo
|
|||||||
}
|
}
|
||||||
|
|
||||||
private var state = STATE.NONE
|
private var state = STATE.NONE
|
||||||
var fov = 90.0
|
var fov = orbitalCamera.fov
|
||||||
|
|
||||||
private lateinit var program: Program
|
private lateinit var program: Program
|
||||||
private lateinit var lastMousePosition: Vector2
|
private lateinit var lastMousePosition: Vector2
|
||||||
|
|
||||||
private fun mouseScrolled(event: MouseEvent) {
|
private fun mouseScrolled(event: MouseEvent) {
|
||||||
if (Math.abs(event.rotation.x) > 0.1) return
|
if (abs(event.rotation.x) > 0.1) return
|
||||||
|
|
||||||
when {
|
when {
|
||||||
event.rotation.y > 0 -> orbitalCamera.dollyIn()
|
event.rotation.y > 0 -> orbitalCamera.dollyIn()
|
||||||
@@ -38,15 +40,15 @@ class OrbitalControls(val orbitalCamera: OrbitalCamera, val userInteraction: Boo
|
|||||||
val offset = Vector3.fromSpherical(orbitalCamera.spherical) - orbitalCamera.lookAt
|
val offset = Vector3.fromSpherical(orbitalCamera.spherical) - orbitalCamera.lookAt
|
||||||
|
|
||||||
// half of the fov is center to top of screen
|
// half of the fov is center to top of screen
|
||||||
val targetDistance = offset.length * Math.tan((fov / 2) * Math.PI / 180)
|
val targetDistance = offset.length * tan((fov / 2) * PI / 180)
|
||||||
val panX = (2 * delta.x * targetDistance / program.window.size.x)
|
val panX = (2 * delta.x * targetDistance / program.window.size.x)
|
||||||
val panY = (2 * delta.y * targetDistance / program.window.size.y)
|
val panY = (2 * delta.y * targetDistance / program.window.size.y)
|
||||||
|
|
||||||
orbitalCamera.pan(panX, -panY, 0.0)
|
orbitalCamera.pan(panX, -panY, 0.0)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
val rotX = 2 * Math.PI * delta.x / program.window.size.x
|
val rotX = 2 * PI * delta.x / program.window.size.x
|
||||||
val rotY = 2 * Math.PI * delta.y / program.window.size.y
|
val rotY = 2 * PI * delta.y / program.window.size.y
|
||||||
orbitalCamera.rotate(rotX, rotY)
|
orbitalCamera.rotate(rotX, rotY)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,55 +77,58 @@ class OrbitalControls(val orbitalCamera: OrbitalCamera, val userInteraction: Boo
|
|||||||
|
|
||||||
fun keyPressed(keyEvent: KeyEvent) {
|
fun keyPressed(keyEvent: KeyEvent) {
|
||||||
if (keyEvent.key == KEY_ARROW_RIGHT) {
|
if (keyEvent.key == KEY_ARROW_RIGHT) {
|
||||||
orbitalCamera.pan(1.0, 0.0, 0.0)
|
orbitalCamera.pan(keySpeed, 0.0, 0.0)
|
||||||
}
|
}
|
||||||
if (keyEvent.key == KEY_ARROW_LEFT) {
|
if (keyEvent.key == KEY_ARROW_LEFT) {
|
||||||
orbitalCamera.pan(-1.0, 0.0, 0.0)
|
orbitalCamera.pan(-keySpeed, 0.0, 0.0)
|
||||||
}
|
}
|
||||||
if (keyEvent.key == KEY_ARROW_UP) {
|
if (keyEvent.key == KEY_ARROW_UP) {
|
||||||
orbitalCamera.pan(0.0, 1.0, 0.0)
|
orbitalCamera.pan(0.0, keySpeed, 0.0)
|
||||||
}
|
}
|
||||||
if (keyEvent.key == KEY_ARROW_DOWN) {
|
if (keyEvent.key == KEY_ARROW_DOWN) {
|
||||||
orbitalCamera.pan(0.0, -1.0, 0.0)
|
orbitalCamera.pan(0.0, -keySpeed, 0.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (keyEvent.name == "q") {
|
if (keyEvent.name == "q") {
|
||||||
orbitalCamera.pan(0.0, -1.0, 0.0)
|
orbitalCamera.pan(0.0, -keySpeed, 0.0)
|
||||||
}
|
}
|
||||||
if (keyEvent.name == "e") {
|
if (keyEvent.name == "e") {
|
||||||
orbitalCamera.pan(0.0, 1.0, 0.0)
|
orbitalCamera.pan(0.0, keySpeed, 0.0)
|
||||||
}
|
}
|
||||||
if (keyEvent.name == "w") {
|
if (keyEvent.name == "w") {
|
||||||
orbitalCamera.pan(0.0, 0.0, -1.0)
|
orbitalCamera.pan(0.0, 0.0, -keySpeed)
|
||||||
}
|
}
|
||||||
if (keyEvent.name == "s") {
|
if (keyEvent.name == "s") {
|
||||||
orbitalCamera.pan(0.0, 0.0, 1.0)
|
orbitalCamera.pan(0.0, 0.0, keySpeed)
|
||||||
}
|
}
|
||||||
if (keyEvent.name == "a") {
|
if (keyEvent.name == "a") {
|
||||||
orbitalCamera.pan(-1.0, 0.0, 0.0)
|
orbitalCamera.pan(-keySpeed, 0.0, 0.0)
|
||||||
}
|
}
|
||||||
if (keyEvent.name == "d") {
|
if (keyEvent.name == "d") {
|
||||||
orbitalCamera.pan(1.0, 0.0, 0.0)
|
orbitalCamera.pan(keySpeed, 0.0, 0.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (keyEvent.key == KEY_PAGE_UP) {
|
if (keyEvent.key == KEY_PAGE_UP) {
|
||||||
orbitalCamera.zoom(1.0)
|
orbitalCamera.zoom(keySpeed)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (keyEvent.key == KEY_PAGE_DOWN) {
|
if (keyEvent.key == KEY_PAGE_DOWN) {
|
||||||
orbitalCamera.zoom(-1.0)
|
orbitalCamera.zoom(-keySpeed)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setup(program: Program) {
|
// EXTENSION
|
||||||
|
override var enabled: Boolean = true
|
||||||
|
|
||||||
|
override fun setup(program: Program) {
|
||||||
this.program = program
|
this.program = program
|
||||||
if(userInteraction)
|
|
||||||
|
if (userInteraction) {
|
||||||
program.mouse.moved.listen { mouseMoved(it) }
|
program.mouse.moved.listen { mouseMoved(it) }
|
||||||
program.mouse.buttonDown.listen { mouseButtonDown(it) }
|
program.mouse.buttonDown.listen { mouseButtonDown(it) }
|
||||||
program.mouse.buttonUp.listen { state = STATE.NONE }
|
program.mouse.buttonUp.listen { state = STATE.NONE }
|
||||||
program.mouse.scrolled.listen { mouseScrolled(it) }
|
program.mouse.scrolled.listen { mouseScrolled(it) }
|
||||||
program.keyboard.keyDown.listen { keyPressed(it) }
|
program.keyboard.keyDown.listen { keyPressed(it) }
|
||||||
program.keyboard.keyRepeat.listen{ keyPressed(it) }
|
program.keyboard.keyRepeat.listen{ keyPressed(it) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user