simvx.core.nodes_3d¶

3D spatial nodes: Node3D and derived types.

Module Contents¶

Classes¶

Node3D

3D spatial node with position, rotation, and scale.

Camera3D

3D perspective camera providing view and projection matrices.

MeshInstance3D

Visible 3D object. Holds a Mesh and Material for the renderer.

Light3D

Base class for 3D light nodes.

DirectionalLight3D

Directional light — direction derived from node’s forward vector.

PointLight3D

Omnidirectional point light with range-based attenuation.

SpotLight3D

Spot light with inner/outer cone angles (degrees).

Text3D

Text that floats at a 3D world position, projected to screen.

OrbitCamera3D

General-purpose orbit camera with pan and zoom controls.

Path3D

Holds a Curve3D for path-following, positioned in 3D space.

PathFollow3D

Moves along a parent Path3D’s curve based on progress.

Marker3D

Position marker for spawn points, waypoints, and reference positions in 3D.

Data¶

API¶

class simvx.core.nodes_3d.Node3D(position=None, rotation=None, scale=None, **kwargs)¶

Bases: simvx.core.node.Node

3D spatial node with position, rotation, and scale.

Extends Node with a 3D transform and cached global-transform propagation through the hierarchy. All 3D objects – meshes, cameras, lights – inherit from this.

Attributes: position: Local position as Vec3. rotation: Local rotation as Quat (quaternion). scale: Local scale as Vec3 (default (1, 1, 1)).

Example::

cube = Node3D(position=(0, 2, -5), name="Cube")
cube.rotate_y(math.radians(45))
print(cube.forward)  # unit vector along the local -Z axis

Initialization

property position¶
property rotation: simvx.core.math.types.Quat¶
property scale¶
property rotation_degrees: simvx.core.math.types.Vec3¶

Euler angles in degrees (convenience for editor display).

property global_position: simvx.core.math.types.Vec3¶
property global_rotation: simvx.core.math.types.Quat¶
property global_scale: simvx.core.math.types.Vec3¶
property forward: simvx.core.math.types.Vec3¶
property right: simvx.core.math.types.Vec3¶
property up: simvx.core.math.types.Vec3¶
translate(offset: tuple[float, float, float] | numpy.ndarray)¶

Move by offset in local space.

translate_global(offset: tuple[float, float, float] | numpy.ndarray)¶

Move by offset in world space.

rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float)¶

Rotate around an axis by the given angle in radians.

rotate_x(angle: float)¶
rotate_y(angle: float)¶
rotate_z(angle: float)¶
look_at(target: tuple[float, float, float] | numpy.ndarray, up=None)¶

Rotate to face a target position in world space.

wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0)¶

Wrap position within a 3D volume centered at origin.

script_error_raised¶

‘Signal(…)’

classmethod __init_subclass__(**kwargs)¶
property name: str¶
property process_mode: simvx.core.descriptors.ProcessMode¶
reset_error() None¶
add_child(node: simvx.core.node.Node) simvx.core.node.Node¶
remove_child(node: simvx.core.node.Node)¶
reparent(new_parent: simvx.core.node.Node)¶
get_node(path: str) simvx.core.node.Node¶
find_child(name: str, recursive: bool = False) simvx.core.node.Node | None¶
find(node_type: type) simvx.core.node.Node | None¶
find_all(node_type: type, recursive: bool = True) list¶
property path: str¶
add_to_group(group: str)¶
remove_from_group(group: str)¶
is_in_group(group: str) bool¶
ready() None¶
enter_tree() None¶
exit_tree() None¶
process(dt: float) None¶
physics_process(dt: float) None¶
draw(renderer) None¶
input_event(event: simvx.core.events.InputEvent) None¶
input(event: simvx.core.events.TreeInputEvent) None¶
unhandled_input(event: simvx.core.events.TreeInputEvent) None¶
start_coroutine(gen: simvx.core.descriptors.Coroutine) simvx.core.descriptors.CoroutineHandle¶
stop_coroutine(gen_or_handle)¶
destroy()¶
queue_free¶

None

property tree: simvx.core.scene_tree.SceneTree¶
get_tree() simvx.core.scene_tree.SceneTree¶
__getitem__(key: str)¶
classmethod get_properties() dict[str, simvx.core.descriptors.Property]¶
get_settings¶

None

__repr__()¶
class simvx.core.nodes_3d.Camera3D(position=None, rotation=None, scale=None, **kwargs)¶

Bases: simvx.core.nodes_3d.Node3D

3D perspective camera providing view and projection matrices.

The first Camera3D found in the scene tree is used by the renderer. Position and orientation are inherited from Node3D; the camera adds projection parameters (field of view, clip planes).

