# {py:mod}`simvx.core.physics.nodes` ```{py:module} simvx.core.physics.nodes ``` ```{autodoc2-docstring} simvx.core.physics.nodes :allowtitles: ``` ## Module Contents ### Classes ````{list-table} :class: autosummary longtable :align: left * - {py:obj}`Contact ` - ```{autodoc2-docstring} simvx.core.physics.nodes.Contact :summary: ``` * - {py:obj}`CollisionShape3D ` - ```{autodoc2-docstring} simvx.core.physics.nodes.CollisionShape3D :summary: ``` * - {py:obj}`PhysicsBody3D ` - ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D :summary: ``` * - {py:obj}`CharacterBody3D ` - ```{autodoc2-docstring} simvx.core.physics.nodes.CharacterBody3D :summary: ``` * - {py:obj}`Area3D ` - ```{autodoc2-docstring} simvx.core.physics.nodes.Area3D :summary: ``` * - {py:obj}`GravityArea3D ` - ```{autodoc2-docstring} simvx.core.physics.nodes.GravityArea3D :summary: ``` * - {py:obj}`Joint3D ` - ```{autodoc2-docstring} simvx.core.physics.nodes.Joint3D :summary: ``` * - {py:obj}`FixedJoint3D ` - ```{autodoc2-docstring} simvx.core.physics.nodes.FixedJoint3D :summary: ``` * - {py:obj}`PinJoint3D ` - ```{autodoc2-docstring} simvx.core.physics.nodes.PinJoint3D :summary: ``` * - {py:obj}`HingeJoint3D ` - ```{autodoc2-docstring} simvx.core.physics.nodes.HingeJoint3D :summary: ``` * - {py:obj}`SpringJoint3D ` - ```{autodoc2-docstring} simvx.core.physics.nodes.SpringJoint3D :summary: ``` ```` ### Data ````{list-table} :class: autosummary longtable :align: left * - {py:obj}`log ` - ```{autodoc2-docstring} simvx.core.physics.nodes.log :summary: ``` * - {py:obj}`__all__ ` - ```{autodoc2-docstring} simvx.core.physics.nodes.__all__ :summary: ``` ```` ### API ````{py:data} log :canonical: simvx.core.physics.nodes.log :value: > 'getLogger(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.log ``` ```` ````{py:data} __all__ :canonical: simvx.core.physics.nodes.__all__ :value: > ['BodyMode', 'Contact', 'CollisionShape3D', 'PhysicsBody3D', 'CharacterBody3D', 'Area3D', 'GravityAr... ```{autodoc2-docstring} simvx.core.physics.nodes.__all__ ``` ```` `````{py:class} Contact :canonical: simvx.core.physics.nodes.Contact ```{autodoc2-docstring} simvx.core.physics.nodes.Contact ``` ````{py:attribute} other :canonical: simvx.core.physics.nodes.Contact.other :type: PhysicsBody3D :value: > None ```{autodoc2-docstring} simvx.core.physics.nodes.Contact.other ``` ```` ````{py:attribute} point :canonical: simvx.core.physics.nodes.Contact.point :type: simvx.core.math.Vec3 :value: > None ```{autodoc2-docstring} simvx.core.physics.nodes.Contact.point ``` ```` ````{py:attribute} normal :canonical: simvx.core.physics.nodes.Contact.normal :type: simvx.core.math.Vec3 :value: > None ```{autodoc2-docstring} simvx.core.physics.nodes.Contact.normal ``` ```` ````{py:attribute} impulse :canonical: simvx.core.physics.nodes.Contact.impulse :type: float :value: > None ```{autodoc2-docstring} simvx.core.physics.nodes.Contact.impulse ``` ```` ````{py:attribute} velocity :canonical: simvx.core.physics.nodes.Contact.velocity :type: simvx.core.math.Vec3 :value: > None ```{autodoc2-docstring} simvx.core.physics.nodes.Contact.velocity ``` ```` ````` `````{py:class} CollisionShape3D(**kwargs) :canonical: simvx.core.physics.nodes.CollisionShape3D Bases: {py:obj}`simvx.core.nodes_3d.node3d.Node3D` ```{autodoc2-docstring} simvx.core.physics.nodes.CollisionShape3D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes.CollisionShape3D.__init__ ``` ````{py:attribute} shape :canonical: simvx.core.physics.nodes.CollisionShape3D.shape :type: simvx.core.physics.shapes.Shape :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.CollisionShape3D.shape ``` ```` ````{py:attribute} pickable :canonical: simvx.core.physics.nodes.CollisionShape3D.pickable :type: bool :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.CollisionShape3D.pickable ``` ```` ````{py:method} build_shape(world: simvx.core.physics.world.PhysicsWorld) -> simvx.core.physics.world.ShapeHandle :canonical: simvx.core.physics.nodes.CollisionShape3D.build_shape ```{autodoc2-docstring} simvx.core.physics.nodes.CollisionShape3D.build_shape ``` ```` ````{py:property} pick_radius :canonical: simvx.core.physics.nodes.CollisionShape3D.pick_radius :type: float ```{autodoc2-docstring} simvx.core.physics.nodes.CollisionShape3D.pick_radius ``` ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes.CollisionShape3D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes.CollisionShape3D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes.CollisionShape3D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes.CollisionShape3D.render_layer :value: > 'Property(...)' ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes.CollisionShape3D.rotation_degrees :type: simvx.core.math.types.Vec3 ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes.CollisionShape3D.world_position :type: simvx.core.math.types.Vec3 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes.CollisionShape3D.world_rotation :type: simvx.core.math.types.Quat ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes.CollisionShape3D.world_scale :type: simvx.core.math.types.Vec3 ```` ````{py:property} forward :canonical: simvx.core.physics.nodes.CollisionShape3D.forward :type: simvx.core.math.types.Vec3 ```` ````{py:property} right :canonical: simvx.core.physics.nodes.CollisionShape3D.right :type: simvx.core.math.types.Vec3 ```` ````{py:property} up :canonical: simvx.core.physics.nodes.CollisionShape3D.up :type: simvx.core.math.types.Vec3 ```` ````{py:method} translate(offset: tuple[float, float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes.CollisionShape3D.translate ```` ````{py:method} translate_global(offset: tuple[float, float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes.CollisionShape3D.translate_global ```` ````{py:method} rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float) :canonical: simvx.core.physics.nodes.CollisionShape3D.rotate ```` ````{py:method} rotate_x(angle: float) :canonical: simvx.core.physics.nodes.CollisionShape3D.rotate_x ```` ````{py:method} rotate_y(angle: float) :canonical: simvx.core.physics.nodes.CollisionShape3D.rotate_y ```` ````{py:method} rotate_z(angle: float) :canonical: simvx.core.physics.nodes.CollisionShape3D.rotate_z ```` ````{py:method} look_at(target: tuple[float, float, float] | numpy.ndarray, up=None) :canonical: simvx.core.physics.nodes.CollisionShape3D.look_at ```` ````{py:method} face_along(forward: tuple[float, float, float] | numpy.ndarray, up: tuple[float, float, float] | numpy.ndarray | None = None) -> None :canonical: simvx.core.physics.nodes.CollisionShape3D.face_along ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes.CollisionShape3D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes.CollisionShape3D.is_on_render_layer ```` ````{py:method} wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0) :canonical: simvx.core.physics.nodes.CollisionShape3D.wrap_bounds ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes.CollisionShape3D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes.CollisionShape3D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes.CollisionShape3D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes.CollisionShape3D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes.CollisionShape3D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes.CollisionShape3D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes.CollisionShape3D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes.CollisionShape3D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes.CollisionShape3D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes.CollisionShape3D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes.CollisionShape3D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes.CollisionShape3D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes.CollisionShape3D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes.CollisionShape3D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes.CollisionShape3D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes.CollisionShape3D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes.CollisionShape3D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes.CollisionShape3D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes.CollisionShape3D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes.CollisionShape3D.on_ready ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes.CollisionShape3D.on_enter_tree ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes.CollisionShape3D.on_exit_tree ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes.CollisionShape3D.on_update ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes.CollisionShape3D.on_fixed_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes.CollisionShape3D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes.CollisionShape3D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes.CollisionShape3D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes.CollisionShape3D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes.CollisionShape3D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes.CollisionShape3D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes.CollisionShape3D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes.CollisionShape3D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes.CollisionShape3D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes.CollisionShape3D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes.CollisionShape3D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes.CollisionShape3D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes.CollisionShape3D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes.CollisionShape3D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes.CollisionShape3D.__repr__ ```` ````` `````{py:class} PhysicsBody3D(**kwargs: object) :canonical: simvx.core.physics.nodes.PhysicsBody3D Bases: {py:obj}`simvx.core.nodes_3d.node3d.Node3D` ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D.__init__ ``` ````{py:attribute} mode :canonical: simvx.core.physics.nodes.PhysicsBody3D.mode :type: simvx.core.physics.world.BodyMode :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D.mode ``` ```` ````{py:attribute} mass :canonical: simvx.core.physics.nodes.PhysicsBody3D.mass :type: float :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D.mass ``` ```` ````{py:attribute} collision_layer :canonical: simvx.core.physics.nodes.PhysicsBody3D.collision_layer :type: int :value: > 'Bitmask(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D.collision_layer ``` ```` ````{py:attribute} collision_mask :canonical: simvx.core.physics.nodes.PhysicsBody3D.collision_mask :type: int :value: > 'Bitmask(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D.collision_mask ``` ```` ````{py:attribute} shape :canonical: simvx.core.physics.nodes.PhysicsBody3D.shape :type: simvx.core.physics.shapes.Shape | None :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D.shape ``` ```` ````{py:attribute} material :canonical: simvx.core.physics.nodes.PhysicsBody3D.material :type: simvx.core.physics.material.PhysicsMaterial :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D.material ``` ```` ````{py:attribute} continuous :canonical: simvx.core.physics.nodes.PhysicsBody3D.continuous :type: bool :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D.continuous ``` ```` ````{py:attribute} collided :canonical: simvx.core.physics.nodes.PhysicsBody3D.collided :value: > 'Signal(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D.collided ``` ```` ````{py:attribute} separated :canonical: simvx.core.physics.nodes.PhysicsBody3D.separated :value: > 'Signal(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D.separated ``` ```` ````{py:property} handle :canonical: simvx.core.physics.nodes.PhysicsBody3D.handle :type: simvx.core.physics.world.BodyHandle | None ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D.handle ``` ```` ````{py:property} world :canonical: simvx.core.physics.nodes.PhysicsBody3D.world :type: simvx.core.physics.world.PhysicsWorld | None ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D.world ``` ```` ````{py:property} is_sleeping :canonical: simvx.core.physics.nodes.PhysicsBody3D.is_sleeping :type: bool ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D.is_sleeping ``` ```` ````{py:property} velocity :canonical: simvx.core.physics.nodes.PhysicsBody3D.velocity :type: simvx.core.math.Vec3 ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D.velocity ``` ```` ````{py:property} spin :canonical: simvx.core.physics.nodes.PhysicsBody3D.spin :type: simvx.core.math.Vec3 ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D.spin ``` ```` ````{py:method} push(impulse: simvx.core.math.Vec3 | collections.abc.Sequence[float], *, at: simvx.core.math.Vec3 | collections.abc.Sequence[float] | None = None) -> None :canonical: simvx.core.physics.nodes.PhysicsBody3D.push ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D.push ``` ```` ````{py:method} spin_up(angular_impulse: simvx.core.math.Vec3 | collections.abc.Sequence[float]) -> None :canonical: simvx.core.physics.nodes.PhysicsBody3D.spin_up ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D.spin_up ``` ```` ````{py:method} add_force(force: simvx.core.math.Vec3 | collections.abc.Sequence[float], *, at: simvx.core.math.Vec3 | collections.abc.Sequence[float] | None = None) -> None :canonical: simvx.core.physics.nodes.PhysicsBody3D.add_force ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D.add_force ``` ```` ````{py:method} add_torque(torque: simvx.core.math.Vec3 | collections.abc.Sequence[float]) -> None :canonical: simvx.core.physics.nodes.PhysicsBody3D.add_torque ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D.add_torque ``` ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes.PhysicsBody3D.on_enter_tree ```` ````{py:method} move_and_collide(velocity: simvx.core.math.Vec3 | collections.abc.Sequence[float], dt: float = 1.0) -> simvx.core.physics.nodes.Contact | None :canonical: simvx.core.physics.nodes.PhysicsBody3D.move_and_collide ```{autodoc2-docstring} simvx.core.physics.nodes.PhysicsBody3D.move_and_collide ``` ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes.PhysicsBody3D.on_exit_tree ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes.PhysicsBody3D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes.PhysicsBody3D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes.PhysicsBody3D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes.PhysicsBody3D.render_layer :value: > 'Property(...)' ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes.PhysicsBody3D.rotation_degrees :type: simvx.core.math.types.Vec3 ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes.PhysicsBody3D.world_position :type: simvx.core.math.types.Vec3 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes.PhysicsBody3D.world_rotation :type: simvx.core.math.types.Quat ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes.PhysicsBody3D.world_scale :type: simvx.core.math.types.Vec3 ```` ````{py:property} forward :canonical: simvx.core.physics.nodes.PhysicsBody3D.forward :type: simvx.core.math.types.Vec3 ```` ````{py:property} right :canonical: simvx.core.physics.nodes.PhysicsBody3D.right :type: simvx.core.math.types.Vec3 ```` ````{py:property} up :canonical: simvx.core.physics.nodes.PhysicsBody3D.up :type: simvx.core.math.types.Vec3 ```` ````{py:method} translate(offset: tuple[float, float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes.PhysicsBody3D.translate ```` ````{py:method} translate_global(offset: tuple[float, float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes.PhysicsBody3D.translate_global ```` ````{py:method} rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float) :canonical: simvx.core.physics.nodes.PhysicsBody3D.rotate ```` ````{py:method} rotate_x(angle: float) :canonical: simvx.core.physics.nodes.PhysicsBody3D.rotate_x ```` ````{py:method} rotate_y(angle: float) :canonical: simvx.core.physics.nodes.PhysicsBody3D.rotate_y ```` ````{py:method} rotate_z(angle: float) :canonical: simvx.core.physics.nodes.PhysicsBody3D.rotate_z ```` ````{py:method} look_at(target: tuple[float, float, float] | numpy.ndarray, up=None) :canonical: simvx.core.physics.nodes.PhysicsBody3D.look_at ```` ````{py:method} face_along(forward: tuple[float, float, float] | numpy.ndarray, up: tuple[float, float, float] | numpy.ndarray | None = None) -> None :canonical: simvx.core.physics.nodes.PhysicsBody3D.face_along ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes.PhysicsBody3D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes.PhysicsBody3D.is_on_render_layer ```` ````{py:method} wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0) :canonical: simvx.core.physics.nodes.PhysicsBody3D.wrap_bounds ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes.PhysicsBody3D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes.PhysicsBody3D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes.PhysicsBody3D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes.PhysicsBody3D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes.PhysicsBody3D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes.PhysicsBody3D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes.PhysicsBody3D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes.PhysicsBody3D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes.PhysicsBody3D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes.PhysicsBody3D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes.PhysicsBody3D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes.PhysicsBody3D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes.PhysicsBody3D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes.PhysicsBody3D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes.PhysicsBody3D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes.PhysicsBody3D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes.PhysicsBody3D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes.PhysicsBody3D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes.PhysicsBody3D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes.PhysicsBody3D.on_ready ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes.PhysicsBody3D.on_update ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes.PhysicsBody3D.on_fixed_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes.PhysicsBody3D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes.PhysicsBody3D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes.PhysicsBody3D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes.PhysicsBody3D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes.PhysicsBody3D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes.PhysicsBody3D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes.PhysicsBody3D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes.PhysicsBody3D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes.PhysicsBody3D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes.PhysicsBody3D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes.PhysicsBody3D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes.PhysicsBody3D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes.PhysicsBody3D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes.PhysicsBody3D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes.PhysicsBody3D.__repr__ ```` ````` `````{py:class} CharacterBody3D(**kwargs: object) :canonical: simvx.core.physics.nodes.CharacterBody3D Bases: {py:obj}`simvx.core.nodes_3d.node3d.Node3D` ```{autodoc2-docstring} simvx.core.physics.nodes.CharacterBody3D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes.CharacterBody3D.__init__ ``` ````{py:attribute} slope_limit :canonical: simvx.core.physics.nodes.CharacterBody3D.slope_limit :type: float :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.CharacterBody3D.slope_limit ``` ```` ````{py:attribute} step_height :canonical: simvx.core.physics.nodes.CharacterBody3D.step_height :type: float :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.CharacterBody3D.step_height ``` ```` ````{py:attribute} max_slides :canonical: simvx.core.physics.nodes.CharacterBody3D.max_slides :type: int :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.CharacterBody3D.max_slides ``` ```` ````{py:attribute} skin_width :canonical: simvx.core.physics.nodes.CharacterBody3D.skin_width :type: float :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.CharacterBody3D.skin_width ``` ```` ````{py:attribute} collision_layer :canonical: simvx.core.physics.nodes.CharacterBody3D.collision_layer :type: int :value: > 'Bitmask(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.CharacterBody3D.collision_layer ``` ```` ````{py:attribute} collision_mask :canonical: simvx.core.physics.nodes.CharacterBody3D.collision_mask :type: int :value: > 'Bitmask(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.CharacterBody3D.collision_mask ``` ```` ````{py:attribute} shape :canonical: simvx.core.physics.nodes.CharacterBody3D.shape :type: simvx.core.physics.shapes.Shape | None :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.CharacterBody3D.shape ``` ```` ````{py:property} character :canonical: simvx.core.physics.nodes.CharacterBody3D.character :type: simvx.core.physics.world.CharacterHandle | None ```{autodoc2-docstring} simvx.core.physics.nodes.CharacterBody3D.character ``` ```` ````{py:property} world :canonical: simvx.core.physics.nodes.CharacterBody3D.world :type: simvx.core.physics.world.PhysicsWorld | None ```{autodoc2-docstring} simvx.core.physics.nodes.CharacterBody3D.world ``` ```` ````{py:method} is_on_floor() -> bool :canonical: simvx.core.physics.nodes.CharacterBody3D.is_on_floor ```{autodoc2-docstring} simvx.core.physics.nodes.CharacterBody3D.is_on_floor ``` ```` ````{py:method} is_on_wall() -> bool :canonical: simvx.core.physics.nodes.CharacterBody3D.is_on_wall ```{autodoc2-docstring} simvx.core.physics.nodes.CharacterBody3D.is_on_wall ``` ```` ````{py:method} is_on_ceiling() -> bool :canonical: simvx.core.physics.nodes.CharacterBody3D.is_on_ceiling ```{autodoc2-docstring} simvx.core.physics.nodes.CharacterBody3D.is_on_ceiling ``` ```` ````{py:method} move_and_slide(dt: float) -> None :canonical: simvx.core.physics.nodes.CharacterBody3D.move_and_slide ```{autodoc2-docstring} simvx.core.physics.nodes.CharacterBody3D.move_and_slide ``` ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes.CharacterBody3D.on_enter_tree ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes.CharacterBody3D.on_exit_tree ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes.CharacterBody3D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes.CharacterBody3D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes.CharacterBody3D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes.CharacterBody3D.render_layer :value: > 'Property(...)' ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes.CharacterBody3D.rotation_degrees :type: simvx.core.math.types.Vec3 ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes.CharacterBody3D.world_position :type: simvx.core.math.types.Vec3 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes.CharacterBody3D.world_rotation :type: simvx.core.math.types.Quat ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes.CharacterBody3D.world_scale :type: simvx.core.math.types.Vec3 ```` ````{py:property} forward :canonical: simvx.core.physics.nodes.CharacterBody3D.forward :type: simvx.core.math.types.Vec3 ```` ````{py:property} right :canonical: simvx.core.physics.nodes.CharacterBody3D.right :type: simvx.core.math.types.Vec3 ```` ````{py:property} up :canonical: simvx.core.physics.nodes.CharacterBody3D.up :type: simvx.core.math.types.Vec3 ```` ````{py:method} translate(offset: tuple[float, float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes.CharacterBody3D.translate ```` ````{py:method} translate_global(offset: tuple[float, float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes.CharacterBody3D.translate_global ```` ````{py:method} rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float) :canonical: simvx.core.physics.nodes.CharacterBody3D.rotate ```` ````{py:method} rotate_x(angle: float) :canonical: simvx.core.physics.nodes.CharacterBody3D.rotate_x ```` ````{py:method} rotate_y(angle: float) :canonical: simvx.core.physics.nodes.CharacterBody3D.rotate_y ```` ````{py:method} rotate_z(angle: float) :canonical: simvx.core.physics.nodes.CharacterBody3D.rotate_z ```` ````{py:method} look_at(target: tuple[float, float, float] | numpy.ndarray, up=None) :canonical: simvx.core.physics.nodes.CharacterBody3D.look_at ```` ````{py:method} face_along(forward: tuple[float, float, float] | numpy.ndarray, up: tuple[float, float, float] | numpy.ndarray | None = None) -> None :canonical: simvx.core.physics.nodes.CharacterBody3D.face_along ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes.CharacterBody3D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes.CharacterBody3D.is_on_render_layer ```` ````{py:method} wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0) :canonical: simvx.core.physics.nodes.CharacterBody3D.wrap_bounds ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes.CharacterBody3D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes.CharacterBody3D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes.CharacterBody3D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes.CharacterBody3D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes.CharacterBody3D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes.CharacterBody3D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes.CharacterBody3D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes.CharacterBody3D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes.CharacterBody3D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes.CharacterBody3D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes.CharacterBody3D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes.CharacterBody3D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes.CharacterBody3D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes.CharacterBody3D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes.CharacterBody3D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes.CharacterBody3D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes.CharacterBody3D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes.CharacterBody3D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes.CharacterBody3D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes.CharacterBody3D.on_ready ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes.CharacterBody3D.on_update ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes.CharacterBody3D.on_fixed_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes.CharacterBody3D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes.CharacterBody3D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes.CharacterBody3D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes.CharacterBody3D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes.CharacterBody3D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes.CharacterBody3D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes.CharacterBody3D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes.CharacterBody3D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes.CharacterBody3D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes.CharacterBody3D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes.CharacterBody3D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes.CharacterBody3D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes.CharacterBody3D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes.CharacterBody3D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes.CharacterBody3D.__repr__ ```` ````` `````{py:class} Area3D(**kwargs: object) :canonical: simvx.core.physics.nodes.Area3D Bases: {py:obj}`simvx.core.nodes_3d.node3d.Node3D` ```{autodoc2-docstring} simvx.core.physics.nodes.Area3D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes.Area3D.__init__ ``` ````{py:attribute} collision_layer :canonical: simvx.core.physics.nodes.Area3D.collision_layer :type: int :value: > 'Bitmask(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.Area3D.collision_layer ``` ```` ````{py:attribute} collision_mask :canonical: simvx.core.physics.nodes.Area3D.collision_mask :type: int :value: > 'Bitmask(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.Area3D.collision_mask ``` ```` ````{py:attribute} monitoring :canonical: simvx.core.physics.nodes.Area3D.monitoring :type: bool :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.Area3D.monitoring ``` ```` ````{py:attribute} shape :canonical: simvx.core.physics.nodes.Area3D.shape :type: simvx.core.physics.shapes.Shape | None :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.Area3D.shape ``` ```` ````{py:attribute} body_entered :canonical: simvx.core.physics.nodes.Area3D.body_entered :value: > 'Signal(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.Area3D.body_entered ``` ```` ````{py:attribute} body_exited :canonical: simvx.core.physics.nodes.Area3D.body_exited :value: > 'Signal(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.Area3D.body_exited ``` ```` ````{py:attribute} area_entered :canonical: simvx.core.physics.nodes.Area3D.area_entered :value: > 'Signal(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.Area3D.area_entered ``` ```` ````{py:attribute} area_exited :canonical: simvx.core.physics.nodes.Area3D.area_exited :value: > 'Signal(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.Area3D.area_exited ``` ```` ````{py:property} handle :canonical: simvx.core.physics.nodes.Area3D.handle :type: simvx.core.physics.world.BodyHandle | None ```{autodoc2-docstring} simvx.core.physics.nodes.Area3D.handle ``` ```` ````{py:property} world :canonical: simvx.core.physics.nodes.Area3D.world :type: simvx.core.physics.world.PhysicsWorld | None ```{autodoc2-docstring} simvx.core.physics.nodes.Area3D.world ``` ```` ````{py:method} get_overlapping_bodies(*, group: str | None = None, type: simvx.core.physics.nodes.Area3D.get_overlapping_bodies.type[simvx.core.physics.nodes.PhysicsBody3D] | None = None) -> list[simvx.core.physics.nodes.PhysicsBody3D] :canonical: simvx.core.physics.nodes.Area3D.get_overlapping_bodies ```{autodoc2-docstring} simvx.core.physics.nodes.Area3D.get_overlapping_bodies ``` ```` ````{py:method} get_overlapping_areas() -> list[simvx.core.physics.nodes.Area3D] :canonical: simvx.core.physics.nodes.Area3D.get_overlapping_areas ```{autodoc2-docstring} simvx.core.physics.nodes.Area3D.get_overlapping_areas ``` ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes.Area3D.on_enter_tree ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes.Area3D.on_exit_tree ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes.Area3D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes.Area3D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes.Area3D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes.Area3D.render_layer :value: > 'Property(...)' ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes.Area3D.rotation_degrees :type: simvx.core.math.types.Vec3 ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes.Area3D.world_position :type: simvx.core.math.types.Vec3 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes.Area3D.world_rotation :type: simvx.core.math.types.Quat ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes.Area3D.world_scale :type: simvx.core.math.types.Vec3 ```` ````{py:property} forward :canonical: simvx.core.physics.nodes.Area3D.forward :type: simvx.core.math.types.Vec3 ```` ````{py:property} right :canonical: simvx.core.physics.nodes.Area3D.right :type: simvx.core.math.types.Vec3 ```` ````{py:property} up :canonical: simvx.core.physics.nodes.Area3D.up :type: simvx.core.math.types.Vec3 ```` ````{py:method} translate(offset: tuple[float, float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes.Area3D.translate ```` ````{py:method} translate_global(offset: tuple[float, float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes.Area3D.translate_global ```` ````{py:method} rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float) :canonical: simvx.core.physics.nodes.Area3D.rotate ```` ````{py:method} rotate_x(angle: float) :canonical: simvx.core.physics.nodes.Area3D.rotate_x ```` ````{py:method} rotate_y(angle: float) :canonical: simvx.core.physics.nodes.Area3D.rotate_y ```` ````{py:method} rotate_z(angle: float) :canonical: simvx.core.physics.nodes.Area3D.rotate_z ```` ````{py:method} look_at(target: tuple[float, float, float] | numpy.ndarray, up=None) :canonical: simvx.core.physics.nodes.Area3D.look_at ```` ````{py:method} face_along(forward: tuple[float, float, float] | numpy.ndarray, up: tuple[float, float, float] | numpy.ndarray | None = None) -> None :canonical: simvx.core.physics.nodes.Area3D.face_along ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes.Area3D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes.Area3D.is_on_render_layer ```` ````{py:method} wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0) :canonical: simvx.core.physics.nodes.Area3D.wrap_bounds ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes.Area3D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes.Area3D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes.Area3D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes.Area3D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes.Area3D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes.Area3D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes.Area3D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes.Area3D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes.Area3D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes.Area3D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes.Area3D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes.Area3D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes.Area3D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes.Area3D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes.Area3D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes.Area3D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes.Area3D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes.Area3D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes.Area3D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes.Area3D.on_ready ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes.Area3D.on_update ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes.Area3D.on_fixed_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes.Area3D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes.Area3D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes.Area3D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes.Area3D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes.Area3D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes.Area3D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes.Area3D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes.Area3D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes.Area3D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes.Area3D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes.Area3D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes.Area3D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes.Area3D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes.Area3D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes.Area3D.__repr__ ```` ````` `````{py:class} GravityArea3D(**kwargs: object) :canonical: simvx.core.physics.nodes.GravityArea3D Bases: {py:obj}`simvx.core.physics.nodes.Area3D` ```{autodoc2-docstring} simvx.core.physics.nodes.GravityArea3D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes.GravityArea3D.__init__ ``` ````{py:attribute} gravity :canonical: simvx.core.physics.nodes.GravityArea3D.gravity :type: simvx.core.math.Vec3 :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.GravityArea3D.gravity ``` ```` ````{py:attribute} point_gravity :canonical: simvx.core.physics.nodes.GravityArea3D.point_gravity :type: bool :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.GravityArea3D.point_gravity ``` ```` ````{py:attribute} point_strength :canonical: simvx.core.physics.nodes.GravityArea3D.point_strength :type: float :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.GravityArea3D.point_strength ``` ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes.GravityArea3D.on_fixed_update ```{autodoc2-docstring} simvx.core.physics.nodes.GravityArea3D.on_fixed_update ``` ```` ````{py:attribute} collision_layer :canonical: simvx.core.physics.nodes.GravityArea3D.collision_layer :type: int :value: > 'Bitmask(...)' ```` ````{py:attribute} collision_mask :canonical: simvx.core.physics.nodes.GravityArea3D.collision_mask :type: int :value: > 'Bitmask(...)' ```` ````{py:attribute} monitoring :canonical: simvx.core.physics.nodes.GravityArea3D.monitoring :type: bool :value: > 'Property(...)' ```` ````{py:attribute} shape :canonical: simvx.core.physics.nodes.GravityArea3D.shape :type: simvx.core.physics.shapes.Shape | None :value: > 'Property(...)' ```` ````{py:attribute} body_entered :canonical: simvx.core.physics.nodes.GravityArea3D.body_entered :value: > 'Signal(...)' ```` ````{py:attribute} body_exited :canonical: simvx.core.physics.nodes.GravityArea3D.body_exited :value: > 'Signal(...)' ```` ````{py:attribute} area_entered :canonical: simvx.core.physics.nodes.GravityArea3D.area_entered :value: > 'Signal(...)' ```` ````{py:attribute} area_exited :canonical: simvx.core.physics.nodes.GravityArea3D.area_exited :value: > 'Signal(...)' ```` ````{py:property} handle :canonical: simvx.core.physics.nodes.GravityArea3D.handle :type: simvx.core.physics.world.BodyHandle | None ```` ````{py:property} world :canonical: simvx.core.physics.nodes.GravityArea3D.world :type: simvx.core.physics.world.PhysicsWorld | None ```` ````{py:method} get_overlapping_bodies(*, group: str | None = None, type: simvx.core.physics.nodes.Area3D.get_overlapping_bodies.type[simvx.core.physics.nodes.PhysicsBody3D] | None = None) -> list[simvx.core.physics.nodes.PhysicsBody3D] :canonical: simvx.core.physics.nodes.GravityArea3D.get_overlapping_bodies ```` ````{py:method} get_overlapping_areas() -> list[simvx.core.physics.nodes.Area3D] :canonical: simvx.core.physics.nodes.GravityArea3D.get_overlapping_areas ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes.GravityArea3D.on_enter_tree ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes.GravityArea3D.on_exit_tree ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes.GravityArea3D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes.GravityArea3D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes.GravityArea3D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes.GravityArea3D.render_layer :value: > 'Property(...)' ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes.GravityArea3D.rotation_degrees :type: simvx.core.math.types.Vec3 ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes.GravityArea3D.world_position :type: simvx.core.math.types.Vec3 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes.GravityArea3D.world_rotation :type: simvx.core.math.types.Quat ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes.GravityArea3D.world_scale :type: simvx.core.math.types.Vec3 ```` ````{py:property} forward :canonical: simvx.core.physics.nodes.GravityArea3D.forward :type: simvx.core.math.types.Vec3 ```` ````{py:property} right :canonical: simvx.core.physics.nodes.GravityArea3D.right :type: simvx.core.math.types.Vec3 ```` ````{py:property} up :canonical: simvx.core.physics.nodes.GravityArea3D.up :type: simvx.core.math.types.Vec3 ```` ````{py:method} translate(offset: tuple[float, float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes.GravityArea3D.translate ```` ````{py:method} translate_global(offset: tuple[float, float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes.GravityArea3D.translate_global ```` ````{py:method} rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float) :canonical: simvx.core.physics.nodes.GravityArea3D.rotate ```` ````{py:method} rotate_x(angle: float) :canonical: simvx.core.physics.nodes.GravityArea3D.rotate_x ```` ````{py:method} rotate_y(angle: float) :canonical: simvx.core.physics.nodes.GravityArea3D.rotate_y ```` ````{py:method} rotate_z(angle: float) :canonical: simvx.core.physics.nodes.GravityArea3D.rotate_z ```` ````{py:method} look_at(target: tuple[float, float, float] | numpy.ndarray, up=None) :canonical: simvx.core.physics.nodes.GravityArea3D.look_at ```` ````{py:method} face_along(forward: tuple[float, float, float] | numpy.ndarray, up: tuple[float, float, float] | numpy.ndarray | None = None) -> None :canonical: simvx.core.physics.nodes.GravityArea3D.face_along ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes.GravityArea3D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes.GravityArea3D.is_on_render_layer ```` ````{py:method} wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0) :canonical: simvx.core.physics.nodes.GravityArea3D.wrap_bounds ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes.GravityArea3D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes.GravityArea3D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes.GravityArea3D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes.GravityArea3D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes.GravityArea3D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes.GravityArea3D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes.GravityArea3D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes.GravityArea3D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes.GravityArea3D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes.GravityArea3D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes.GravityArea3D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes.GravityArea3D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes.GravityArea3D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes.GravityArea3D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes.GravityArea3D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes.GravityArea3D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes.GravityArea3D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes.GravityArea3D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes.GravityArea3D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes.GravityArea3D.on_ready ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes.GravityArea3D.on_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes.GravityArea3D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes.GravityArea3D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes.GravityArea3D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes.GravityArea3D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes.GravityArea3D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes.GravityArea3D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes.GravityArea3D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes.GravityArea3D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes.GravityArea3D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes.GravityArea3D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes.GravityArea3D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes.GravityArea3D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes.GravityArea3D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes.GravityArea3D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes.GravityArea3D.__repr__ ```` ````` `````{py:class} Joint3D(*, body_a: simvx.core.physics.nodes.PhysicsBody3D | None = None, body_b: simvx.core.physics.nodes.PhysicsBody3D | None = None, **kwargs: object) :canonical: simvx.core.physics.nodes.Joint3D Bases: {py:obj}`simvx.core.nodes_3d.node3d.Node3D` ```{autodoc2-docstring} simvx.core.physics.nodes.Joint3D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes.Joint3D.__init__ ``` ````{py:property} joint :canonical: simvx.core.physics.nodes.Joint3D.joint :type: simvx.core.physics.world.JointHandle | None ```{autodoc2-docstring} simvx.core.physics.nodes.Joint3D.joint ``` ```` ````{py:property} world :canonical: simvx.core.physics.nodes.Joint3D.world :type: simvx.core.physics.world.PhysicsWorld | None ```{autodoc2-docstring} simvx.core.physics.nodes.Joint3D.world ``` ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes.Joint3D.on_enter_tree ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes.Joint3D.on_exit_tree ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes.Joint3D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes.Joint3D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes.Joint3D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes.Joint3D.render_layer :value: > 'Property(...)' ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes.Joint3D.rotation_degrees :type: simvx.core.math.types.Vec3 ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes.Joint3D.world_position :type: simvx.core.math.types.Vec3 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes.Joint3D.world_rotation :type: simvx.core.math.types.Quat ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes.Joint3D.world_scale :type: simvx.core.math.types.Vec3 ```` ````{py:property} forward :canonical: simvx.core.physics.nodes.Joint3D.forward :type: simvx.core.math.types.Vec3 ```` ````{py:property} right :canonical: simvx.core.physics.nodes.Joint3D.right :type: simvx.core.math.types.Vec3 ```` ````{py:property} up :canonical: simvx.core.physics.nodes.Joint3D.up :type: simvx.core.math.types.Vec3 ```` ````{py:method} translate(offset: tuple[float, float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes.Joint3D.translate ```` ````{py:method} translate_global(offset: tuple[float, float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes.Joint3D.translate_global ```` ````{py:method} rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float) :canonical: simvx.core.physics.nodes.Joint3D.rotate ```` ````{py:method} rotate_x(angle: float) :canonical: simvx.core.physics.nodes.Joint3D.rotate_x ```` ````{py:method} rotate_y(angle: float) :canonical: simvx.core.physics.nodes.Joint3D.rotate_y ```` ````{py:method} rotate_z(angle: float) :canonical: simvx.core.physics.nodes.Joint3D.rotate_z ```` ````{py:method} look_at(target: tuple[float, float, float] | numpy.ndarray, up=None) :canonical: simvx.core.physics.nodes.Joint3D.look_at ```` ````{py:method} face_along(forward: tuple[float, float, float] | numpy.ndarray, up: tuple[float, float, float] | numpy.ndarray | None = None) -> None :canonical: simvx.core.physics.nodes.Joint3D.face_along ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes.Joint3D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes.Joint3D.is_on_render_layer ```` ````{py:method} wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0) :canonical: simvx.core.physics.nodes.Joint3D.wrap_bounds ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes.Joint3D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes.Joint3D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes.Joint3D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes.Joint3D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes.Joint3D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes.Joint3D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes.Joint3D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes.Joint3D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes.Joint3D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes.Joint3D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes.Joint3D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes.Joint3D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes.Joint3D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes.Joint3D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes.Joint3D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes.Joint3D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes.Joint3D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes.Joint3D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes.Joint3D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes.Joint3D.on_ready ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes.Joint3D.on_update ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes.Joint3D.on_fixed_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes.Joint3D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes.Joint3D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes.Joint3D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes.Joint3D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes.Joint3D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes.Joint3D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes.Joint3D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes.Joint3D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes.Joint3D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes.Joint3D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes.Joint3D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes.Joint3D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes.Joint3D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes.Joint3D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes.Joint3D.__repr__ ```` ````` `````{py:class} FixedJoint3D(*, body_a: simvx.core.physics.nodes.PhysicsBody3D | None = None, body_b: simvx.core.physics.nodes.PhysicsBody3D | None = None, **kwargs: object) :canonical: simvx.core.physics.nodes.FixedJoint3D Bases: {py:obj}`simvx.core.physics.nodes.Joint3D` ```{autodoc2-docstring} simvx.core.physics.nodes.FixedJoint3D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes.FixedJoint3D.__init__ ``` ````{py:property} joint :canonical: simvx.core.physics.nodes.FixedJoint3D.joint :type: simvx.core.physics.world.JointHandle | None ```` ````{py:property} world :canonical: simvx.core.physics.nodes.FixedJoint3D.world :type: simvx.core.physics.world.PhysicsWorld | None ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes.FixedJoint3D.on_enter_tree ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes.FixedJoint3D.on_exit_tree ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes.FixedJoint3D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes.FixedJoint3D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes.FixedJoint3D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes.FixedJoint3D.render_layer :value: > 'Property(...)' ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes.FixedJoint3D.rotation_degrees :type: simvx.core.math.types.Vec3 ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes.FixedJoint3D.world_position :type: simvx.core.math.types.Vec3 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes.FixedJoint3D.world_rotation :type: simvx.core.math.types.Quat ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes.FixedJoint3D.world_scale :type: simvx.core.math.types.Vec3 ```` ````{py:property} forward :canonical: simvx.core.physics.nodes.FixedJoint3D.forward :type: simvx.core.math.types.Vec3 ```` ````{py:property} right :canonical: simvx.core.physics.nodes.FixedJoint3D.right :type: simvx.core.math.types.Vec3 ```` ````{py:property} up :canonical: simvx.core.physics.nodes.FixedJoint3D.up :type: simvx.core.math.types.Vec3 ```` ````{py:method} translate(offset: tuple[float, float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes.FixedJoint3D.translate ```` ````{py:method} translate_global(offset: tuple[float, float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes.FixedJoint3D.translate_global ```` ````{py:method} rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float) :canonical: simvx.core.physics.nodes.FixedJoint3D.rotate ```` ````{py:method} rotate_x(angle: float) :canonical: simvx.core.physics.nodes.FixedJoint3D.rotate_x ```` ````{py:method} rotate_y(angle: float) :canonical: simvx.core.physics.nodes.FixedJoint3D.rotate_y ```` ````{py:method} rotate_z(angle: float) :canonical: simvx.core.physics.nodes.FixedJoint3D.rotate_z ```` ````{py:method} look_at(target: tuple[float, float, float] | numpy.ndarray, up=None) :canonical: simvx.core.physics.nodes.FixedJoint3D.look_at ```` ````{py:method} face_along(forward: tuple[float, float, float] | numpy.ndarray, up: tuple[float, float, float] | numpy.ndarray | None = None) -> None :canonical: simvx.core.physics.nodes.FixedJoint3D.face_along ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes.FixedJoint3D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes.FixedJoint3D.is_on_render_layer ```` ````{py:method} wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0) :canonical: simvx.core.physics.nodes.FixedJoint3D.wrap_bounds ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes.FixedJoint3D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes.FixedJoint3D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes.FixedJoint3D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes.FixedJoint3D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes.FixedJoint3D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes.FixedJoint3D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes.FixedJoint3D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes.FixedJoint3D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes.FixedJoint3D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes.FixedJoint3D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes.FixedJoint3D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes.FixedJoint3D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes.FixedJoint3D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes.FixedJoint3D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes.FixedJoint3D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes.FixedJoint3D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes.FixedJoint3D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes.FixedJoint3D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes.FixedJoint3D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes.FixedJoint3D.on_ready ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes.FixedJoint3D.on_update ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes.FixedJoint3D.on_fixed_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes.FixedJoint3D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes.FixedJoint3D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes.FixedJoint3D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes.FixedJoint3D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes.FixedJoint3D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes.FixedJoint3D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes.FixedJoint3D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes.FixedJoint3D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes.FixedJoint3D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes.FixedJoint3D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes.FixedJoint3D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes.FixedJoint3D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes.FixedJoint3D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes.FixedJoint3D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes.FixedJoint3D.__repr__ ```` ````` `````{py:class} PinJoint3D(*, body_a: simvx.core.physics.nodes.PhysicsBody3D | None = None, body_b: simvx.core.physics.nodes.PhysicsBody3D | None = None, **kwargs: object) :canonical: simvx.core.physics.nodes.PinJoint3D Bases: {py:obj}`simvx.core.physics.nodes.Joint3D` ```{autodoc2-docstring} simvx.core.physics.nodes.PinJoint3D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes.PinJoint3D.__init__ ``` ````{py:attribute} anchor :canonical: simvx.core.physics.nodes.PinJoint3D.anchor :type: simvx.core.math.Vec3 :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.PinJoint3D.anchor ``` ```` ````{py:property} joint :canonical: simvx.core.physics.nodes.PinJoint3D.joint :type: simvx.core.physics.world.JointHandle | None ```` ````{py:property} world :canonical: simvx.core.physics.nodes.PinJoint3D.world :type: simvx.core.physics.world.PhysicsWorld | None ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes.PinJoint3D.on_enter_tree ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes.PinJoint3D.on_exit_tree ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes.PinJoint3D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes.PinJoint3D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes.PinJoint3D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes.PinJoint3D.render_layer :value: > 'Property(...)' ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes.PinJoint3D.rotation_degrees :type: simvx.core.math.types.Vec3 ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes.PinJoint3D.world_position :type: simvx.core.math.types.Vec3 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes.PinJoint3D.world_rotation :type: simvx.core.math.types.Quat ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes.PinJoint3D.world_scale :type: simvx.core.math.types.Vec3 ```` ````{py:property} forward :canonical: simvx.core.physics.nodes.PinJoint3D.forward :type: simvx.core.math.types.Vec3 ```` ````{py:property} right :canonical: simvx.core.physics.nodes.PinJoint3D.right :type: simvx.core.math.types.Vec3 ```` ````{py:property} up :canonical: simvx.core.physics.nodes.PinJoint3D.up :type: simvx.core.math.types.Vec3 ```` ````{py:method} translate(offset: tuple[float, float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes.PinJoint3D.translate ```` ````{py:method} translate_global(offset: tuple[float, float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes.PinJoint3D.translate_global ```` ````{py:method} rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float) :canonical: simvx.core.physics.nodes.PinJoint3D.rotate ```` ````{py:method} rotate_x(angle: float) :canonical: simvx.core.physics.nodes.PinJoint3D.rotate_x ```` ````{py:method} rotate_y(angle: float) :canonical: simvx.core.physics.nodes.PinJoint3D.rotate_y ```` ````{py:method} rotate_z(angle: float) :canonical: simvx.core.physics.nodes.PinJoint3D.rotate_z ```` ````{py:method} look_at(target: tuple[float, float, float] | numpy.ndarray, up=None) :canonical: simvx.core.physics.nodes.PinJoint3D.look_at ```` ````{py:method} face_along(forward: tuple[float, float, float] | numpy.ndarray, up: tuple[float, float, float] | numpy.ndarray | None = None) -> None :canonical: simvx.core.physics.nodes.PinJoint3D.face_along ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes.PinJoint3D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes.PinJoint3D.is_on_render_layer ```` ````{py:method} wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0) :canonical: simvx.core.physics.nodes.PinJoint3D.wrap_bounds ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes.PinJoint3D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes.PinJoint3D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes.PinJoint3D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes.PinJoint3D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes.PinJoint3D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes.PinJoint3D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes.PinJoint3D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes.PinJoint3D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes.PinJoint3D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes.PinJoint3D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes.PinJoint3D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes.PinJoint3D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes.PinJoint3D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes.PinJoint3D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes.PinJoint3D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes.PinJoint3D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes.PinJoint3D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes.PinJoint3D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes.PinJoint3D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes.PinJoint3D.on_ready ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes.PinJoint3D.on_update ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes.PinJoint3D.on_fixed_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes.PinJoint3D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes.PinJoint3D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes.PinJoint3D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes.PinJoint3D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes.PinJoint3D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes.PinJoint3D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes.PinJoint3D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes.PinJoint3D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes.PinJoint3D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes.PinJoint3D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes.PinJoint3D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes.PinJoint3D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes.PinJoint3D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes.PinJoint3D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes.PinJoint3D.__repr__ ```` ````` `````{py:class} HingeJoint3D(*, body_a: simvx.core.physics.nodes.PhysicsBody3D | None = None, body_b: simvx.core.physics.nodes.PhysicsBody3D | None = None, **kwargs: object) :canonical: simvx.core.physics.nodes.HingeJoint3D Bases: {py:obj}`simvx.core.physics.nodes.Joint3D` ```{autodoc2-docstring} simvx.core.physics.nodes.HingeJoint3D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes.HingeJoint3D.__init__ ``` ````{py:attribute} anchor :canonical: simvx.core.physics.nodes.HingeJoint3D.anchor :type: simvx.core.math.Vec3 :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.HingeJoint3D.anchor ``` ```` ````{py:attribute} axis :canonical: simvx.core.physics.nodes.HingeJoint3D.axis :type: simvx.core.math.Vec3 :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.HingeJoint3D.axis ``` ```` ````{py:property} joint :canonical: simvx.core.physics.nodes.HingeJoint3D.joint :type: simvx.core.physics.world.JointHandle | None ```` ````{py:property} world :canonical: simvx.core.physics.nodes.HingeJoint3D.world :type: simvx.core.physics.world.PhysicsWorld | None ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes.HingeJoint3D.on_enter_tree ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes.HingeJoint3D.on_exit_tree ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes.HingeJoint3D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes.HingeJoint3D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes.HingeJoint3D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes.HingeJoint3D.render_layer :value: > 'Property(...)' ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes.HingeJoint3D.rotation_degrees :type: simvx.core.math.types.Vec3 ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes.HingeJoint3D.world_position :type: simvx.core.math.types.Vec3 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes.HingeJoint3D.world_rotation :type: simvx.core.math.types.Quat ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes.HingeJoint3D.world_scale :type: simvx.core.math.types.Vec3 ```` ````{py:property} forward :canonical: simvx.core.physics.nodes.HingeJoint3D.forward :type: simvx.core.math.types.Vec3 ```` ````{py:property} right :canonical: simvx.core.physics.nodes.HingeJoint3D.right :type: simvx.core.math.types.Vec3 ```` ````{py:property} up :canonical: simvx.core.physics.nodes.HingeJoint3D.up :type: simvx.core.math.types.Vec3 ```` ````{py:method} translate(offset: tuple[float, float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes.HingeJoint3D.translate ```` ````{py:method} translate_global(offset: tuple[float, float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes.HingeJoint3D.translate_global ```` ````{py:method} rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float) :canonical: simvx.core.physics.nodes.HingeJoint3D.rotate ```` ````{py:method} rotate_x(angle: float) :canonical: simvx.core.physics.nodes.HingeJoint3D.rotate_x ```` ````{py:method} rotate_y(angle: float) :canonical: simvx.core.physics.nodes.HingeJoint3D.rotate_y ```` ````{py:method} rotate_z(angle: float) :canonical: simvx.core.physics.nodes.HingeJoint3D.rotate_z ```` ````{py:method} look_at(target: tuple[float, float, float] | numpy.ndarray, up=None) :canonical: simvx.core.physics.nodes.HingeJoint3D.look_at ```` ````{py:method} face_along(forward: tuple[float, float, float] | numpy.ndarray, up: tuple[float, float, float] | numpy.ndarray | None = None) -> None :canonical: simvx.core.physics.nodes.HingeJoint3D.face_along ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes.HingeJoint3D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes.HingeJoint3D.is_on_render_layer ```` ````{py:method} wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0) :canonical: simvx.core.physics.nodes.HingeJoint3D.wrap_bounds ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes.HingeJoint3D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes.HingeJoint3D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes.HingeJoint3D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes.HingeJoint3D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes.HingeJoint3D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes.HingeJoint3D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes.HingeJoint3D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes.HingeJoint3D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes.HingeJoint3D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes.HingeJoint3D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes.HingeJoint3D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes.HingeJoint3D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes.HingeJoint3D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes.HingeJoint3D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes.HingeJoint3D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes.HingeJoint3D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes.HingeJoint3D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes.HingeJoint3D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes.HingeJoint3D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes.HingeJoint3D.on_ready ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes.HingeJoint3D.on_update ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes.HingeJoint3D.on_fixed_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes.HingeJoint3D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes.HingeJoint3D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes.HingeJoint3D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes.HingeJoint3D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes.HingeJoint3D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes.HingeJoint3D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes.HingeJoint3D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes.HingeJoint3D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes.HingeJoint3D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes.HingeJoint3D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes.HingeJoint3D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes.HingeJoint3D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes.HingeJoint3D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes.HingeJoint3D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes.HingeJoint3D.__repr__ ```` ````` `````{py:class} SpringJoint3D(*, body_a: simvx.core.physics.nodes.PhysicsBody3D | None = None, body_b: simvx.core.physics.nodes.PhysicsBody3D | None = None, **kwargs: object) :canonical: simvx.core.physics.nodes.SpringJoint3D Bases: {py:obj}`simvx.core.physics.nodes.Joint3D` ```{autodoc2-docstring} simvx.core.physics.nodes.SpringJoint3D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.nodes.SpringJoint3D.__init__ ``` ````{py:attribute} rest_length :canonical: simvx.core.physics.nodes.SpringJoint3D.rest_length :type: float :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.SpringJoint3D.rest_length ``` ```` ````{py:attribute} stiffness :canonical: simvx.core.physics.nodes.SpringJoint3D.stiffness :type: float :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.SpringJoint3D.stiffness ``` ```` ````{py:attribute} damping :canonical: simvx.core.physics.nodes.SpringJoint3D.damping :type: float :value: > 'Property(...)' ```{autodoc2-docstring} simvx.core.physics.nodes.SpringJoint3D.damping ``` ```` ````{py:property} joint :canonical: simvx.core.physics.nodes.SpringJoint3D.joint :type: simvx.core.physics.world.JointHandle | None ```` ````{py:property} world :canonical: simvx.core.physics.nodes.SpringJoint3D.world :type: simvx.core.physics.world.PhysicsWorld | None ```` ````{py:method} on_enter_tree() -> None :canonical: simvx.core.physics.nodes.SpringJoint3D.on_enter_tree ```` ````{py:method} on_exit_tree() -> None :canonical: simvx.core.physics.nodes.SpringJoint3D.on_exit_tree ```` ````{py:attribute} position :canonical: simvx.core.physics.nodes.SpringJoint3D.position :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} rotation :canonical: simvx.core.physics.nodes.SpringJoint3D.rotation :value: > 'Property(...)' ```` ````{py:attribute} scale :canonical: simvx.core.physics.nodes.SpringJoint3D.scale :value: > '_SpatialVecProperty(...)' ```` ````{py:attribute} render_layer :canonical: simvx.core.physics.nodes.SpringJoint3D.render_layer :value: > 'Property(...)' ```` ````{py:property} rotation_degrees :canonical: simvx.core.physics.nodes.SpringJoint3D.rotation_degrees :type: simvx.core.math.types.Vec3 ```` ````{py:property} world_position :canonical: simvx.core.physics.nodes.SpringJoint3D.world_position :type: simvx.core.math.types.Vec3 ```` ````{py:property} world_rotation :canonical: simvx.core.physics.nodes.SpringJoint3D.world_rotation :type: simvx.core.math.types.Quat ```` ````{py:property} world_scale :canonical: simvx.core.physics.nodes.SpringJoint3D.world_scale :type: simvx.core.math.types.Vec3 ```` ````{py:property} forward :canonical: simvx.core.physics.nodes.SpringJoint3D.forward :type: simvx.core.math.types.Vec3 ```` ````{py:property} right :canonical: simvx.core.physics.nodes.SpringJoint3D.right :type: simvx.core.math.types.Vec3 ```` ````{py:property} up :canonical: simvx.core.physics.nodes.SpringJoint3D.up :type: simvx.core.math.types.Vec3 ```` ````{py:method} translate(offset: tuple[float, float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes.SpringJoint3D.translate ```` ````{py:method} translate_global(offset: tuple[float, float, float] | numpy.ndarray) :canonical: simvx.core.physics.nodes.SpringJoint3D.translate_global ```` ````{py:method} rotate(axis: tuple[float, float, float] | numpy.ndarray, angle: float) :canonical: simvx.core.physics.nodes.SpringJoint3D.rotate ```` ````{py:method} rotate_x(angle: float) :canonical: simvx.core.physics.nodes.SpringJoint3D.rotate_x ```` ````{py:method} rotate_y(angle: float) :canonical: simvx.core.physics.nodes.SpringJoint3D.rotate_y ```` ````{py:method} rotate_z(angle: float) :canonical: simvx.core.physics.nodes.SpringJoint3D.rotate_z ```` ````{py:method} look_at(target: tuple[float, float, float] | numpy.ndarray, up=None) :canonical: simvx.core.physics.nodes.SpringJoint3D.look_at ```` ````{py:method} face_along(forward: tuple[float, float, float] | numpy.ndarray, up: tuple[float, float, float] | numpy.ndarray | None = None) -> None :canonical: simvx.core.physics.nodes.SpringJoint3D.face_along ```` ````{py:method} set_render_layer(index: int, enabled: bool = True) -> None :canonical: simvx.core.physics.nodes.SpringJoint3D.set_render_layer ```` ````{py:method} is_on_render_layer(index: int) -> bool :canonical: simvx.core.physics.nodes.SpringJoint3D.is_on_render_layer ```` ````{py:method} wrap_bounds(bounds: tuple[float, float, float] | numpy.ndarray, margin: float = 1.0) :canonical: simvx.core.physics.nodes.SpringJoint3D.wrap_bounds ```` ````{py:attribute} strict_errors :canonical: simvx.core.physics.nodes.SpringJoint3D.strict_errors :type: typing.ClassVar[bool] :value: > True ```` ````{py:attribute} script_error_raised :canonical: simvx.core.physics.nodes.SpringJoint3D.script_error_raised :value: > 'Signal(...)' ```` ````{py:method} __init_subclass__(**kwargs) :canonical: simvx.core.physics.nodes.SpringJoint3D.__init_subclass__ :classmethod: ```` ````{py:property} name :canonical: simvx.core.physics.nodes.SpringJoint3D.name :type: str ```` ````{py:property} update_mode :canonical: simvx.core.physics.nodes.SpringJoint3D.update_mode :type: simvx.core.descriptors.UpdateMode ```` ````{py:property} visible :canonical: simvx.core.physics.nodes.SpringJoint3D.visible :type: bool ```` ````{py:method} reset_error() -> None :canonical: simvx.core.physics.nodes.SpringJoint3D.reset_error ```` ````{py:method} add_child(node: simvx.core.node.Node) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes.SpringJoint3D.add_child ```` ````{py:method} remove_child(node: simvx.core.node.Node) :canonical: simvx.core.physics.nodes.SpringJoint3D.remove_child ```` ````{py:method} reparent(new_parent: simvx.core.node.Node) :canonical: simvx.core.physics.nodes.SpringJoint3D.reparent ```` ````{py:method} get_node(path: str) -> simvx.core.node.Node :canonical: simvx.core.physics.nodes.SpringJoint3D.get_node ```` ````{py:method} get_node_or_none(path: str) -> simvx.core.node.Node | None :canonical: simvx.core.physics.nodes.SpringJoint3D.get_node_or_none ```` ````{py:method} find(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes.SpringJoint3D.find ```` ````{py:method} find_all(target, *, direct: bool = False) :canonical: simvx.core.physics.nodes.SpringJoint3D.find_all ```` ````{py:method} walk(*, include_self: bool = True) -> collections.abc.Iterator[simvx.core.node.Node] :canonical: simvx.core.physics.nodes.SpringJoint3D.walk ```` ````{py:property} path :canonical: simvx.core.physics.nodes.SpringJoint3D.path :type: str ```` ````{py:method} add_to_group(group: str) :canonical: simvx.core.physics.nodes.SpringJoint3D.add_to_group ```` ````{py:method} remove_from_group(group: str) :canonical: simvx.core.physics.nodes.SpringJoint3D.remove_from_group ```` ````{py:method} is_in_group(group: str) -> bool :canonical: simvx.core.physics.nodes.SpringJoint3D.is_in_group ```` ````{py:method} on_ready() -> None :canonical: simvx.core.physics.nodes.SpringJoint3D.on_ready ```` ````{py:method} on_update(dt: float) -> None :canonical: simvx.core.physics.nodes.SpringJoint3D.on_update ```` ````{py:method} on_fixed_update(dt: float) -> None :canonical: simvx.core.physics.nodes.SpringJoint3D.on_fixed_update ```` ````{py:method} on_draw(renderer) -> None :canonical: simvx.core.physics.nodes.SpringJoint3D.on_draw ```` ````{py:method} on_picked(event: simvx.core.events.InputEvent) -> None :canonical: simvx.core.physics.nodes.SpringJoint3D.on_picked ```` ````{py:method} on_unhandled_input(event: simvx.core.events.TreeInputEvent) -> None :canonical: simvx.core.physics.nodes.SpringJoint3D.on_unhandled_input ```` ````{py:method} start_coroutine(gen: simvx.core.descriptors.Coroutine) -> simvx.core.descriptors.CoroutineHandle :canonical: simvx.core.physics.nodes.SpringJoint3D.start_coroutine ```` ````{py:method} stop_coroutine(gen_or_handle) :canonical: simvx.core.physics.nodes.SpringJoint3D.stop_coroutine ```` ````{py:method} clear_children() :canonical: simvx.core.physics.nodes.SpringJoint3D.clear_children ```` ````{py:method} destroy() :canonical: simvx.core.physics.nodes.SpringJoint3D.destroy ```` ````{py:method} call_deferred(method: collections.abc.Callable[..., typing.Any], *args: typing.Any) -> None :canonical: simvx.core.physics.nodes.SpringJoint3D.call_deferred ```` ````{py:property} app :canonical: simvx.core.physics.nodes.SpringJoint3D.app ```` ````{py:property} tree :canonical: simvx.core.physics.nodes.SpringJoint3D.tree :type: simvx.core.scene_tree.SceneTree ```` ````{py:property} physics :canonical: simvx.core.physics.nodes.SpringJoint3D.physics ```` ````{py:property} physics_2d :canonical: simvx.core.physics.nodes.SpringJoint3D.physics_2d ```` ````{py:method} __getitem__(key: str) :canonical: simvx.core.physics.nodes.SpringJoint3D.__getitem__ ```` ````{py:method} get_properties() -> dict[str, simvx.core.descriptors.Property] :canonical: simvx.core.physics.nodes.SpringJoint3D.get_properties :classmethod: ```` ````{py:method} __repr__() :canonical: simvx.core.physics.nodes.SpringJoint3D.__repr__ ```` `````