Add Orbital
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package org.openrndr.extras.camera
|
package org.openrndr.extras.camera
|
||||||
|
|
||||||
import org.openrndr.Extension
|
import org.openrndr.Extension
|
||||||
|
import org.openrndr.Program
|
||||||
import org.openrndr.color.ColorRGBa
|
import org.openrndr.color.ColorRGBa
|
||||||
import org.openrndr.draw.*
|
import org.openrndr.draw.*
|
||||||
import org.openrndr.math.Vector3
|
import org.openrndr.math.Vector3
|
||||||
@@ -31,6 +32,10 @@ class Debug3D(val size: Int = 10, val divisions: Int = 10) : Extension {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun beforeDraw(drawer: Drawer, program: Program) {
|
||||||
|
draw(drawer)
|
||||||
|
}
|
||||||
|
|
||||||
fun draw(drawer: Drawer) {
|
fun draw(drawer: Drawer) {
|
||||||
drawer.isolated {
|
drawer.isolated {
|
||||||
drawer.fill = ColorRGBa.WHITE
|
drawer.fill = ColorRGBa.WHITE
|
||||||
|
|||||||
36
orx-camera/src/main/kotlin/Orbital.kt
Normal file
36
orx-camera/src/main/kotlin/Orbital.kt
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
package org.openrndr.extras.camera
|
||||||
|
|
||||||
|
import org.openrndr.Extension
|
||||||
|
import org.openrndr.Program
|
||||||
|
import org.openrndr.draw.Drawer
|
||||||
|
import org.openrndr.math.Vector3
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extension that provides orbital camera view and controls.
|
||||||
|
*/
|
||||||
|
class Orbital : Extension {
|
||||||
|
override var enabled: Boolean = true
|
||||||
|
|
||||||
|
var eye = Vector3.UNIT_Z * 10.0
|
||||||
|
var lookAt = Vector3.ZERO
|
||||||
|
var near = 0.1
|
||||||
|
var far = 1000.0
|
||||||
|
var fov = 90.0
|
||||||
|
var userInteraction = true
|
||||||
|
var keySpeed = 1.0
|
||||||
|
|
||||||
|
val camera by lazy { OrbitalCamera(eye, lookAt, fov, near, far) }
|
||||||
|
val controls by lazy { OrbitalControls(camera, userInteraction, keySpeed) }
|
||||||
|
|
||||||
|
override fun setup(program: Program) {
|
||||||
|
controls.setup(program)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun beforeDraw(drawer: Drawer, program: Program) {
|
||||||
|
camera.beforeDraw(drawer, program)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun afterDraw(drawer: Drawer, program: Program) {
|
||||||
|
camera.afterDraw(drawer, program)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ package org.openrndr.extras.camera
|
|||||||
|
|
||||||
import org.openrndr.Extension
|
import org.openrndr.Extension
|
||||||
import org.openrndr.Program
|
import org.openrndr.Program
|
||||||
|
import org.openrndr.draw.DepthTestPass
|
||||||
import org.openrndr.draw.Drawer
|
import org.openrndr.draw.Drawer
|
||||||
import org.openrndr.math.Matrix44
|
import org.openrndr.math.Matrix44
|
||||||
import org.openrndr.math.Spherical
|
import org.openrndr.math.Spherical
|
||||||
@@ -9,15 +10,17 @@ import org.openrndr.math.Vector3
|
|||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
import org.openrndr.math.transforms.lookAt as lookAt_
|
import org.openrndr.math.transforms.lookAt as lookAt_
|
||||||
|
|
||||||
class OrbitalCamera(eye: Vector3, lookAt: Vector3, var fov: Double, var near: Double = 0.1, var far: Double = 1000.0) : Extension {
|
class OrbitalCamera(eye: Vector3 = Vector3.ZERO, lookAt: Vector3 = Vector3.UNIT_Z, var fov: Double = 90.0, var near: Double = 0.1, var far: Double = 1000.0) : Extension {
|
||||||
// current position in spherical coordinates
|
// current position in spherical coordinates
|
||||||
var spherical = Spherical.fromVector(eye)
|
var spherical = Spherical.fromVector(eye)
|
||||||
private set
|
private set
|
||||||
var lookAt = lookAt
|
var lookAt = lookAt
|
||||||
private set
|
private set
|
||||||
|
|
||||||
|
var depthTest = true
|
||||||
|
|
||||||
private var sphericalEnd = Spherical.fromVector(eye)
|
private var sphericalEnd = Spherical.fromVector(eye)
|
||||||
private var lookAtEnd = lookAt.copy()
|
private var lookAtEnd = lookAt
|
||||||
private var dirty: Boolean = true
|
private var dirty: Boolean = true
|
||||||
private var lastSeconds: Double = -1.0
|
private var lastSeconds: Double = -1.0
|
||||||
|
|
||||||
@@ -26,13 +29,13 @@ class OrbitalCamera(eye: Vector3, lookAt: Vector3, var fov: Double, var near: Do
|
|||||||
var dampingFactor = 0.05
|
var dampingFactor = 0.05
|
||||||
var zoomSpeed = 1.0
|
var zoomSpeed = 1.0
|
||||||
|
|
||||||
fun setView(lookAt: Vector3, spherical: Spherical, fov:Double) {
|
fun setView(lookAt: Vector3, spherical: Spherical, fov: Double) {
|
||||||
this.lookAt = lookAt
|
this.lookAt = lookAt
|
||||||
this.lookAtEnd = lookAt
|
this.lookAtEnd = lookAt
|
||||||
this.spherical = spherical
|
this.spherical = spherical
|
||||||
this.sphericalEnd = spherical
|
this.sphericalEnd = spherical
|
||||||
this.fov = fov
|
this.fov = fov
|
||||||
this.fovEnd= fov
|
this.fovEnd = fov
|
||||||
}
|
}
|
||||||
|
|
||||||
fun rotate(rotX: Double, rotY: Double) {
|
fun rotate(rotX: Double, rotY: Double) {
|
||||||
@@ -77,18 +80,24 @@ class OrbitalCamera(eye: Vector3, lookAt: Vector3, var fov: Double, var near: Do
|
|||||||
dirty = true
|
dirty = true
|
||||||
}
|
}
|
||||||
|
|
||||||
fun panTo(target : Vector3) {
|
fun panTo(target: Vector3) {
|
||||||
lookAtEnd = target
|
lookAtEnd = target
|
||||||
dirty = true
|
dirty = true
|
||||||
}
|
}
|
||||||
|
|
||||||
fun dollyTo(distance: Double) {
|
fun dollyTo(distance: Double) {
|
||||||
sphericalEnd = sphericalEnd.copy(radius = distance )
|
sphericalEnd = sphericalEnd.copy(radius = distance)
|
||||||
dirty = true
|
dirty = true
|
||||||
}
|
}
|
||||||
|
|
||||||
fun zoom(degrees: Double) {
|
fun zoom(degrees: Double) {
|
||||||
fovEnd += degrees
|
fovEnd += degrees
|
||||||
|
dirty = true
|
||||||
|
}
|
||||||
|
|
||||||
|
fun zoomTo(degrees: Double) {
|
||||||
|
fovEnd = degrees
|
||||||
|
dirty = true
|
||||||
}
|
}
|
||||||
|
|
||||||
fun update(timeDelta: Double) {
|
fun update(timeDelta: Double) {
|
||||||
@@ -143,6 +152,11 @@ class OrbitalCamera(eye: Vector3, lookAt: Vector3, var fov: Double, var near: Do
|
|||||||
|
|
||||||
drawer.perspective(fov, program.window.size.x / program.window.size.y, near, far)
|
drawer.perspective(fov, program.window.size.x / program.window.size.y, near, far)
|
||||||
drawer.view = viewMatrix()
|
drawer.view = viewMatrix()
|
||||||
|
|
||||||
|
if (depthTest) {
|
||||||
|
drawer.drawStyle.depthWrite = true
|
||||||
|
drawer.drawStyle.depthTestPass = DepthTestPass.LESS_OR_EQUAL
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun afterDraw(drawer: Drawer, program: Program) {
|
override fun afterDraw(drawer: Drawer, program: Program) {
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import kotlin.math.PI
|
|||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
import kotlin.math.tan
|
import kotlin.math.tan
|
||||||
|
|
||||||
class OrbitalControls(val orbitalCamera: OrbitalCamera, val userInteraction: Boolean = true, val keySpeed: Double = 1.0) : Extension {
|
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,
|
||||||
|
|||||||
Reference in New Issue
Block a user