Attributes: fov: Vertical field of view in degrees (1 – 179). near: Near clip plane distance. far: Far clip plane distance.

Example::

camera = Camera3D(position=(0, 5, 10), name="MainCamera")
camera.look_at((0, 0, 0))
camera.fov = 75.0

Initialization

fov¶

‘Property(…)’

near¶

‘Property(…)’

far¶

‘Property(…)’

property view_matrix: numpy.ndarray¶

View matrix computed from this node’s global transform.

Returns: 4x4 view matrix as numpy array (row-major)

projection_matrix(aspect: float = 16 / 9) numpy.ndarray¶

Perspective projection matrix for given aspect ratio (Vulkan clip space).

Args: aspect: Aspect ratio (width / height)

Returns: 4x4 projection matrix as numpy array (row-major) Includes Y-flip for Vulkan rendering

property position¶
property rotation: simvx.core.math.types.Quat¶
property scale¶
property rotation_degrees: simvx.core.math.types.Vec3¶
property global_position: simvx.core.math.types.Vec3¶
property global_rotation: simvx.core.math.types.Quat¶
property global_scale: simvx.core.math.types.Vec3¶
property forward: simvx.core.math.types.Vec3¶
property right: simvx.core.math.types.Vec3¶
property up: simvx.core.math.types.Vec3¶
translate(offset: tuple[float, float, float] | numpy.ndarray)¶
translate_global(offset: tuple[float, float, float] | numpy.ndarray)¶
rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float)¶
rotate_x(angle: float)¶
rotate_y(angle: float)¶
rotate_z(angle: float)¶
look_at(target: tuple[float, float, float] | numpy.ndarray, up=None)¶
wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0)¶
script_error_raised¶

‘Signal(…)’

classmethod __init_subclass__(**kwargs)¶
property name: str¶
property process_mode: simvx.core.descriptors.ProcessMode¶
reset_error() None¶
add_child(node: simvx.core.node.Node) simvx.core.node.Node¶
remove_child(node: simvx.core.node.Node)¶
reparent(new_parent: simvx.core.node.Node)¶
get_node(path: str) simvx.core.node.Node¶
find_child(name: str, recursive: bool = False) simvx.core.node.Node | None¶
find(node_type: type) simvx.core.node.Node | None¶
find_all(node_type: type, recursive: bool = True) list¶
property path: str¶
add_to_group(group: str)¶
remove_from_group(group: str)¶
is_in_group(group: str) bool¶
ready() None¶
enter_tree() None¶
exit_tree() None¶
process(dt: float) None¶
physics_process(dt: float) None¶
draw(renderer) None¶
input_event(event: simvx.core.events.InputEvent) None¶
input(event: simvx.core.events.TreeInputEvent) None¶
unhandled_input(event: simvx.core.events.TreeInputEvent) None¶
start_coroutine(gen: simvx.core.descriptors.Coroutine) simvx.core.descriptors.CoroutineHandle¶
stop_coroutine(gen_or_handle)¶
destroy()¶
queue_free¶

None

property tree: simvx.core.scene_tree.SceneTree¶
get_tree() simvx.core.scene_tree.SceneTree¶
__getitem__(key: str)¶
classmethod get_properties() dict[str, simvx.core.descriptors.Property]¶
get_settings¶

None

__repr__()¶
class simvx.core.nodes_3d.MeshInstance3D(mesh=None, material=None, **kwargs)¶

Bases: simvx.core.nodes_3d.Node3D

Visible 3D object. Holds a Mesh and Material for the renderer.

Usage: from simvx.core.graphics.mesh import Mesh from simvx.core.graphics.material import Material mi = MeshInstance3D(mesh=Mesh.cube(), material=Material(color=(1, 0, 0)))

Initialization

property model_matrix: numpy.ndarray¶

Model transform matrix from global position/rotation/scale.

property position¶
property rotation: simvx.core.math.types.Quat¶
property scale¶
property rotation_degrees: simvx.core.math.types.Vec3¶
property global_position: simvx.core.math.types.Vec3¶
property global_rotation: simvx.core.math.types.Quat¶
property global_scale: simvx.core.math.types.Vec3¶
property forward: simvx.core.math.types.Vec3¶
property right: simvx.core.math.types.Vec3¶
property up: simvx.core.math.types.Vec3¶
translate(offset: tuple[float, float, float] | numpy.ndarray)¶
translate_global(offset: tuple[float, float, float] | numpy.ndarray)¶
rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float)¶
rotate_x(angle: float)¶
rotate_y(angle: float)¶
rotate_z(angle: float)¶
look_at(target: tuple[float, float, float] | numpy.ndarray, up=None)¶
wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0)¶
script_error_raised¶

