class Eagle::Camera3D

Overview

The viewpoint a 3D scene is rendered from. The first camera added to the tree becomes current, and when a current camera exists, Eagle renders the 3D scene under the 2D layer every frame.

cam = Camera3D.new(position: v3(0, 3, 8), fov: 60)
cam.look_at(Vec3::ZERO)
SceneTree.root.add(cam)

class Viewer < App
  @cam = Camera3D.new(position: v3(0, 2, 6))

  def load : Nil
    SceneTree.root.add(@cam)
  end

  def update(dt : Float32) : Nil
    @cam.fly(dt) # WASD, right-drag to look: handy while building a scene
    if Input.mouse_pressed?
      ray = @cam.mouse_ray # pick things under the cursor with Ray#intersect_aabb
    end
  end
end

Defined in:

eagle/nodes/node3d.cr

Constructors

Class Method Summary

Instance Method Summary

Instance methods inherited from class Eagle::Node3D

back : Vec3 back, distance_to(o : Node3D) : Float32 distance_to, draw_tree(g : Graphics) : Nil draw_tree, euler : Vec3 euler, euler=(e : Vec3) euler=, forward : Vec3 forward, global_position : Vec3 global_position, global_position=(p : Vec3) global_position=, global_rotation : Quat global_rotation, global_transform : Mat4 global_transform, look_at(target : Vec3, up : Vec3 = Vec3::UP) : Nil look_at, parent_3d : Node3D | Nil parent_3d, position : Vec3 position, position=(position : Vec3) position=, right : Vec3 right, rotate(axis : Vec3, rad : Number) : Nil rotate, rotate_local(axis : Vec3, rad : Number) : Nil rotate_local, rotate_x(rad : Number) : Nil rotate_x, rotate_y(rad : Number) : Nil rotate_y, rotate_z(rad : Number) : Nil rotate_z, rotation : Quat rotation, rotation=(rotation : Quat) rotation=, scale : Vec3 scale, scale=(s : Vec3)
scale=(s : Number)
scale=
, set_euler(pitch : Number, yaw : Number, roll : Number = 0) : self set_euler, to_global(local : Vec3) : Vec3 to_global, to_local(global : Vec3) : Vec3 to_local, top_level=(top_level : Bool) top_level=, top_level? : Bool top_level?, transform : Mat4 transform, translate(v : Vec3) : Nil translate, translate_local(v : Vec3) : Nil translate_local, up : Vec3 up

Constructor methods inherited from class Eagle::Node3D

new(name : String = "", position : Eagle::Vec3 = Vec3::ZERO, rotation : Eagle::Quat = Quat::IDENTITY, scale : Eagle::Vec3 = Vec3::ONE) new

Instance methods inherited from class Eagle::Node