‘Signal(…)’

classmethod __init_subclass__(**kwargs)¶
property name: str¶
property process_mode: simvx.core.descriptors.ProcessMode¶
reset_error() None¶
add_child(node: simvx.core.node.Node) simvx.core.node.Node¶
remove_child(node: simvx.core.node.Node)¶
reparent(new_parent: simvx.core.node.Node)¶
get_node(path: str) simvx.core.node.Node¶
find_child(name: str, recursive: bool = False) simvx.core.node.Node | None¶
find(node_type: type) simvx.core.node.Node | None¶
find_all(node_type: type, recursive: bool = True) list¶
property path: str¶
add_to_group(group: str)¶
remove_from_group(group: str)¶
is_in_group(group: str) bool¶
ready() None¶
enter_tree() None¶
exit_tree() None¶
process(dt: float) None¶
physics_process(dt: float) None¶
draw(renderer) None¶
input_event(event: simvx.core.events.InputEvent) None¶
input(event: simvx.core.events.TreeInputEvent) None¶
unhandled_input(event: simvx.core.events.TreeInputEvent) None¶
start_coroutine(gen: simvx.core.descriptors.Coroutine) simvx.core.descriptors.CoroutineHandle¶
stop_coroutine(gen_or_handle)¶
destroy()¶
queue_free¶

None

property tree: simvx.core.scene_tree.SceneTree¶
get_tree() simvx.core.scene_tree.SceneTree¶
__getitem__(key: str)¶
classmethod get_properties() dict[str, simvx.core.descriptors.Property]¶
get_settings¶

None

__repr__()¶
class simvx.core.nodes_3d.Light3D(position=None, rotation=None, scale=None, **kwargs)¶

Bases: simvx.core.nodes_3d.Node3D

Base class for 3D light nodes.

Initialization

color¶

‘Property(…)’

intensity¶

‘Property(…)’

property position¶
property rotation: simvx.core.math.types.Quat¶
property scale¶
property rotation_degrees: simvx.core.math.types.Vec3¶
property global_position: simvx.core.math.types.Vec3¶
property global_rotation: simvx.core.math.types.Quat¶
property global_scale: simvx.core.math.types.Vec3¶
property forward: simvx.core.math.types.Vec3¶
property right: simvx.core.math.types.Vec3¶
property up: simvx.core.math.types.Vec3¶
translate(offset: tuple[float, float, float] | numpy.ndarray)¶
translate_global(offset: tuple[float, float, float] | numpy.ndarray)¶
rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float)¶
rotate_x(angle: float)¶
rotate_y(angle: float)¶
rotate_z(angle: float)¶
look_at(target: tuple[float, float, float] | numpy.ndarray, up=None)¶
wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0)¶
script_error_raised¶

‘Signal(…)’

classmethod __init_subclass__(**kwargs)¶
property name: str¶
property process_mode: simvx.core.descriptors.ProcessMode¶
reset_error() None¶
add_child(node: simvx.core.node.Node) simvx.core.node.Node¶
remove_child(node: simvx.core.node.Node)¶
reparent(new_parent: simvx.core.node.Node)¶
get_node(path: str) simvx.core.node.Node¶
find_child(name: str, recursive: bool = False) simvx.core.node.Node | None¶
find(node_type: type) simvx.core.node.Node | None¶
find_all(node_type: type, recursive: bool = True) list¶
property path: str¶
add_to_group(group: str)¶
remove_from_group(group: str)¶
is_in_group(group: str) bool¶
ready() None¶
enter_tree() None¶
exit_tree() None¶
process(dt: float) None¶
physics_process(dt: float) None¶
draw(renderer) None¶
input_event(event: simvx.core.events.InputEvent) None¶
input(event: simvx.core.events.TreeInputEvent) None¶
unhandled_input(event: simvx.core.events.TreeInputEvent) None¶
start_coroutine(gen: simvx.core.descriptors.Coroutine) simvx.core.descriptors.CoroutineHandle¶
stop_coroutine(gen_or_handle)¶
destroy()¶
queue_free¶

None

property tree: simvx.core.scene_tree.SceneTree¶
get_tree() simvx.core.scene_tree.SceneTree¶
__getitem__(key: str)¶
classmethod get_properties() dict[str, simvx.core.descriptors.Property]¶
get_settings¶

None

__repr__()¶
class simvx.core.nodes_3d.DirectionalLight3D(position=None, rotation=None, scale=None, **kwargs)¶

Bases: simvx.core.nodes_3d.Light3D

Directional light — direction derived from node’s forward vector.

Initialization

property direction: simvx.core.math.types.Vec3¶

Light direction (world-space). Derived from forward vector.

color¶

‘Property(…)’

intensity¶

‘Property(…)’

property position¶
property rotation: simvx.core.math.types.Quat¶
property scale¶
property rotation_degrees: simvx.core.math.types.Vec3¶
property global_position: simvx.core.math.types.Vec3¶
property global_rotation: simvx.core.math.types.Quat¶
property global_scale: simvx.core.math.types.Vec3¶
property forward: simvx.core.math.types.Vec3¶
property right: simvx.core.math.types.Vec3¶
property up: simvx.core.math.types.Vec3¶
translate(offset: tuple[float, float, float] | numpy.ndarray)¶
translate_global(offset: tuple[float, float, float] | numpy.ndarray)¶
rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float)¶
rotate_x(angle: float)¶
rotate_y(angle: float)¶
rotate_z(angle: float)¶
look_at(target: tuple[float, float, float] | numpy.ndarray, up=None)¶
wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0)¶
script_error_raised¶

‘Signal(…)’

classmethod __init_subclass__(**kwargs)¶
property name: str¶
property process_mode: simvx.core.descriptors.ProcessMode¶
reset_error() None¶
add_child(node: simvx.core.node.Node) simvx.core.node.Node¶
remove_child(node: simvx.core.node.Node)¶
reparent(new_parent: simvx.core.node.Node)¶
get_node(path: str) simvx.core.node.Node¶
find_child(name: str, recursive: bool = False) simvx.core.node.Node | None¶
find(node_type: type) simvx.core.node.Node | None¶
find_all(node_type: type, recursive: bool = True) list¶
property path: str¶
add_to_group(group: str)¶
remove_from_group(group: str)¶
is_in_group(group: str) bool¶
ready() None¶
enter_tree() None¶
exit_tree() None¶
process(dt: float) None¶
physics_process(dt: float) None¶
draw(renderer) None¶
input_event(event: simvx.core.events.InputEvent) None¶
input(event: simvx.core.events.TreeInputEvent) None¶
unhandled_input(event: simvx.core.events.TreeInputEvent) None¶
start_coroutine(gen: simvx.core.descriptors.Coroutine) simvx.core.descriptors.CoroutineHandle¶
stop_coroutine(gen_or_handle)¶
destroy()¶
queue_free¶

None

property tree: simvx.core.scene_tree.SceneTree¶
get_tree() simvx.core.scene_tree.SceneTree¶
__getitem__(key: str)¶
classmethod get_properties() dict[str, simvx.core.descriptors.Property]¶
get_settings¶

None

__repr__()¶
class simvx.core.nodes_3d.PointLight3D(position=None, rotation=None, scale=None, **kwargs)¶

Bases: simvx.core.nodes_3d.Light3D

Omnidirectional point light with range-based attenuation.

Initialization

range¶

‘Property(…)’

color¶

‘Property(…)’

intensity¶

‘Property(…)’

property position¶
property rotation: simvx.core.math.types.Quat¶
property scale¶
property rotation_degrees: simvx.core.math.types.Vec3¶
property global_position: simvx.core.math.types.Vec3¶
property global_rotation: simvx.core.math.types.Quat¶
property global_scale: simvx.core.math.types.Vec3¶
property forward: simvx.core.math.types.Vec3¶
property right: simvx.core.math.types.Vec3¶
property up: simvx.core.math.types.Vec3¶
translate(offset: tuple[float, float, float] | numpy.ndarray)¶
translate_global(offset: tuple[float, float, float] | numpy.ndarray)¶
rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float)¶
rotate_x(angle: float)¶
rotate_y(angle: float)¶
rotate_z(angle: float)¶
look_at(target: tuple[float, float, float] | numpy.ndarray, up=None)¶
wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0)¶
script_error_raised¶

‘Signal(…)’

classmethod __init_subclass__(**kwargs)¶
property name: str¶
property process_mode: simvx.core.descriptors.ProcessMode¶
reset_error() None¶
add_child(node: simvx.core.node.Node) simvx.core.node.Node¶
remove_child(node: simvx.core.node.Node)¶
reparent(new_parent: simvx.core.node.Node)¶
get_node(path: str) simvx.core.node.Node¶
find_child(name: str, recursive: bool = False) simvx.core.node.Node | None¶
find(node_type: type) simvx.core.node.Node | None¶
find_all(node_type: type, recursive: bool = True) list¶
property path: str¶
add_to_group(group: str)¶
remove_from_group(group: str)¶
is_in_group(group: str) bool¶
ready() None¶
enter_tree() None¶
exit_tree() None¶
process(dt: float) None¶
physics_process(dt: float) None¶
draw(renderer) None¶
input_event(event: simvx.core.events.InputEvent) None¶
input(event: simvx.core.events.TreeInputEvent) None¶
unhandled_input(event: simvx.core.events.TreeInputEvent) None¶
start_coroutine(gen: simvx.core.descriptors.Coroutine) simvx.core.descriptors.CoroutineHandle¶
stop_coroutine(gen_or_handle)¶
destroy()¶
queue_free¶