<<(child : Node) : self <<, [](path : String) : Node [], []?(path : String) : Node | Nil []?, add(child : Node) : Node
add(*children : Node) : Nil
add
, add_child(child : Node) : Node add_child, add_to_group(group : String) : self add_to_group, ancestor_of?(node : Node) : Bool ancestor_of?, can_process? : Bool can_process?, child?(name : String) : Node | Nil child?, child_added : Eagle::Emitter(Node) child_added, child_count : Int32 child_count, child_removed : Eagle::Emitter(Node) child_removed, children : Array(Eagle::Node) children, children_of(type : T.class) : Array(T) forall T children_of, clear_children : Nil clear_children, draw(g : Graphics) : Nil draw, dump(io : IO = STDOUT, indent = 0) : Nil dump, each_ancestor(& : Node -> ) : Nil each_ancestor, each_child(& : Node -> ) : Nil each_child, each_descendant(&block : Node -> ) : Nil each_descendant, emit_child_added(*args) : Nil emit_child_added, emit_child_removed(*args) : Nil emit_child_removed, emit_tree_entered(*args) : Nil emit_tree_entered, emit_tree_exited(*args) : Nil emit_tree_exited, enter_tree : Nil enter_tree, exit_tree : Nil exit_tree, find(name : String) : Node | Nil find, find_all(type : T.class) : Array(T) forall T find_all, first_child : Node | Nil first_child, free : Nil free, get_node(path : String, type : T.class) : T forall T
get_node(path : String) : Node
get_node
, get_node?(path : String) : Node | Nil get_node?, groups : Set(String) groups, in_group?(group : String) : Bool in_group?, in_tree? : Bool in_tree?, input(event : Event) : Nil input, name : String name, name=(name : String) name=, on_child_added(&block : Node -> Nil) : Proc(Node, Nil) on_child_added, on_child_removed(&block : Node -> Nil) : Proc(Node, Nil) on_child_removed, on_tree_entered(&block : -> Nil) : Proc(Nil) on_tree_entered, on_tree_exited(&block : -> Nil) : Proc(Nil) on_tree_exited, parent : Node | Nil parent, path : String path, physics_process(dt : Float32) : Nil physics_process, process(dt : Float32) : Nil process, process_mode : Eagle::Node::ProcessMode process_mode, process_mode=(process_mode : Eagle::Node::ProcessMode) process_mode=, queue_free : Nil queue_free, queued_free? : Bool queued_free?, ready : Nil ready, ready_called? : Bool ready_called?, remove(child : Node) : Nil remove, remove_child(child : Node) : Nil remove_child, remove_from_group(group : String) : Nil remove_from_group, remove_from_parent : Nil remove_from_parent, resized(width : Int32, height : Int32) : Nil resized, root : Node root, to_s(io : IO) : Nil to_s, tree_entered : Eagle::Emitter() tree_entered, tree_exited : Eagle::Emitter() tree_exited, visible=(visible : Bool) visible=, visible? : Bool visible?, z_index : Int32 z_index, z_index=(z_index : Int32) z_index=

Constructor methods inherited from class Eagle::Node

new(name : String = "") new

Constructor Detail

def self.new(name : String = "", position : Vec3 = Vec3::ZERO, fov : Number = 60, current : Bool = false) #

Creates a camera. fov is in degrees here.


Class Method Detail

def self.current : Camera3D | Nil #

The camera the scene renders from, if any.


def self.current=(c : Camera3D | Nil) #

Switches the active camera. nil stops 3D rendering.


Instance Method Detail

def camera_view(aspect : Number) : CameraView #

The view, projection and position packed for the renderer.


def current? : Bool #

True when this camera renders the scene.


def enter_tree : Nil #

Becomes current if no other camera is.


def exit_tree : Nil #

Stops being current when removed.


def far : Float32 #

Farthest distance that is drawn.


def far=(far : Float32) #

Farthest distance that is drawn.


def fly(dt : Float32, speed : Number = 6, look_speed : Number = 0.003) : Nil #

A free-flying debug camera. WASD moves, Q and E go down and up, right-drag or the arrow keys look around, and Ctrl moves faster. A gamepad works too.


def fov : Float32 #

Vertical field of view in radians. See #fov_degrees for degrees.


def fov=(fov : Float32) #

Vertical field of view in radians. See #fov_degrees for degrees.


def fov_degrees : Float32 #

Field of view in degrees.


def fov_degrees=(d : Number) #

Sets the field of view in degrees.


def make_current : self #

Makes this the active camera. Returns self.


def mouse_ray : Ray #

The ray through the mouse cursor.


def near : Float32 #

Nearest distance that is drawn. Keep it as large as you can to avoid depth artifacts.


def near=(near : Float32) #

Nearest distance that is drawn. Keep it as large as you can to avoid depth artifacts.


def ortho_size : Float32 #

Half the view height in world units when orthographic.


def ortho_size=(ortho_size : Float32) #

Half the view height in world units when orthographic.


def orthographic=(orthographic : Bool) #

Use an orthographic projection with no perspective, for isometric and strategy views.


def orthographic? : Bool #

Use an orthographic projection with no perspective, for isometric and strategy views.


def projection(aspect : Number) : Mat4 #

The projection matrix for an aspect ratio.


def screen_to_ray(screen : Vec2, viewport : Vec2 = Window.size) : Ray #

The world-space ray through a screen point.


def view : Mat4 #

The view matrix (world to camera).


def world_to_screen(p : Vec3, viewport : Vec2 = Window.size) : Vec2 | Nil #

Projects a world point to screen space, for name tags and markers over 3D objects. Returns nil when the point is behind the camera.