None

property tree: simvx.core.scene_tree.SceneTree¶
get_tree() simvx.core.scene_tree.SceneTree¶
__getitem__(key: str)¶
classmethod get_properties() dict[str, simvx.core.descriptors.Property]¶
get_settings¶

None

__repr__()¶
class simvx.core.nodes_3d.SpotLight3D(position=None, rotation=None, scale=None, **kwargs)¶

Bases: simvx.core.nodes_3d.Light3D

Spot light with inner/outer cone angles (degrees).

Initialization

range¶

‘Property(…)’

inner_cone¶

‘Property(…)’

outer_cone¶

‘Property(…)’

color¶

‘Property(…)’

intensity¶

‘Property(…)’

property position¶
property rotation: simvx.core.math.types.Quat¶
property scale¶
property rotation_degrees: simvx.core.math.types.Vec3¶
property global_position: simvx.core.math.types.Vec3¶
property global_rotation: simvx.core.math.types.Quat¶
property global_scale: simvx.core.math.types.Vec3¶
property forward: simvx.core.math.types.Vec3¶
property right: simvx.core.math.types.Vec3¶
property up: simvx.core.math.types.Vec3¶
translate(offset: tuple[float, float, float] | numpy.ndarray)¶
translate_global(offset: tuple[float, float, float] | numpy.ndarray)¶
rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float)¶
rotate_x(angle: float)¶
rotate_y(angle: float)¶
rotate_z(angle: float)¶
look_at(target: tuple[float, float, float] | numpy.ndarray, up=None)¶
wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0)¶
script_error_raised¶

‘Signal(…)’

classmethod __init_subclass__(**kwargs)¶
property name: str¶
property process_mode: simvx.core.descriptors.ProcessMode¶
reset_error() None¶
add_child(node: simvx.core.node.Node) simvx.core.node.Node¶
remove_child(node: simvx.core.node.Node)¶
reparent(new_parent: simvx.core.node.Node)¶
get_node(path: str) simvx.core.node.Node¶
find_child(name: str, recursive: bool = False) simvx.core.node.Node | None¶
find(node_type: type) simvx.core.node.Node | None¶
find_all(node_type: type, recursive: bool = True) list¶
property path: str¶
add_to_group(group: str)¶
remove_from_group(group: str)¶
is_in_group(group: str) bool¶
ready() None¶
enter_tree() None¶
exit_tree() None¶
process(dt: float) None¶
physics_process(dt: float) None¶
draw(renderer) None¶
input_event(event: simvx.core.events.InputEvent) None¶
input(event: simvx.core.events.TreeInputEvent) None¶
unhandled_input(event: simvx.core.events.TreeInputEvent) None¶
start_coroutine(gen: simvx.core.descriptors.Coroutine) simvx.core.descriptors.CoroutineHandle¶
stop_coroutine(gen_or_handle)¶
destroy()¶
queue_free¶

None

property tree: simvx.core.scene_tree.SceneTree¶
get_tree() simvx.core.scene_tree.SceneTree¶
__getitem__(key: str)¶
classmethod get_properties() dict[str, simvx.core.descriptors.Property]¶
get_settings¶

None

__repr__()¶
class simvx.core.nodes_3d.Text3D(position=None, rotation=None, scale=None, **kwargs)¶

Bases: simvx.core.nodes_3d.Node3D

Text that floats at a 3D world position, projected to screen.

Initialization

text¶

‘Property(…)’

font_scale¶

‘Property(…)’

font_color¶

‘Property(…)’

draw(renderer)¶
property position¶
property rotation: simvx.core.math.types.Quat¶
property scale¶
property rotation_degrees: simvx.core.math.types.Vec3¶
property global_position: simvx.core.math.types.Vec3¶
property global_rotation: simvx.core.math.types.Quat¶
property global_scale: simvx.core.math.types.Vec3¶
property forward: simvx.core.math.types.Vec3¶
property right: simvx.core.math.types.Vec3¶
property up: simvx.core.math.types.Vec3¶
translate(offset: tuple[float, float, float] | numpy.ndarray)¶
translate_global(offset: tuple[float, float, float] | numpy.ndarray)¶
rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float)¶
rotate_x(angle: float)¶
rotate_y(angle: float)¶
rotate_z(angle: float)¶
look_at(target: tuple[float, float, float] | numpy.ndarray, up=None)¶
wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0)¶
script_error_raised¶

‘Signal(…)’

classmethod __init_subclass__(**kwargs)¶
property name: str¶
property process_mode: simvx.core.descriptors.ProcessMode¶
reset_error() None¶
add_child(node: simvx.core.node.Node) simvx.core.node.Node¶
remove_child(node: simvx.core.node.Node)¶
reparent(new_parent: simvx.core.node.Node)¶
get_node(path: str) simvx.core.node.Node¶
find_child(name: str, recursive: bool = False) simvx.core.node.Node | None¶
find(node_type: type) simvx.core.node.Node | None¶
find_all(node_type: type, recursive: bool = True) list¶
property path: str¶
add_to_group(group: str)¶
remove_from_group(group: str)¶
is_in_group(group: str) bool¶
ready() None¶
enter_tree() None¶
exit_tree() None¶
process(dt: float) None¶
physics_process(dt: float) None¶
input_event(event: simvx.core.events.InputEvent) None¶
input(event: simvx.core.events.TreeInputEvent) None¶
unhandled_input(event: simvx.core.events.TreeInputEvent) None¶
start_coroutine(gen: simvx.core.descriptors.Coroutine) simvx.core.descriptors.CoroutineHandle¶
stop_coroutine(gen_or_handle)¶
destroy()¶
queue_free¶

None

property tree: simvx.core.scene_tree.SceneTree¶
get_tree() simvx.core.scene_tree.SceneTree¶
__getitem__(key: str)¶
classmethod get_properties() dict[str, simvx.core.descriptors.Property]¶
get_settings¶

None

__repr__()¶
class simvx.core.nodes_3d.OrbitCamera3D(**kwargs)¶

Bases: simvx.core.nodes_3d.Camera3D

General-purpose orbit camera with pan and zoom controls.

Initialization

orbit(dyaw: float, dpitch: float)¶

Orbit the camera around its pivot point by yaw and pitch deltas (radians).

pan(dx: float, dz: float)¶

Pan the camera pivot horizontally in the XZ plane.

zoom(delta: float)¶

Zoom the camera by adjusting its distance to the pivot.

fov¶

‘Property(…)’

near¶

‘Property(…)’

far¶

‘Property(…)’

property view_matrix: numpy.ndarray¶
projection_matrix(aspect: float = 16 / 9) numpy.ndarray¶
property position¶
property rotation: simvx.core.math.types.Quat¶
property scale¶
property rotation_degrees: simvx.core.math.types.Vec3¶
property global_position: simvx.core.math.types.Vec3¶
property global_rotation: simvx.core.math.types.Quat¶
property global_scale: simvx.core.math.types.Vec3¶
property forward: simvx.core.math.types.Vec3¶
property right: simvx.core.math.types.Vec3¶
property up: simvx.core.math.types.Vec3¶
translate(offset: tuple[float, float, float] | numpy.ndarray)¶
translate_global(offset: tuple[float, float, float] | numpy.ndarray)¶
rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float)¶
rotate_x(angle: float)¶
rotate_y(angle: float)¶
rotate_z(angle: float)¶
look_at(target: tuple[float, float, float] | numpy.ndarray, up=None)¶
wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0)¶
script_error_raised¶

‘Signal(…)’

classmethod __init_subclass__(**kwargs)¶
property name: str¶
property process_mode: simvx.core.descriptors.ProcessMode¶
reset_error() None¶
add_child(node: simvx.core.node.Node) simvx.core.node.Node¶
remove_child(node: simvx.core.node.Node)¶
reparent(new_parent: simvx.core.node.Node)¶
get_node(path: str) simvx.core.node.Node¶
find_child(name: str, recursive: bool = False) simvx.core.node.Node | None¶
find(node_type: type) simvx.core.node.Node | None¶
find_all(node_type: type, recursive: bool = True) list¶
property path: str¶
add_to_group(group: str)¶
remove_from_group(group: str)¶
is_in_group(group: str) bool¶
ready() None¶
enter_tree() None¶
exit_tree() None¶
process(dt: float) None¶
physics_process(dt: float) None¶
draw(renderer) None¶
input_event(event: simvx.core.events.InputEvent) None¶
input(event: simvx.core.events.TreeInputEvent) None¶
unhandled_input(event: simvx.core.events.TreeInputEvent) None¶
start_coroutine(gen: simvx.core.descriptors.Coroutine) simvx.core.descriptors.CoroutineHandle¶
stop_coroutine(gen_or_handle)¶
destroy()¶
queue_free¶

None

property tree: simvx.core.scene_tree.SceneTree¶
get_tree() simvx.core.scene_tree.SceneTree¶
__getitem__(key: str)¶
classmethod get_properties() dict[str, simvx.core.descriptors.Property]¶
get_settings¶

None

__repr__()¶
simvx.core.nodes_3d.EditorCamera3D¶

None

class simvx.core.nodes_3d.Path3D(**kwargs)¶

Bases: simvx.core.nodes_3d.Node3D

Holds a Curve3D for path-following, positioned in 3D space.

Initialization

property position¶
property rotation: simvx.core.math.types.Quat¶
property scale¶
property rotation_degrees: simvx.core.math.types.Vec3¶
property global_position: simvx.core.math.types.Vec3¶
property global_rotation: simvx.core.math.types.Quat¶
property global_scale: simvx.core.math.types.Vec3¶
property forward: simvx.core.math.types.Vec3¶
property right: simvx.core.math.types.Vec3¶
property up: simvx.core.math.types.Vec3¶
translate(offset: tuple[float, float, float] | numpy.ndarray)¶
translate_global(offset: tuple[float, float, float] | numpy.ndarray)¶
rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float)¶
rotate_x(angle: float)¶
rotate_y(angle: float)¶
rotate_z(angle: float)¶
look_at(target: tuple[float, float, float] | numpy.ndarray, up=None)¶
wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0)¶
script_error_raised¶

‘Signal(…)’

classmethod __init_subclass__(**kwargs)¶
property name: str¶
property process_mode: simvx.core.descriptors.ProcessMode¶
reset_error() None¶
add_child(node: simvx.core.node.Node) simvx.core.node.Node¶
remove_child(node: simvx.core.node.Node)¶
reparent(new_parent: simvx.core.node.Node)¶
get_node(path: str) simvx.core.node.Node¶
find_child(name: str, recursive: bool = False) simvx.core.node.Node | None¶
find(node_type: type) simvx.core.node.Node | None¶
find_all(node_type: type, recursive: bool = True) list¶
property path: str¶
add_to_group(group: str)¶
remove_from_group(group: str)¶
is_in_group(group: str) bool¶
ready() None¶
enter_tree() None¶
exit_tree() None¶
process(dt: float) None¶
physics_process(dt: float) None¶
draw(renderer) None¶
input_event(event: simvx.core.events.InputEvent) None¶
input(event: simvx.core.events.TreeInputEvent) None¶
unhandled_input(event: simvx.core.events.TreeInputEvent) None¶
start_coroutine(gen: simvx.core.descriptors.Coroutine) simvx.core.descriptors.CoroutineHandle¶
stop_coroutine(gen_or_handle)¶
destroy()¶
queue_free¶

None

property tree: simvx.core.scene_tree.SceneTree¶
get_tree() simvx.core.scene_tree.SceneTree¶
__getitem__(key: str)¶
classmethod get_properties() dict[str, simvx.core.descriptors.Property]¶
get_settings¶

None

__repr__()¶
class simvx.core.nodes_3d.PathFollow3D(**kwargs)¶

Bases: simvx.core.nodes_3d.Node3D

Moves along a parent Path3D’s curve based on progress.

Must be a child of a Path3D node. Updates position and rotation each frame based on the current progress along the curve.

Initialization

h_offset¶

‘Property(…)’

v_offset¶

‘Property(…)’

rotates¶

‘Property(…)’

loop¶

‘Property(…)’

cubic_interp¶

‘Property(…)’

tilt¶

‘Property(…)’

loop_completed¶

‘Signal(…)’

property progress: float¶

Distance along the curve (0 to curve length).

property progress_ratio: float¶

Normalized progress (0.0 to 1.0).

process(dt: float)¶
property position¶
property rotation: simvx.core.math.types.Quat¶
property scale¶
property rotation_degrees: simvx.core.math.types.Vec3¶
property global_position: simvx.core.math.types.Vec3¶
property global_rotation: simvx.core.math.types.Quat¶
property global_scale: simvx.core.math.types.Vec3¶
property forward: simvx.core.math.types.Vec3¶
property right: simvx.core.math.types.Vec3¶
property up: simvx.core.math.types.Vec3¶
translate(offset: tuple[float, float, float] | numpy.ndarray)¶
translate_global(offset: tuple[float, float, float] | numpy.ndarray)¶
rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float)¶
rotate_x(angle: float)¶
rotate_y(angle: float)¶
rotate_z(angle: float)¶
look_at(target: tuple[float, float, float] | numpy.ndarray, up=None)¶
wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0)¶
script_error_raised¶

‘Signal(…)’

classmethod __init_subclass__(**kwargs)¶
property name: str¶
property process_mode: simvx.core.descriptors.ProcessMode¶
reset_error() None¶
add_child(node: simvx.core.node.Node) simvx.core.node.Node¶
remove_child(node: simvx.core.node.Node)¶
reparent(new_parent: simvx.core.node.Node)¶
get_node(path: str) simvx.core.node.Node¶
find_child(name: str, recursive: bool = False) simvx.core.node.Node | None¶
find(node_type: type) simvx.core.node.Node | None¶
find_all(node_type: type, recursive: bool = True) list¶
property path: str¶
add_to_group(group: str)¶
remove_from_group(group: str)¶
is_in_group(group: str) bool¶
ready() None¶
enter_tree() None¶
exit_tree() None¶
physics_process(dt: float) None¶
draw(renderer) None¶
input_event(event: simvx.core.events.InputEvent) None¶
input(event: simvx.core.events.TreeInputEvent) None¶
unhandled_input(event: simvx.core.events.TreeInputEvent) None¶
start_coroutine(gen: simvx.core.descriptors.Coroutine) simvx.core.descriptors.CoroutineHandle¶
stop_coroutine(gen_or_handle)¶
destroy()¶
queue_free¶

None

property tree: simvx.core.scene_tree.SceneTree¶
get_tree() simvx.core.scene_tree.SceneTree¶
__getitem__(key: str)¶
classmethod get_properties() dict[str, simvx.core.descriptors.Property]¶
get_settings¶

None

__repr__()¶
class simvx.core.nodes_3d.Marker3D(position=None, rotation=None, scale=None, **kwargs)¶

Bases: simvx.core.nodes_3d.Node3D

Position marker for spawn points, waypoints, and reference positions in 3D.

Invisible at runtime. The editor renders a coloured axis cross via get_gizmo_lines().

Initialization

gizmo_colour¶

‘Property(…)’

gizmo_size¶

‘Property(…)’

get_gizmo_lines() list[tuple[simvx.core.math.types.Vec3, simvx.core.math.types.Vec3]]¶

Return 3 axis-aligned line segments centred at global position.

property position¶
property rotation: simvx.core.math.types.Quat¶
property scale¶
property rotation_degrees: simvx.core.math.types.Vec3¶
property global_position: simvx.core.math.types.Vec3¶
property global_rotation: simvx.core.math.types.Quat¶
property global_scale: simvx.core.math.types.Vec3¶
property forward: simvx.core.math.types.Vec3¶
property right: simvx.core.math.types.Vec3¶
property up: simvx.core.math.types.Vec3¶
translate(offset: tuple[float, float, float] | numpy.ndarray)¶
translate_global(offset: tuple[float, float, float] | numpy.ndarray)¶
rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float)¶
rotate_x(angle: float)¶
rotate_y(angle: float)¶
rotate_z(angle: float)¶
look_at(target: tuple[float, float, float] | numpy.ndarray, up=None)¶
wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0)¶
script_error_raised¶

‘Signal(…)’

classmethod __init_subclass__(**kwargs)¶
property name: str¶
property process_mode: simvx.core.descriptors.ProcessMode¶
reset_error() None¶
add_child(node: simvx.core.node.Node) simvx.core.node.Node¶
remove_child(node: simvx.core.node.Node)¶
reparent(new_parent: simvx.core.node.Node)¶
get_node(path: str) simvx.core.node.Node¶
find_child(name: str, recursive: bool = False) simvx.core.node.Node | None¶
find(node_type: type) simvx.core.node.Node | None¶
find_all(node_type: type, recursive: bool = True) list¶
property path: str¶
add_to_group(group: str)¶
remove_from_group(group: str)¶
is_in_group(group: str) bool¶
ready() None¶
enter_tree() None¶
exit_tree() None¶
process(dt: float) None¶
physics_process(dt: float) None¶
draw(renderer) None¶
input_event(event: simvx.core.events.InputEvent) None¶
input(event: simvx.core.events.TreeInputEvent) None¶
unhandled_input(event: simvx.core.events.TreeInputEvent) None¶
start_coroutine(gen: simvx.core.descriptors.Coroutine) simvx.core.descriptors.CoroutineHandle¶
stop_coroutine(gen_or_handle)¶
destroy()¶
queue_free¶

None

property tree: simvx.core.scene_tree.SceneTree¶
get_tree() simvx.core.scene_tree.SceneTree¶
__getitem__(key: str)¶
classmethod get_properties() dict[str, simvx.core.descriptors.Property]¶
get_settings¶

None

__repr__()¶