From: Clifton Palmer Date: Fri, 29 Nov 2024 14:35:35 +0000 (+0200) Subject: Basic player functionality X-Git-Url: http://git.purplebirdman.com/william-skin.git/commitdiff_plain/991a7b1300e33ebdb52734e566479263acff8ef3 Basic player functionality --- diff --git a/player/player.gd b/player/player.gd new file mode 100644 index 0000000..6c78b21 --- /dev/null +++ b/player/player.gd @@ -0,0 +1,338 @@ +class_name Player +extends CharacterBody3D + + +# signals +signal camera_lockon + + +# player settings +@export_group("Movement") +@export var walk_speed := 5.0 +@export var jog_speed := 10.0 +@export var air_speed := 3.0 +@export var acceleration := 30.0 +@export var jump_speed := 6.0 +@export var rotation_speed := 10.0 +@export var fall_speed := 1.2 +@export var idle_timeout := 5.0 +@export var hard_landing_limit := 10.0 + + +@export_group("Camera") +@export_range(1.0, 10.0) var camera_distance := 2.0 +@export_range(0.0, 100.0) var camera_lockon_radius := 40.0 +@export_enum("locked", "unlocked") var camera_mode: String +@export_range(0.0, 50.0) var lockon_sensitivity := 0.2 +@export_range(0.0, 1.0) var mouse_sensitivity := 0.25 +@export_range(0.0, 10.0) var joystick_sensitivity_x := 4.0 +@export_range(0.0, 10.0) var joystick_sensitivity_y := 2.0 + + +@export_group("Expressions") +@export_range(1.0, 100.0) var head_rotation_speed := 5.0 + + +@onready var _camera_pivot: Node3D = $cameraPivot +@onready var _camera_spring: SpringArm3D = $cameraPivot/SpringArm3D +@onready var _camera: Camera3D = $cameraPivot/SpringArm3D/Camera3D +@onready var _skin: WilliamSkin = %WilliamSkin +@onready var _debug: CanvasLayer = %DebugOverlay + + +# class variables +var _player_speed := walk_speed +var _camera_input_direction := Vector2.ZERO +var _last_movement_direction := rotation +var _idle_time := 0.0 +var _camera_lockon_node: Node3D = null +var _lockon_direction: Vector3 = Vector3.ZERO +var _lockon_indicator_scene = load("res://ux/lockon_indicator.tscn") +var _lockon_instance: Node3D = _lockon_indicator_scene.instantiate() + +var _head_track_arr: Array[Node3D] = [] + +enum {LOCKON_LEFT, LOCKON_CENTER, LOCKON_RIGHT} +var _lockon_shift := LOCKON_CENTER + +enum {CAMERA_MOUSE_INPUT, CAMERA_JOYSTICK_INPUT} +var _camera_input_method := CAMERA_MOUSE_INPUT + +enum _states {FREE, POSING, TALKING} +var _player_state := _states.FREE + + +# inherited functions +func _ready() -> void: + _camera_spring.spring_length = camera_distance + + # debug + _debug.draw.add_vector(self, "velocity", 1, 3, Color(0,1,0,1)) + _debug.draw.add_vector(self, "_lockon_direction", 1, 2, Color(1,0,0,1)) + _debug.draw.add_vector(_camera_pivot, "rotation", 1, 3, Color(1,0,1,1)) + _debug.draw.add_vector(self, "_last_movement_direction", 1, 3, Color(1,0,0,1)) + + _debug.stats.add_property(self, "velocity", "") + _debug.stats.add_property(self, "_idle_time", "round") + _debug.stats.add_property(self, "_lockon_shift", "round") + _debug.stats.add_property(self, "_head_track_to", "") + _debug.stats.add_property(self, "_head_track_arr", "") + + +func _input(event: InputEvent) -> void: + if event.is_action_pressed("camera-lockon"): + camera_lockon.emit() + elif event.is_action_pressed("player-run"): + _player_speed = jog_speed + elif event.is_action_released("player-run"): + _player_speed = walk_speed + elif event.is_action_pressed("player-pose"): + _player_state = _states.POSING + elif event.is_action_released("player-pose"): + _player_state = _states.FREE + elif event.is_action_pressed("player-action"): + # TODO: contextual action + if _player_state == _states.FREE: + _player_state = _states.TALKING + velocity = Vector3.ZERO + elif _player_state == _states.TALKING: + _player_state = _states.FREE + + +func _unhandled_input(event: InputEvent) -> void: + # If user clicks on the window, capture the mouse and direct the camera with it + if Input.get_mouse_mode() != Input.MOUSE_MODE_CAPTURED: + return + + #_camera_input_direction *= mouse_sensitivity + if event is InputEventMouseMotion: + _camera_input_method = CAMERA_MOUSE_INPUT + _camera_input_direction = event.screen_relative * mouse_sensitivity + elif event is InputEventJoypadMotion: + _camera_input_method = CAMERA_JOYSTICK_INPUT + _camera_input_direction = Input.get_vector("camera-left", "camera-right", "camera-up", "camera-down") + if _camera_input_direction == Vector2.ZERO: + _lockon_shift = LOCKON_CENTER + _camera_input_direction *= Vector2(joystick_sensitivity_x, -joystick_sensitivity_y) + + +# class functions +func _physics_process(delta: float) -> void: + _process_player(delta) + _process_camera(delta) + + +func is_camera_locked() -> bool: + return camera_mode == "locked" + + +func set_camera_lockon(arr: Array[Node]) -> void: + if _camera_lockon_node: + _camera_lockon_node.remove_child(_lockon_instance) + + if not is_camera_locked() or _lockon_shift != LOCKON_CENTER: + # pick closest lockon point to center of camera view + # must be within lockon radius + var shortest_target_angle = _camera.fov / 360 * 2 * PI + for n: Node3D in arr: + if _camera_lockon_node == n: + continue + + var target_dir := _camera_pivot.global_position - n.global_position + if target_dir.length() < camera_lockon_radius: + var target_angle = shortest_target_angle + if _lockon_shift == LOCKON_CENTER: + var camera_dir = _camera.global_position - _camera_pivot.global_position + target_angle = target_dir.angle_to(camera_dir) + else: + # check to make sure if lockon switch is a node to the left if player pressed left, + # else lockon switch to something to the right + target_angle = target_dir.signed_angle_to(_lockon_direction, Vector3.UP) + if _lockon_shift == LOCKON_RIGHT and target_angle <= 0: + continue + if _lockon_shift == LOCKON_LEFT and target_angle >= 0: + continue + + target_angle = abs(target_angle) + if target_angle < shortest_target_angle: + shortest_target_angle = target_angle + _camera_lockon_node = n + + if _camera_lockon_node: + _camera_lockon_node.add_child(_lockon_instance) + camera_mode = "locked" + else: + camera_mode = "unlocked" + _camera_lockon_node = null + _lockon_direction = Vector3.ZERO + + # TODO: move all skin stuff to its own reset function + _skin.move_forward() + _skin.set_hips_direction(0) + + # always reset shift to center! + _lockon_shift = LOCKON_CENTER + + +func _process_camera(delta: float) -> void: + if not is_camera_locked(): + # vertical camera rotation + _camera_pivot.rotation.x += _camera_input_direction.y * delta + _camera_pivot.rotation.x = clamp(_camera_pivot.rotation.x, -PI / 6, PI / 3) + + # horizontal camera rotation + _camera_pivot.rotation.y -= _camera_input_direction.x * delta + + # reset mouse movement vector if mouse input + if _camera_input_method == CAMERA_MOUSE_INPUT: + _camera_input_direction = Vector2.ZERO + else: + # camera should lerp to a set height + _camera_pivot.rotation.x = lerp(_camera_pivot.rotation.x, 0.0, delta) + _camera_pivot.rotation.z = lerp(_camera_pivot.rotation.z, 0.0, delta) + + # keep camera pivot pointed towards locked object + if _camera_lockon_node: + # calculate target vector between node position and player + var lock_vector := _camera_pivot.global_position - _camera_lockon_node.global_position + _lockon_direction = lock_vector + lock_vector.y = 0 + var target_angle = Vector3.BACK.signed_angle_to(lock_vector, Vector3.UP) + _camera_pivot.global_rotation.y = lerp_angle(_camera_pivot.global_rotation.y, target_angle, rotation_speed * delta) + + # if player indicates right or left, emit lockon signal again to collect array and split it + if _camera_input_direction.x < -lockon_sensitivity and _lockon_shift != LOCKON_LEFT: + _lockon_shift = LOCKON_LEFT + camera_lockon.emit() + elif _camera_input_direction.x > lockon_sensitivity and _lockon_shift != LOCKON_RIGHT: + _lockon_shift = LOCKON_RIGHT + camera_lockon.emit() + + +# Get the XZ input direction based on player's input relative to the camera +func _get_player_move_direction() -> Vector3: + var input_dir := Input.get_vector("player-left", "player-right", "player-forward", "player-backward") + var forward := _camera.global_basis.z + var right := _camera.global_basis.x + var move_direction := (forward * input_dir.y + right * input_dir.x).normalized() + move_direction.y = 0 + return move_direction + + +func _process_player_floor(move_direction: Vector3, delta: float) -> void: + # if player is landing, then just return + if _skin.current_state() == "landing": + return + elif _skin.current_state() == "fall": + if velocity.length() > hard_landing_limit: + velocity = Vector3.ZERO + _skin.landing() + return + else: + _skin.move_forward() + + # if we're not stuck, then it's okay to set the velocity + velocity = velocity.move_toward(move_direction * _player_speed, acceleration * delta) + + # if player jumps, then we're done + if Input.is_action_just_pressed("player-jump"): + velocity.y = jump_speed + _idle_time = 0.0 + _skin.jump() + return + + # also, if we're moving, we're not idle + # last movement direction required for skin orientation + if move_direction.length() < 0.2: + if velocity == Vector3.ZERO: + _idle_time += delta + if _idle_time > idle_timeout: + _skin.idle() + return + else: + _last_movement_direction = move_direction + _idle_time = 0.0 + + # now handle skin rotation and animation + var movement_speed := Vector3(velocity.x, 0, velocity.z).length() + _skin.movement_speed(movement_speed) + + # if camera is unlocked, rotate whole skin to face movement direction + # else, rotate to face camera pivot global Y direction + var skin_target_angle := Vector3.BACK.signed_angle_to(_last_movement_direction, Vector3.UP) + + # lean into momentum just a little bit + _skin.rotation.z = lerp_angle( + _skin.rotation.z, + clamp(_last_movement_direction.signed_angle_to(velocity, Vector3.UP) * movement_speed * 0.08, -PI/4, PI/ 4), + rotation_speed * delta * 0.25 + ) + + if not is_camera_locked(): + _skin.move_forward() + + _skin.global_rotation.y = lerp_angle( + _skin.global_rotation.y, + skin_target_angle, + rotation_speed * delta + ) + else: # camera is locked + var movement_angle := _skin.global_rotation.y - skin_target_angle + if abs(movement_angle) < (PI / 2): + _skin.move_forward() + else: + _skin.move_backward() + + _skin.global_rotation.y = lerp_angle( + _skin.global_rotation.y, + _camera_pivot.global_rotation.y - PI, + rotation_speed * delta) + + # hips rotate towards the direction of movement + # else hips rotate toward skin global Y direction + # if moving backwards, then target_angle is inverted + if movement_speed > 0.1: + var target_hips_dir := lerp_angle( + _skin.global_rotation.y + _skin.get_hips_direction(), + skin_target_angle if abs(movement_angle) < (PI / 2) else (skin_target_angle - PI), + rotation_speed * delta + ) - _skin.global_rotation.y + _skin.set_hips_direction(target_hips_dir) + else: + _skin.set_hips_direction(lerp_angle(_skin.get_hips_direction(), 0, rotation_speed * delta)) + + +func _process_player_falling(move_direction: Vector3, delta: float) -> void: + velocity += get_gravity() * fall_speed * delta + velocity += move_direction * air_speed * delta + _skin.fall() + + +func _process_player(delta: float) -> void: + var move_direction := _get_player_move_direction() + + if is_on_floor(): + if _player_state == _states.POSING: + _skin.pose() + elif _player_state == _states.TALKING: + _skin.talk() + else: + _process_player_floor(move_direction, delta) + else: + _process_player_falling(move_direction, delta) + + move_and_slide() + + +func _on_head_turn_area_entered(area: Area3D) -> void: + for node in area.get_parent().get_children().filter(func(c): return c.is_in_group("player_head_turn")): + var i = _head_track_arr.find(node) + if i < 0: + _head_track_arr.append(node) + + +func _on_head_turn_area_exited(area: Area3D) -> void: + for node in area.get_parent().get_children().filter(func(c): return c.is_in_group("player_head_turn")): + var i = _head_track_arr.find(node) + if i >= 0: + _head_track_arr.remove_at(i) diff --git a/player/player.tscn b/player/player.tscn new file mode 100644 index 0000000..ebef779 --- /dev/null +++ b/player/player.tscn @@ -0,0 +1,69 @@ +[gd_scene load_steps=10 format=3 uid="uid://cp6xm8gp6csx"] + +[ext_resource type="Script" path="res://player/player.gd" id="1_h17j6"] +[ext_resource type="PackedScene" uid="uid://2tvylmtejq0u" path="res://william.tscn" id="1_sujn1"] +[ext_resource type="Script" path="res://ux/debug_draw_3d.gd" id="3_4m0p1"] +[ext_resource type="Script" path="res://ux/debug_overlay.gd" id="3_lokna"] +[ext_resource type="Script" path="res://ux/debug_stats.gd" id="5_n0cdm"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_2yjd0"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_4dtvp"] + +[sub_resource type="CameraAttributesPractical" id="CameraAttributesPractical_frf40"] +dof_blur_far_enabled = true +dof_blur_far_distance = 20.0 + +[sub_resource type="CylinderShape3D" id="CylinderShape3D_ntdse"] +radius = 5.0 + +[node name="player" type="CharacterBody3D"] +script = ExtResource("1_h17j6") +camera_mode = "unlocked" + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("CapsuleShape3D_2yjd0") + +[node name="WilliamSkin" parent="." instance=ExtResource("1_sujn1")] +unique_name_in_owner = true +transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0.027907, 0) + +[node name="cameraPivot" type="Node3D" parent="."] + +[node name="SpringArm3D" type="SpringArm3D" parent="cameraPivot"] +transform = Transform3D(1, 0, 0, 0, 0.946525, 0.322629, 0, -0.322629, 0.946525, 0, 1.588, 0) +shape = SubResource("SphereShape3D_4dtvp") + +[node name="Camera3D" type="Camera3D" parent="cameraPivot/SpringArm3D"] +attributes = SubResource("CameraAttributesPractical_frf40") +fov = 80.0 + +[node name="headTurn" type="Area3D" parent="."] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="headTurn"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("CylinderShape3D_ntdse") + +[node name="DebugOverlay" type="CanvasLayer" parent="."] +unique_name_in_owner = true +visible = false +script = ExtResource("3_lokna") + +[node name="DebugDraw3D" type="Control" parent="DebugOverlay"] +layout_mode = 3 +anchors_preset = 0 +offset_right = 40.0 +offset_bottom = 40.0 +script = ExtResource("3_4m0p1") + +[node name="DebugStats" type="MarginContainer" parent="DebugOverlay"] +offset_right = 40.0 +offset_bottom = 40.0 +script = ExtResource("5_n0cdm") + +[node name="VBoxContainer" type="VBoxContainer" parent="DebugOverlay/DebugStats"] +layout_mode = 2 + +[connection signal="area_entered" from="headTurn" to="." method="_on_head_turn_area_entered"] +[connection signal="area_exited" from="headTurn" to="." method="_on_head_turn_area_exited"] diff --git a/project.godot b/project.godot index 5e79132..f304173 100644 --- a/project.godot +++ b/project.godot @@ -11,5 +11,63 @@ config_version=5 [application] config/name="test" +run/main_scene="res://test/test.tscn" config/features=PackedStringArray("4.3", "Forward Plus") config/icon="res://icon.svg" + +[display] + +window/size/viewport_width=3456 +window/size/viewport_height=1944 + +[input] + +player-left={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null) +] +} +player-right={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":70,"key_label":0,"unicode":102,"location":0,"echo":false,"script":null) +] +} +player-forward={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"location":0,"echo":false,"script":null) +] +} +player-backward={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null) +] +} +left_click={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} +camera-lockon={ +"deadzone": 0.5, +"events": [] +} +player-run={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194325,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} +player-pose={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null) +] +} +player-action={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":82,"key_label":0,"unicode":114,"location":0,"echo":false,"script":null) +] +} +player-jump={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) +] +} diff --git a/test/test.gd b/test/test.gd new file mode 100644 index 0000000..9780536 --- /dev/null +++ b/test/test.gd @@ -0,0 +1,14 @@ +extends Node3D + + +@onready var player = $player + + +func _input(event: InputEvent) -> void: + if event.is_action_pressed("left_click"): + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED + elif event.is_action_pressed("ui_cancel"): + if Input.mouse_mode == Input.MOUSE_MODE_VISIBLE: + get_tree().quit() + else: + Input.mouse_mode = Input.MOUSE_MODE_VISIBLE diff --git a/test/test.tscn b/test/test.tscn new file mode 100644 index 0000000..11371fd --- /dev/null +++ b/test/test.tscn @@ -0,0 +1,35 @@ +[gd_scene load_steps=6 format=3 uid="uid://c0pxmaobqvkh4"] + +[ext_resource type="PackedScene" uid="uid://cp6xm8gp6csx" path="res://player/player.tscn" id="1_apkq8"] +[ext_resource type="Script" path="res://test/test.gd" id="1_qjknf"] + +[sub_resource type="PlaneMesh" id="PlaneMesh_w7hmo"] +size = Vector2(20, 20) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_hkn0r"] +albedo_color = Color(0.374491, 0.329823, 0.326247, 1) + +[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_hby1n"] +data = PackedVector3Array(10, 0, 10, -10, 0, 10, 10, 0, -10, -10, 0, 10, -10, 0, -10, 10, 0, -10) + +[node name="Test" type="Node3D"] +script = ExtResource("1_qjknf") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(-0.866023, -0.433016, 0.250001, 0, 0.499998, 0.866027, -0.500003, 0.749999, -0.43301, 0, 4.18999, 0) +shadow_enabled = true + +[node name="player" parent="." instance=ExtResource("1_apkq8")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.200905, 0, 1.53554) + +[node name="map" type="Node3D" parent="."] + +[node name="MeshInstance3D" type="MeshInstance3D" parent="map"] +mesh = SubResource("PlaneMesh_w7hmo") +skeleton = NodePath("../..") +surface_material_override/0 = SubResource("StandardMaterial3D_hkn0r") + +[node name="StaticBody3D" type="StaticBody3D" parent="map/MeshInstance3D"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="map/MeshInstance3D/StaticBody3D"] +shape = SubResource("ConcavePolygonShape3D_hby1n") diff --git a/ux/debug_draw_3d.gd b/ux/debug_draw_3d.gd new file mode 100644 index 0000000..65d512f --- /dev/null +++ b/ux/debug_draw_3d.gd @@ -0,0 +1,49 @@ +extends Control + + +class Vector: + var object # The node to follow + var property # The property to draw + var scale # Scale factor + var width # Line width + var color # Draw color + + func _init(_object, _property, _scale, _width, _color) -> void: + object = _object + property = _property + scale = _scale + width = _width + color = _color + + func draw(node: Control, camera: Camera3D) -> void: + var start = camera.unproject_position(object.global_transform.origin) + var endv = object.global_transform.origin + object.get(property) * scale + var end = camera.unproject_position(endv) + if start != end: + node.draw_line(start, end, color, width) + if camera.is_position_in_frustum(endv): + node.draw_triangle(end, start.direction_to(end), width * 2, color) + + +var vectors = [] # Array to hold all registered values. + +func draw_triangle(pos: Vector2, dir: Vector2, length: float, color: Color) -> void: + var a = pos + dir.rotated(-PI / 2) * length + var b = pos + dir * length + var c = pos + dir.rotated(PI / 2) * length + var points = PackedVector2Array([a, b, c]) + draw_polygon(points, PackedColorArray([color])) + + +func _process(_delta: float) -> void: + queue_redraw() + + +func _draw() -> void: + var camera = get_viewport().get_camera_3d() + for vector in vectors: + vector.draw(self, camera) + + +func add_vector(object, property, vscale, width, color) -> void: + vectors.append(Vector.new(object, property, vscale, width, color)) diff --git a/ux/debug_overlay.gd b/ux/debug_overlay.gd new file mode 100644 index 0000000..9358517 --- /dev/null +++ b/ux/debug_overlay.gd @@ -0,0 +1,18 @@ +extends CanvasLayer + + +@onready var draw = $DebugDraw3D +@onready var stats = $DebugStats + + +func _ready(): + if not InputMap.has_action("toggle_debug"): + InputMap.add_action("toggle_debug") + var ev = InputEventKey.new() + ev.physical_keycode = KEY_BACKSLASH + InputMap.action_add_event("toggle_debug", ev) + + +func _input(event): + if event.is_action_pressed("toggle_debug"): + self.visible = not self.visible diff --git a/ux/debug_stats.gd b/ux/debug_stats.gd new file mode 100644 index 0000000..28880dd --- /dev/null +++ b/ux/debug_stats.gd @@ -0,0 +1,60 @@ +extends MarginContainer + + +class Property: + var num_format = "%4.2f" + var object # The object being tracked. + var property # The property to display (NodePath). + var label_ref # A reference to the Label. + var display # Display option (rounded, etc.) + + func _init(_object, _property, _label, _display): + object = _object + property = _property + label_ref = _label + display = _display + + func set_label(): + # Sets the label's text. + var s = object.name + "/" + property + " : " + var p = object.get_indexed(property) + match display: + "": + s += str(p) + "length": + s += num_format % p.length() + "round": + match typeof(p): + TYPE_INT, TYPE_FLOAT: + s += num_format % p + TYPE_VECTOR2, TYPE_VECTOR3: + s += str(p.round()) + label_ref.text = s + +var props = [] # An array of the tracked properties. +var _labelSettings: LabelSettings = null + + +func _ready() -> void: + _labelSettings = LabelSettings.new() + _labelSettings.font_size = 25 + + +func _process(_delta): + if not visible: + return + for prop in props: + prop.set_label() + + +func add_property(object, property, display): + var label = Label.new() + label.label_settings = _labelSettings + $VBoxContainer.add_child(label) + props.append(Property.new(object, property, label, display)) + + +func remove_property(object, property): + for prop in props: + if prop.object == object and prop.property == property: + props.erase(prop) diff --git a/ux/lockon_indicator.tscn b/ux/lockon_indicator.tscn new file mode 100644 index 0000000..dbec09e --- /dev/null +++ b/ux/lockon_indicator.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=3 format=3 uid="uid://c3e31ok0vb5j1"] + +[sub_resource type="SphereMesh" id="SphereMesh_bi6pp"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ydpbn"] +no_depth_test = true +emission_enabled = true +emission = Color(1, 1, 1, 1) +emission_energy_multiplier = 16.0 +disable_receive_shadows = true +fixed_size = true + +[node name="LockonIndicator" type="Node3D"] + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +transform = Transform3D(0.01, 0, 0, 0, 0.01, 0, 0, 0, 0.01, 0, 0, 0) +layers = 2 +gi_mode = 0 +mesh = SubResource("SphereMesh_bi6pp") +surface_material_override/0 = SubResource("StandardMaterial3D_ydpbn") diff --git a/william.gd b/william.gd index d4554c9..f9fcac5 100644 --- a/william.gd +++ b/william.gd @@ -1,11 +1,104 @@ +class_name WilliamSkin extends Node3D -# Called when the node enters the scene tree for the first time. +@onready var animation_tree: AnimationTree = $AnimationTree +@onready var skeleton: Skeleton3D = $base/rig/Skeleton3D + + +# get tracking bones from skeleton +var _eye_left_index := -1 +var _eye_right_index := -1 +var _eye_track_target: Vector3 = Vector3.ZERO + +var _head_index := -1 +var _head_track_target: Vector3 = Vector3.ZERO + + func _ready() -> void: - pass # Replace with function body. + _eye_left_index = skeleton.find_bone("DEF-eye.L") + _eye_right_index = skeleton.find_bone("DEF-eye.R") + _head_index = skeleton.find_bone("DEF-spine.006") + + +func _process(_delta: float) -> void: + if _eye_track_target != Vector3.ZERO: + _process_eyes_tracking() + if _head_track_target != Vector3.ZERO: + _process_head_tracking() + + +# manage eye tracking +func set_eyes_target(target: Vector3) -> void: + _eye_track_target = target + +func _process_eyes_tracking() -> void: + # TODO: this is broken! + for i in [_eye_left_index, _eye_right_index]: + var bone_pose: Transform3D = skeleton.global_transform * skeleton.get_bone_global_pose(i) + bone_pose = bone_pose.looking_at(_eye_track_target) + var axis: Vector3 = bone_pose.basis.x + bone_pose = bone_pose.rotated_local(axis, -PI/2) + #skeleton.set_bone_global_pose_override(i, skeleton.global_transform.affine_inverse() * bone_pose, 1, true) + # ^^^ this sets the bone position relative to its rest position, not after animation! -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta: float) -> void: + +# TODO: manage head tracking +func set_head_target(target: Vector3) -> void: + _head_track_target = target + + +func _process_head_tracking() -> void: pass + + +# manage talking and expressions +func talk() -> void: + animation_tree.set("parameters/motion/transition_request", "talk") + + +# manage vectored movement +func current_state() -> String: + return animation_tree.get("parameters/motion/current_state") + + +func set_hips_direction(direction: float) -> void: + animation_tree.set("parameters/hips_direction/blend_position", clamp(direction, -PI / 2, PI / 2)) + + +func get_hips_direction() -> float: + return animation_tree.get("parameters/hips_direction/blend_position") + + +func pose() -> void: + animation_tree.set("parameters/motion/transition_request", "pose") + + +func idle() -> void: + animation_tree.set("parameters/motion/transition_request", "idle") + + +func move_forward() -> void: + animation_tree.set("parameters/motion/transition_request", "forward") + + +func move_backward() -> void: + animation_tree.set("parameters/motion/transition_request", "backward") + + +func movement_speed(speed: float) -> void: + animation_tree.set("parameters/forward/blend_position", speed) + animation_tree.set("parameters/backward/blend_position", speed) + + +func jump() -> void: + animation_tree.set("parameters/motion/transition_request", "fall") + + +func fall() -> void: + animation_tree.set("parameters/motion/transition_request", "fall") + + +func landing() -> void: + animation_tree.set("parameters/motion/transition_request", "landing") diff --git a/william.tscn b/william.tscn index d486de2..4ac8a85 100644 --- a/william.tscn +++ b/william.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=22 format=3 uid="uid://2tvylmtejq0u"] +[gd_scene load_steps=23 format=3 uid="uid://2tvylmtejq0u"] [ext_resource type="PackedScene" uid="uid://cd5n7um55x8ph" path="res://model/william.glb" id="1_adkxn"] [ext_resource type="Script" path="res://william.gd" id="2_0p3og"] @@ -20,6 +20,9 @@ animation = &"idle/talking2" [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_b851n"] animation = &"idle/yelling" +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_13bj0"] +animation = &"idle/posing" + [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_3lsfi"] animation = &"move/falling" @@ -54,30 +57,15 @@ animation = &"move/run" blend_point_0/node = SubResource("AnimationNodeAnimation_58tc5") blend_point_0/pos = 0.0 blend_point_1/node = SubResource("AnimationNodeAnimation_4hgi4") -blend_point_1/pos = 3.0 +blend_point_1/pos = 5.0 blend_point_2/node = SubResource("AnimationNodeAnimation_onqbo") -blend_point_2/pos = 8.0 +blend_point_2/pos = 10.0 blend_point_3/node = SubResource("AnimationNodeAnimation_3lefl") blend_point_3/pos = 15.0 min_space = 0.0 max_space = 15.0 sync = true -[sub_resource type="AnimationNodeTransition" id="AnimationNodeTransition_rgwlt"] -xfade_time = 0.5 -input_0/name = "talk" -input_0/auto_advance = true -input_0/break_loop_at_end = true -input_0/reset = true -input_1/name = "talk2" -input_1/auto_advance = true -input_1/break_loop_at_end = true -input_1/reset = true -input_2/name = "yell" -input_2/auto_advance = true -input_2/break_loop_at_end = true -input_2/reset = true - [sub_resource type="AnimationNodeTransition" id="AnimationNodeTransition_vbrx5"] xfade_time = 0.25 input_0/name = "fall" @@ -104,9 +92,28 @@ input_5/name = "talk" input_5/auto_advance = false input_5/break_loop_at_end = false input_5/reset = true +input_6/name = "pose" +input_6/auto_advance = false +input_6/break_loop_at_end = false +input_6/reset = true + +[sub_resource type="AnimationNodeTransition" id="AnimationNodeTransition_rgwlt"] +xfade_time = 0.5 +input_0/name = "talk" +input_0/auto_advance = true +input_0/break_loop_at_end = true +input_0/reset = true +input_1/name = "talk2" +input_1/auto_advance = true +input_1/break_loop_at_end = true +input_1/reset = true +input_2/name = "yell" +input_2/auto_advance = true +input_2/break_loop_at_end = true +input_2/reset = true [sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_uygj1"] -graph_offset = Vector2(-627.603, 136.455) +graph_offset = Vector2(-672.256, 18.5249) nodes/Animation/node = SubResource("AnimationNodeAnimation_3lsfi") nodes/Animation/position = Vector2(-230, -100) "nodes/Animation 2/node" = SubResource("AnimationNodeAnimation_wa16o") @@ -116,110 +123,129 @@ nodes/Animation/position = Vector2(-230, -100) "nodes/Animation 4/node" = SubResource("AnimationNodeAnimation_8ufbv") "nodes/Animation 4/position" = Vector2(-180, 760) "nodes/Animation 5/node" = SubResource("AnimationNodeAnimation_ry6ix") -"nodes/Animation 5/position" = Vector2(-190, 920) +"nodes/Animation 5/position" = Vector2(-190, 900) "nodes/Animation 6/node" = SubResource("AnimationNodeAnimation_b851n") -"nodes/Animation 6/position" = Vector2(-190, 1070) -nodes/BlendSpace1D/node = SubResource("AnimationNodeBlendSpace1D_4rddd") -nodes/BlendSpace1D/position = Vector2(-230, 200) -"nodes/BlendSpace1D 2/node" = SubResource("AnimationNodeBlendSpace1D_h1uk8") -"nodes/BlendSpace1D 2/position" = Vector2(-240, 520) -nodes/Transition/node = SubResource("AnimationNodeTransition_rgwlt") -nodes/Transition/position = Vector2(80, 790) +"nodes/Animation 6/position" = Vector2(-180, 1030) +"nodes/Animation 7/node" = SubResource("AnimationNodeAnimation_13bj0") +"nodes/Animation 7/position" = Vector2(630, 620) +nodes/backward/node = SubResource("AnimationNodeBlendSpace1D_h1uk8") +nodes/backward/position = Vector2(-240, 520) +nodes/forward/node = SubResource("AnimationNodeBlendSpace1D_4rddd") +nodes/forward/position = Vector2(-230, 200) nodes/motion/node = SubResource("AnimationNodeTransition_vbrx5") -nodes/motion/position = Vector2(470, 140) -nodes/output/position = Vector2(800, 160) -node_connections = [&"Transition", 0, &"Animation 4", &"Transition", 1, &"Animation 5", &"Transition", 2, &"Animation 6", &"motion", 0, &"Animation", &"motion", 1, &"Animation 2", &"motion", 2, &"BlendSpace1D", &"motion", 3, &"Animation 3", &"motion", 4, &"BlendSpace1D 2", &"motion", 5, &"Transition", &"output", 0, &"motion"] +nodes/motion/position = Vector2(860, 80) +nodes/output/position = Vector2(1190, 100) +nodes/talking/node = SubResource("AnimationNodeTransition_rgwlt") +nodes/talking/position = Vector2(80, 790) +node_connections = [&"motion", 0, &"Animation", &"motion", 1, &"Animation 2", &"motion", 2, &"forward", &"motion", 3, &"Animation 3", &"motion", 4, &"backward", &"motion", 5, &"talking", &"motion", 6, &"Animation 7", &"output", 0, &"motion", &"talking", 0, &"Animation 4", &"talking", 1, &"Animation 5", &"talking", 2, &"Animation 6"] [node name="william" instance=ExtResource("1_adkxn")] script = ExtResource("2_0p3og") [node name="Skeleton3D" parent="base/rig" index="0"] -bones/0/position = Vector3(0.016649, 0.969333, -0.121985) -bones/0/rotation = Quaternion(0.172743, -0.0126947, -0.0137409, 0.984789) -bones/1/rotation = Quaternion(-0.0644764, -6.12701e-10, -1.49245e-08, 0.997919) -bones/2/rotation = Quaternion(-0.0577586, -0.0243685, 0.0220824, 0.997789) +bones/0/position = Vector3(-0.0543097, 0.945187, -0.097963) +bones/0/rotation = Quaternion(0.154592, 0.0141124, -0.0023227, 0.987875) +bones/1/rotation = Quaternion(-0.0644764, 2.34048e-09, -1.32068e-08, 0.997919) +bones/1/scale = Vector3(1, 1, 1) +bones/2/rotation = Quaternion(-0.0636345, -0.0204647, 0.0164624, 0.997628) bones/2/scale = Vector3(1, 1, 1) -bones/3/rotation = Quaternion(0.0198853, -0.0773104, 0.0218743, 0.996569) +bones/3/rotation = Quaternion(0.0146275, -0.0648416, 0.0159828, 0.99766) bones/3/scale = Vector3(1, 1, 1) -bones/4/rotation = Quaternion(0.204558, 0.0338454, -0.020503, 0.978054) -bones/5/rotation = Quaternion(-0.0948411, -0.0187163, 0.00178334, 0.995315) -bones/6/rotation = Quaternion(-0.115667, 0.102749, -0.0256811, 0.987626) -bones/8/position = Vector3(0.016649, 0.969333, -0.121985) -bones/8/rotation = Quaternion(-0.0683421, -0.736396, -0.427224, 0.520125) -bones/9/position = Vector3(0.016649, 0.969333, -0.121985) -bones/9/rotation = Quaternion(-0.0537887, 0.727494, 0.409183, 0.548114) +bones/4/rotation = Quaternion(0.194288, 0.0246839, -0.00973452, 0.980586) +bones/4/scale = Vector3(1, 1, 1) +bones/5/rotation = Quaternion(-0.0948385, -0.0200721, 0.00191248, 0.995288) +bones/6/rotation = Quaternion(-0.0932458, 0.0681049, -0.0134362, 0.99322) +bones/8/position = Vector3(-0.0543097, 0.945187, -0.097963) +bones/8/rotation = Quaternion(-0.0767669, -0.731944, -0.403731, 0.543476) +bones/9/position = Vector3(-0.0543097, 0.945187, -0.097963) +bones/9/rotation = Quaternion(-0.0650232, 0.747206, 0.405638, 0.522411) bones/9/scale = Vector3(1, 1, 1) -bones/10/position = Vector3(0.13772, 0.941237, -0.11586) -bones/10/rotation = Quaternion(-0.703228, -0.0273248, -0.055696, 0.708252) -bones/11/position = Vector3(-0.106097, 0.948911, -0.120801) -bones/11/rotation = Quaternion(-0.710738, -0.0269002, -0.0561998, 0.700692) -bones/12/position = Vector3(0.0404851, 0.888617, 0.0577689) -bones/12/rotation = Quaternion(0.997894, 0.0493118, 0.0181738, 0.0380282) -bones/13/rotation = Quaternion(-0.0821081, 0.00374066, -0.0399303, 0.995816) -bones/14/rotation = Quaternion(-0.03542, 0.000715594, -0.0110358, 0.999311) -bones/15/position = Vector3(-0.0194724, 0.890504, 0.0565537) -bones/15/rotation = Quaternion(0.998023, 0.048912, 0.0179721, 0.0351438) -bones/16/rotation = Quaternion(-0.0789948, 0.00330875, -0.039346, 0.996093) -bones/17/rotation = Quaternion(-0.0353102, 0.000763027, -0.010944, 0.999316) -bones/18/position = Vector3(0.0110681, 0.892959, 0.0347284) -bones/18/rotation = Quaternion(0.0218648, 0.606764, 0.794581, -0.000738197) -bones/19/rotation = Quaternion(-0.232545, -0.0176497, 0.075927, 0.969457) -bones/20/rotation = Quaternion(-0.170586, -0.0105524, 0.0608194, 0.983407) -bones/21/rotation = Quaternion(-0.113694, -0.00620888, 0.0541224, 0.992021) -bones/22/rotation = Quaternion(-0.0680347, -0.00305904, 0.0443469, 0.996692) -bones/23/position = Vector3(0.150201, 0.932329, -0.0869841) -bones/23/rotation = Quaternion(0.999636, -0.0111853, 0.0106619, -0.0221063) -bones/23/scale = Vector3(1, 1, 1) -bones/24/rotation = Quaternion(-2.31268e-09, -0.0422427, 8.38026e-10, 0.999107) -bones/25/rotation = Quaternion(0.186002, -0.0422451, -0.0232256, 0.981366) -bones/25/scale = Vector3(1, 1, 1) -bones/26/rotation = Quaternion(2.75658e-08, 0.033076, 1.03588e-08, 0.999453) -bones/27/rotation = Quaternion(-0.64979, 0.0329059, 0.0149796, 0.759254) -bones/27/scale = Vector3(1, 1, 1) -bones/28/rotation = Quaternion(-7.0567e-05, 0.942666, -0.333738, -0.000198885) -bones/28/scale = Vector3(1, 1, 1) -bones/29/position = Vector3(-0.120273, 0.940841, -0.0924656) -bones/29/rotation = Quaternion(0.929681, -0.0181837, 0.00364595, 0.367898) -bones/29/scale = Vector3(1, 1, 1) -bones/30/rotation = Quaternion(5.77282e-08, 0.0266973, 2.93406e-08, 0.999644) -bones/31/rotation = Quaternion(0.389518, 0.0267209, 0.0279059, 0.920208) -bones/31/scale = Vector3(1, 1, 1) -bones/32/rotation = Quaternion(-2.49842e-09, 0.0172383, -2.58048e-08, 0.999851) -bones/33/rotation = Quaternion(-0.585083, 0.0172456, -0.0606354, 0.80852) -bones/33/scale = Vector3(0.999999, 1, 1) -bones/34/rotation = Quaternion(7.0367e-05, 0.942965, -0.332891, 0.000198959) -bones/34/scale = Vector3(1, 1, 1) -bones/35/position = Vector3(-0.000291959, 1.91962, 0.0848259) -bones/35/rotation = Quaternion(0.0658263, 0.0101688, -0.000225134, 0.997779) -bones/36/rotation = Quaternion(0.168185, 0.569003, 0.588726, 0.548954) -bones/36/scale = Vector3(1, 1, 1) -bones/37/rotation = Quaternion(-0.241123, 0.0184621, -0.0778939, 0.967187) -bones/37/scale = Vector3(1, 0.999996, 1) -bones/38/rotation = Quaternion(-0.31407, 0.00747861, -0.0807308, 0.945932) +bones/10/position = Vector3(0.0676743, 0.921014, -0.0970048) +bones/10/rotation = Quaternion(-0.79234, 0.00276048, 0.00147369, 0.610071) +bones/11/position = Vector3(-0.175886, 0.921175, -0.0899287) +bones/11/rotation = Quaternion(-0.793959, 0.00355803, 0.00279315, 0.607955) +bones/12/position = Vector3(-0.0191414, 0.872133, 0.0825493) +bones/12/rotation = Quaternion(0.999839, -0.00731233, -0.0147557, -0.00709819) +bones/13/rotation = Quaternion(0.0180564, -6.93462e-05, 0.00191796, 0.999835) +bones/14/rotation = Quaternion(0.0423466, 3.92527e-05, 0.000829518, 0.999103) +bones/15/position = Vector3(-0.0790256, 0.872166, 0.0842765) +bones/15/rotation = Quaternion(0.999824, -0.00741263, -0.0147396, -0.00889758) +bones/16/rotation = Quaternion(0.0150117, -9.8057e-05, 0.00189377, 0.999886) +bones/17/rotation = Quaternion(0.0364526, 1.77072e-05, 0.000554607, 0.999335) +bones/18/position = Vector3(-0.0497157, 0.874717, 0.0609404) +bones/18/rotation = Quaternion(0.0142694, 0.565772, 0.824397, -0.00827725) +bones/19/rotation = Quaternion(-0.256631, 0.00103883, 0.00249276, 0.966506) +bones/20/rotation = Quaternion(-0.118914, 0.000778623, -0.00115882, 0.992904) +bones/21/rotation = Quaternion(-0.0458966, -0.000364593, -0.00841673, 0.998911) +bones/22/rotation = Quaternion(-0.0179514, -5.96008e-05, -0.0143702, 0.999736) +bones/23/position = Vector3(0.081765, 0.913612, -0.068529) +bones/23/rotation = Quaternion(0.99761, 0.0630025, -0.013426, 0.0250044) +bones/23/scale = Vector3(1.00224, 0.995552, 1.00224) +bones/24/rotation = Quaternion(4.54787e-09, -0.0279861, 2.26316e-08, 0.999608) +bones/25/rotation = Quaternion(0.405807, -0.0281686, 0.0273074, 0.913116) +bones/25/scale = Vector3(1.0001, 0.999292, 1.00063) +bones/26/rotation = Quaternion(-3.82189e-08, -0.0212605, 1.82948e-08, 0.999774) +bones/27/rotation = Quaternion(-0.478788, -0.0195222, 0.05283, 0.876122) +bones/27/scale = Vector3(0.997899, 0.998541, 1.00362) +bones/28/rotation = Quaternion(-4.76001e-05, 0.944582, -0.328275, -0.000206993) +bones/28/scale = Vector3(0.99991, 1.0001, 0.999989) +bones/29/position = Vector3(-0.188378, 0.913761, -0.0607375) +bones/29/rotation = Quaternion(0.978895, 0.00189831, -0.0145393, 0.203836) +bones/29/scale = Vector3(1.00313, 0.99381, 1.00313) +bones/30/rotation = Quaternion(-3.84486e-08, 0.0293578, 8.12745e-09, 0.999569) +bones/31/rotation = Quaternion(0.307441, 0.0286494, -0.0288472, 0.950698) +bones/31/scale = Vector3(1.00015, 0.998494, 1.00141) +bones/32/rotation = Quaternion(-2.90932e-08, 0.0179735, 8.42695e-09, 0.999839) +bones/33/rotation = Quaternion(-0.578423, 0.0186578, 0.0338056, 0.814823) +bones/33/scale = Vector3(0.996837, 0.997518, 1.00575) +bones/34/rotation = Quaternion(5.41431e-05, 0.95061, -0.310387, 0.000204309) +bones/34/scale = Vector3(0.999914, 1.0001, 0.999988) +bones/35/position = Vector3(-0.088554, 1.90273, 0.0623807) +bones/35/rotation = Quaternion(0.0468039, 0.00183861, 0.0172171, 0.998754) +bones/36/rotation = Quaternion(0.168184, 0.569005, 0.588722, 0.548957) +bones/36/scale = Vector3(0.999998, 1, 0.999998) +bones/37/rotation = Quaternion(-0.241127, 0.0184641, -0.0778872, 0.967187) +bones/37/scale = Vector3(1, 0.999994, 1) +bones/38/rotation = Quaternion(-0.314067, 0.00747741, -0.0807338, 0.945932) bones/38/scale = Vector3(1, 1, 1) -bones/39/rotation = Quaternion(-0.223792, -0.00784312, 0.148646, 0.963203) -bones/39/scale = Vector3(0.999989, 1.00002, 0.999989) -bones/40/rotation = Quaternion(-0.367355, 0.263562, 0.891404, -0.0313918) +bones/39/rotation = Quaternion(-0.223788, -0.00784351, 0.148642, 0.963205) +bones/39/scale = Vector3(0.999993, 1.00001, 0.999993) +bones/40/rotation = Quaternion(-0.367355, 0.263561, 0.891404, -0.0313916) bones/40/scale = Vector3(0.999999, 1, 1) -bones/42/rotation = Quaternion(0.168181, -0.569009, -0.588715, 0.548961) -bones/42/scale = Vector3(0.999996, 1.00001, 0.999996) -bones/43/rotation = Quaternion(-0.241131, -0.0184678, 0.0778739, 0.967187) -bones/43/scale = Vector3(1, 0.999995, 1) -bones/44/rotation = Quaternion(-0.314061, -0.00747275, 0.0807462, 0.945934) +bones/41/rotation = Quaternion(0.139165, -0.122498, 0.254064, 0.949252) +bones/41/scale = Vector3(1, 0.999999, 1) +bones/42/rotation = Quaternion(0.168183, -0.569005, -0.588722, 0.548957) +bones/42/scale = Vector3(0.999998, 1, 0.999998) +bones/43/rotation = Quaternion(-0.241125, -0.0184641, 0.0778867, 0.967188) +bones/43/scale = Vector3(1, 0.999998, 1) +bones/44/rotation = Quaternion(-0.314066, -0.00747598, 0.0807378, 0.945932) bones/44/scale = Vector3(1, 1, 1) -bones/45/rotation = Quaternion(-0.223793, 0.00784278, -0.148648, 0.963202) -bones/45/scale = Vector3(0.99999, 1.00002, 0.99999) -bones/46/scale = Vector3(1, 0.999998, 1) +bones/45/rotation = Quaternion(-0.223789, 0.00784306, -0.148644, 0.963204) +bones/45/scale = Vector3(0.999993, 1.00001, 0.999993) +bones/46/rotation = Quaternion(0.367355, 0.263561, 0.891404, 0.0313915) +bones/46/scale = Vector3(1, 0.999997, 1) +bones/47/rotation = Quaternion(0.139164, 0.122498, -0.254064, 0.949252) +bones/47/scale = Vector3(1, 1, 1) bones/50/rotation = Quaternion(0.235823, 0.0209284, 0.288052, 0.927888) bones/54/rotation = Quaternion(0.235823, -0.0209284, -0.288052, 0.927888) -bones/56/scale = Vector3(0.999995, 1.00001, 0.999995) -bones/57/scale = Vector3(1.00001, 0.99999, 1) +bones/56/position = Vector3(0.0443385, -0.213733, 0.157378) +bones/56/rotation = Quaternion(-0.542164, -0.1825, -0.14966, 0.806445) +bones/56/scale = Vector3(0.999997, 1.00001, 0.999997) +bones/57/rotation = Quaternion(0.270945, -0.0956788, -0.0183005, 0.957653) +bones/57/scale = Vector3(1, 0.999994, 1) +bones/58/position = Vector3(-0.0443385, -0.213733, 0.157378) +bones/58/rotation = Quaternion(-0.542165, 0.1825, 0.14966, 0.806445) bones/58/scale = Vector3(1, 1, 1) -bones/59/scale = Vector3(1.00001, 0.999991, 1) -bones/60/rotation = Quaternion(0.746153, -0.445832, -0.405328, 0.283195) -bones/61/rotation = Quaternion(0.535987, 0.0194272, 0.557476, 0.633688) -bones/62/rotation = Quaternion(0.746153, 0.445832, 0.405328, 0.283195) -bones/63/rotation = Quaternion(0.535987, -0.0194272, -0.557476, 0.633688) +bones/59/rotation = Quaternion(0.270946, 0.0956788, 0.0183006, 0.957653) +bones/59/scale = Vector3(1, 0.999995, 1) +bones/60/rotation = Quaternion(0.746153, -0.445831, -0.405328, 0.283194) +bones/60/scale = Vector3(1, 1, 1) +bones/61/rotation = Quaternion(0.535987, 0.0194268, 0.557477, 0.633688) +bones/61/scale = Vector3(1, 1, 1) +bones/62/rotation = Quaternion(0.746154, 0.445831, 0.405328, 0.283194) +bones/62/scale = Vector3(1, 1, 1) +bones/63/rotation = Quaternion(0.535987, -0.0194262, -0.557477, 0.633687) +bones/63/scale = Vector3(0.999999, 1, 0.999999) bones/64/rotation = Quaternion(0.702529, 0.177161, 0.677026, 0.129235) bones/65/rotation = Quaternion(0.765799, 0.238889, 0.569536, 0.179201) bones/65/scale = Vector3(1, 1, 1) @@ -232,266 +258,292 @@ bones/69/rotation = Quaternion(0.917471, -0.15511, -0.329905, 0.159217) bones/69/scale = Vector3(1, 1, 0.999999) bones/70/rotation = Quaternion(0.88889, 2.18449e-07, 4.23856e-07, 0.458121) bones/70/scale = Vector3(1, 1, 1) -bones/71/rotation = Quaternion(0.125216, -2.41609e-08, 2.92723e-07, 0.99213) +bones/71/rotation = Quaternion(0.125217, -2.08342e-08, 2.67674e-07, 0.992129) bones/71/scale = Vector3(0.999986, 1.00003, 0.999986) -bones/72/rotation = Quaternion(0.999673, 5.72711e-08, -1.95365e-10, -0.0255553) -bones/72/scale = Vector3(1, 0.999991, 1.00001) +bones/72/rotation = Quaternion(0.999673, -6.76641e-08, -3.23684e-09, -0.0255558) +bones/72/scale = Vector3(1, 0.999995, 1) bones/73/rotation = Quaternion(0.999709, 0.0117809, -0.0109535, 0.0179522) bones/73/scale = Vector3(1, 1, 1) bones/74/rotation = Quaternion(0.999709, -0.0117809, 0.0109535, 0.0179522) bones/74/scale = Vector3(1, 1, 1) -bones/76/rotation = Quaternion(-6.74481e-05, -0.399368, -0.677454, 0.617707) -bones/76/scale = Vector3(0.997754, 1.00451, 0.997754) -bones/77/position = Vector3(0.235281, -0.087448, 0.113399) -bones/77/rotation = Quaternion(0.5229, -0.128826, 0.827464, -0.159007) -bones/77/scale = Vector3(1.02554, 0.953918, 1.02554) -bones/78/rotation = Quaternion(-0.515415, 0.0662563, -0.075422, 0.85104) -bones/78/scale = Vector3(0.893602, 1.19072, 0.942472) -bones/79/position = Vector3(0.137218, -0.165365, 0.0375071) -bones/79/rotation = Quaternion(-0.0453375, -0.385462, 0.542623, 0.744932) -bones/79/scale = Vector3(1.14744, 0.759574, 1.14744) -bones/81/rotation = Quaternion(0.0411661, 0.432175, 0.661698, 0.611299) -bones/81/scale = Vector3(0.99767, 1.00468, 0.99767) -bones/82/position = Vector3(-0.222979, -0.0816279, 0.129396) -bones/82/rotation = Quaternion(-0.51818, -0.138104, 0.820641, 0.197395) -bones/82/scale = Vector3(0.996804, 1.00681, 0.996804) -bones/83/rotation = Quaternion(-0.492269, -0.088004, 0.0372351, 0.865182) -bones/83/scale = Vector3(0.928517, 1.16754, 0.92307) -bones/84/position = Vector3(-0.141557, -0.161402, 0.0396531) -bones/84/rotation = Quaternion(-0.0463751, 0.371333, -0.578417, 0.724842) -bones/84/scale = Vector3(1.11955, 0.797867, 1.11955) +bones/76/rotation = Quaternion(0.0693526, -0.365649, -0.796177, 0.477068) +bones/76/scale = Vector3(0.996941, 1.00615, 0.996941) +bones/77/position = Vector3(0.2071, -0.149787, 0.129351) +bones/77/rotation = Quaternion(0.515764, -0.204503, 0.799472, -0.23024) +bones/77/scale = Vector3(1.20053, 0.715948, 1.20053) +bones/78/rotation = Quaternion(-0.588771, 0.123701, 0.0108157, 0.798705) +bones/78/scale = Vector3(0.815535, 0.960596, 1.36885) +bones/79/position = Vector3(0.119831, -0.169563, 0.0473656) +bones/79/rotation = Quaternion(-0.160611, -0.504796, 0.463043, 0.710617) +bones/79/scale = Vector3(1.16235, 0.746255, 1.16235) +bones/81/rotation = Quaternion(0.036675, 0.347981, 0.793969, 0.497169) +bones/81/scale = Vector3(0.996543, 1.00695, 0.996543) +bones/82/position = Vector3(-0.217217, -0.147614, 0.120416) +bones/82/rotation = Quaternion(-0.509469, -0.12937, 0.817257, 0.23621) +bones/82/scale = Vector3(1.2344, 0.684584, 1.2344) +bones/83/rotation = Quaternion(-0.690265, -0.113049, 0.0346775, 0.713829) +bones/83/scale = Vector3(0.819132, 0.926684, 1.45198) +bones/84/position = Vector3(-0.126548, -0.16738, 0.0476996) +bones/84/rotation = Quaternion(-0.132618, 0.470783, -0.504482, 0.711529) +bones/84/scale = Vector3(1.14321, 0.769324, 1.14321) bones/85/scale = Vector3(1, 1, 1) -bones/86/rotation = Quaternion(0.985574, -4.08642e-08, 1.27292e-07, 0.169245) -bones/86/scale = Vector3(1.00002, 0.99996, 1.00002) -bones/87/rotation = Quaternion(0.350696, -1.96672e-07, -7.36989e-08, 0.936489) -bones/87/scale = Vector3(0.999967, 1.00004, 0.999993) +bones/86/rotation = Quaternion(0.985574, 1.40917e-07, 9.75399e-08, 0.169243) +bones/86/scale = Vector3(1.00001, 0.999975, 1.00001) +bones/87/rotation = Quaternion(0.350698, -3.21595e-07, 2.64431e-07, 0.936488) +bones/87/scale = Vector3(0.999978, 1.00003, 0.999994) +bones/88/position = Vector3(0.02808, -0.166363, 0.182278) bones/88/rotation = Quaternion(-0.279567, 0.622047, 0.626203, 0.377849) -bones/89/rotation = Quaternion(0.279568, 0.622045, 0.626205, -0.377848) -bones/90/rotation = Quaternion(9.26091e-11, 0.707107, 0.707107, -1.54346e-10) +bones/88/scale = Vector3(1, 1, 1) +bones/89/position = Vector3(-0.02808, -0.166363, 0.182278) +bones/89/rotation = Quaternion(0.279567, 0.622046, 0.626204, -0.377848) +bones/89/scale = Vector3(1, 1, 1) +bones/90/rotation = Quaternion(3.45375e-10, 0.707107, 0.707107, -3.8225e-10) bones/90/scale = Vector3(1, 1, 1) -bones/91/rotation = Quaternion(0.716764, 0.587908, 0.374738, 0.0135708) -bones/91/scale = Vector3(1.00001, 0.999989, 1.00001) -bones/92/rotation = Quaternion(0.267546, 0.00386691, 0.0401674, 0.9627) -bones/92/scale = Vector3(0.999989, 1.00002, 0.999994) -bones/93/rotation = Quaternion(0.276045, -0.0101833, -0.0901741, 0.956851) -bones/93/scale = Vector3(0.999993, 1.00002, 0.999989) -bones/94/rotation = Quaternion(0.228152, -0.0013965, -0.0302452, 0.973155) -bones/94/scale = Vector3(1.00003, 0.99995, 1.00002) -bones/95/rotation = Quaternion(-0.519612, 0.726743, 0.266946, -0.36137) -bones/95/scale = Vector3(0.999987, 1.00003, 0.999987) -bones/96/rotation = Quaternion(0.261345, 0.00585847, -0.0691446, 0.962748) +bones/91/rotation = Quaternion(0.716761, 0.587912, 0.374739, 0.0135734) +bones/91/scale = Vector3(1.00001, 0.999985, 1.00001) +bones/92/rotation = Quaternion(0.26755, 0.00386554, 0.040173, 0.962698) +bones/92/scale = Vector3(0.999986, 1.00002, 0.999991) +bones/93/rotation = Quaternion(0.276038, -0.0101834, -0.0901716, 0.956854) +bones/93/scale = Vector3(0.999998, 1.00001, 0.999993) +bones/94/rotation = Quaternion(0.228157, -0.00139487, -0.0302529, 0.973153) +bones/94/scale = Vector3(1.00002, 0.99996, 1.00002) +bones/95/rotation = Quaternion(-0.519618, 0.726737, 0.266951, -0.361369) +bones/95/scale = Vector3(0.999988, 1.00002, 0.999988) +bones/96/rotation = Quaternion(0.261349, 0.00585855, -0.069146, 0.962747) bones/96/scale = Vector3(1.00001, 0.99998, 1.00001) -bones/97/rotation = Quaternion(0.28414, 0.00941767, -0.141955, 0.948169) -bones/97/scale = Vector3(1, 0.999996, 1) -bones/98/rotation = Quaternion(0.241776, 0.010757, -0.190017, 0.951484) -bones/98/scale = Vector3(0.999973, 1.00005, 0.999974) -bones/99/rotation = Quaternion(1.56301e-08, 0.707106, 0.707107, -1.5733e-08) +bones/97/rotation = Quaternion(0.284134, 0.00941537, -0.141944, 0.948173) +bones/97/scale = Vector3(1, 0.999993, 1) +bones/98/rotation = Quaternion(0.241777, 0.0107571, -0.190018, 0.951484) +bones/98/scale = Vector3(0.999976, 1.00005, 0.999978) +bones/99/rotation = Quaternion(1.35459e-08, 0.707106, 0.707107, -1.30769e-08) bones/99/scale = Vector3(1, 1, 1) bones/101/scale = Vector3(0.019058, 0.019058, 0.019058) -bones/105/rotation = Quaternion(9.26091e-11, 0.707107, 0.707107, -1.54346e-10) +bones/105/rotation = Quaternion(3.45375e-10, 0.707107, 0.707107, -3.8225e-10) bones/105/scale = Vector3(1, 1, 1) -bones/106/rotation = Quaternion(0.716766, -0.587908, -0.374737, 0.0135684) +bones/106/rotation = Quaternion(0.716765, -0.587908, -0.374737, 0.0135696) bones/106/scale = Vector3(1.00001, 0.99999, 1.00001) -bones/107/rotation = Quaternion(0.267551, -0.00387361, -0.0401437, 0.962699) -bones/107/scale = Vector3(0.999994, 1.00001, 0.999998) -bones/108/rotation = Quaternion(0.27603, 0.0101887, 0.0901503, 0.956858) -bones/108/scale = Vector3(0.999995, 1.00001, 0.999994) -bones/109/rotation = Quaternion(0.228162, 0.00139886, 0.0302365, 0.973153) -bones/109/scale = Vector3(1.00003, 0.999951, 1.00002) -bones/110/rotation = Quaternion(0.519608, 0.726744, 0.266946, 0.361372) -bones/110/scale = Vector3(0.999983, 1.00003, 0.999983) -bones/111/rotation = Quaternion(0.261351, -0.00586338, 0.069164, 0.962745) -bones/111/scale = Vector3(1.00002, 0.99997, 1.00001) -bones/112/rotation = Quaternion(0.284131, -0.00940737, 0.141916, 0.948178) -bones/112/scale = Vector3(1, 0.999988, 1.00001) -bones/113/rotation = Quaternion(0.24178, -0.0107648, 0.190052, 0.951476) -bones/113/scale = Vector3(0.999964, 1.00007, 0.999966) -bones/114/rotation = Quaternion(-1.29136e-08, 0.707106, 0.707107, 1.29342e-08) +bones/107/rotation = Quaternion(0.267552, -0.00387142, -0.0401516, 0.962699) +bones/107/scale = Vector3(0.999992, 1.00001, 0.999996) +bones/108/rotation = Quaternion(0.276029, 0.0101872, 0.0901552, 0.956857) +bones/108/scale = Vector3(0.999998, 1.00001, 0.999996) +bones/109/rotation = Quaternion(0.228164, 0.00139653, 0.0302467, 0.973152) +bones/109/scale = Vector3(1.00002, 0.999968, 1.00001) +bones/110/rotation = Quaternion(0.519617, 0.726738, 0.266951, 0.361369) +bones/110/scale = Vector3(0.999986, 1.00003, 0.999986) +bones/111/rotation = Quaternion(0.261352, -0.00585758, 0.0691426, 0.962746) +bones/111/scale = Vector3(1.00002, 0.999975, 1.00001) +bones/112/rotation = Quaternion(0.284131, -0.00941213, 0.141931, 0.948175) +bones/112/scale = Vector3(1, 0.999989, 1.00001) +bones/113/rotation = Quaternion(0.24178, -0.0107638, 0.190047, 0.951477) +bones/113/scale = Vector3(0.999966, 1.00007, 0.999968) +bones/114/rotation = Quaternion(-7.42324e-09, 0.707107, 0.707107, 7.43553e-09) bones/114/scale = Vector3(1, 1, 1) bones/116/scale = Vector3(0.019058, 0.019058, 0.019058) -bones/120/rotation = Quaternion(-0.707107, -2.38654e-14, 4.01943e-14, 0.707107) +bones/120/position = Vector3(-1.87517e-10, -0.224927, 0.160554) +bones/120/rotation = Quaternion(-0.707107, 8.86729e-10, -3.72893e-10, 0.707107) bones/120/scale = Vector3(1, 1, 1) -bones/121/rotation = Quaternion(-0.626054, -7.28968e-14, 2.03883e-13, 0.779779) +bones/121/position = Vector3(-1.87522e-10, -0.21997, 0.147152) +bones/121/rotation = Quaternion(-0.626055, 3.32561e-08, -7.4012e-09, 0.779779) bones/122/rotation = Quaternion(-0.185161, 6.11231e-14, -1.7405e-14, 0.982708) bones/123/rotation = Quaternion(-0.360016, -1.89322e-20, -6.7914e-22, 0.932946) -bones/124/rotation = Quaternion(0.907365, 1.50327e-07, 3.24499e-07, 0.420345) +bones/124/position = Vector3(6.56437e-10, -0.152483, 0.046333) +bones/124/rotation = Quaternion(0.907365, 1.48899e-07, 3.2454e-07, 0.420345) bones/124/scale = Vector3(1, 1, 1) -bones/125/rotation = Quaternion(0.229329, -1.22148e-07, 6.74312e-09, 0.973349) -bones/125/scale = Vector3(0.999999, 1, 0.999999) -bones/126/rotation = Quaternion(-0.230472, 3.40099e-07, -5.94446e-08, 0.973079) -bones/126/scale = Vector3(1, 0.999999, 1) -bones/127/rotation = Quaternion(0.720382, 4.96085e-07, 5.15257e-07, 0.693578) +bones/125/position = Vector3(-7.50093e-10, -0.26503, 0.179103) +bones/125/rotation = Quaternion(0.229329, -1.36374e-07, 5.69019e-08, 0.973349) +bones/125/scale = Vector3(1, 1, 1) +bones/126/rotation = Quaternion(-0.230471, 3.43281e-07, -4.65701e-08, 0.973079) +bones/126/scale = Vector3(1, 1, 1) +bones/127/position = Vector3(3.75174e-10, -0.261295, 0.0806333) +bones/127/rotation = Quaternion(0.720382, 4.88585e-07, 5.20005e-07, 0.693578) bones/128/rotation = Quaternion(0.993959, -0.0792359, -0.0118518, 0.0750139) -bones/128/scale = Vector3(1, 1, 1) +bones/128/scale = Vector3(1, 0.999999, 1) bones/129/rotation = Quaternion(-0.407506, -0.0263002, 0.202202, 0.890147) bones/129/scale = Vector3(1, 1, 1) -bones/130/scale = Vector3(1, 1, 1) -bones/131/rotation = Quaternion(0.993959, 0.0792359, 0.0118518, 0.0750138) -bones/132/scale = Vector3(1, 1, 1) +bones/130/rotation = Quaternion(-0.743149, -0.119128, 0.346344, 0.559986) +bones/130/scale = Vector3(1, 0.999999, 1) +bones/131/rotation = Quaternion(0.993959, 0.0792358, 0.0118518, 0.0750138) +bones/132/rotation = Quaternion(-0.407506, 0.0263002, -0.202203, 0.890147) bones/133/rotation = Quaternion(-0.743149, 0.119128, -0.346344, 0.559986) bones/133/scale = Vector3(1, 1, 1) -bones/134/rotation = Quaternion(-0.607269, -0.34489, -0.346712, 0.626152) +bones/134/rotation = Quaternion(-0.607268, -0.344889, -0.34671, 0.626154) bones/134/scale = Vector3(1, 1, 1) -bones/135/rotation = Quaternion(-0.12499, -0.0514657, 0.270364, 0.953222) -bones/135/scale = Vector3(0.999994, 1.00001, 0.999994) -bones/136/rotation = Quaternion(-0.607269, 0.34489, 0.346712, 0.626152) -bones/137/rotation = Quaternion(-0.124988, 0.0514653, -0.270363, 0.953222) -bones/137/scale = Vector3(0.999996, 1.00001, 0.999995) -bones/138/rotation = Quaternion(-0.56242, -0.349749, -0.375751, 0.648206) -bones/138/scale = Vector3(1, 1, 1) -bones/139/rotation = Quaternion(-0.0153827, 0.0395367, 0.239398, 0.969994) -bones/139/scale = Vector3(1, 0.999998, 1) -bones/140/rotation = Quaternion(-0.56242, 0.349749, 0.375751, 0.648206) -bones/140/scale = Vector3(1, 1, 1) -bones/141/rotation = Quaternion(-0.0153735, -0.039539, -0.2394, 0.969994) -bones/141/scale = Vector3(0.999999, 1, 0.999999) -bones/142/position = Vector3(-0.00138943, 1.93446, 0.0314696) -bones/142/rotation = Quaternion(0.880218, -0.00443004, -0.00915588, -0.474461) +bones/135/rotation = Quaternion(-0.124985, -0.0514645, 0.270363, 0.953223) +bones/135/scale = Vector3(0.999996, 1.00001, 0.999996) +bones/136/rotation = Quaternion(-0.607268, 0.34489, 0.34671, 0.626154) +bones/136/scale = Vector3(1, 1, 1) +bones/137/rotation = Quaternion(-0.124984, 0.0514643, -0.270363, 0.953223) +bones/137/scale = Vector3(0.999997, 1.00001, 0.999997) +bones/138/position = Vector3(-1.98159e-08, -0.21993, 0.199498) +bones/138/rotation = Quaternion(-0.562419, -0.349748, -0.375747, 0.648209) +bones/138/scale = Vector3(0.999999, 1, 0.999999) +bones/139/rotation = Quaternion(-0.0153816, 0.0395369, 0.239395, 0.969995) +bones/139/scale = Vector3(1, 0.999996, 1) +bones/140/position = Vector3(-7.22048e-09, -0.21993, 0.199498) +bones/140/rotation = Quaternion(-0.56242, 0.349748, 0.375748, 0.648208) +bones/140/scale = Vector3(0.999999, 1, 0.999999) +bones/141/rotation = Quaternion(-0.015374, -0.0395389, -0.239398, 0.969994) +bones/141/scale = Vector3(1, 0.999997, 1) +bones/142/position = Vector3(-0.0891154, 1.91553, 0.00850838) +bones/142/rotation = Quaternion(0.888971, 0.0146877, -0.00892876, -0.457641) bones/142/scale = Vector3(1, 1, 1) -bones/144/rotation = Quaternion(-0.0625211, -0.002095, -0.0636183, 0.996012) -bones/145/rotation = Quaternion(-0.0752245, -0.00480705, -0.0766621, 0.994204) -bones/146/rotation = Quaternion(-0.107085, -0.00505388, -0.0381015, 0.993507) -bones/147/position = Vector3(0.0539399, 1.92738, 0.0841456) -bones/147/rotation = Quaternion(0.883057, 0.394197, -0.0633688, -0.246586) +bones/144/rotation = Quaternion(-0.10046, 0.000173161, 0.0152906, 0.994824) +bones/145/rotation = Quaternion(-0.096309, 0.000476621, 0.0101301, 0.9953) +bones/146/rotation = Quaternion(-0.0918347, -0.000537472, -0.00423608, 0.995765) +bones/147/position = Vector3(-0.0346403, 1.91229, 0.0623821) +bones/147/rotation = Quaternion(0.881293, 0.410072, -0.0667418, -0.225186) bones/147/scale = Vector3(1, 1, 1) bones/148/rotation = Quaternion(-0.113035, 0.0734297, 0.249068, 0.95906) -bones/149/rotation = Quaternion(-0.0289026, 0.00552046, 0.00720634, 0.999541) -bones/150/rotation = Quaternion(-0.0350552, 0.00458795, 0.0183222, 0.999207) +bones/149/rotation = Quaternion(-0.0596284, 0.00423456, 0.0954755, 0.993635) +bones/150/rotation = Quaternion(-0.0602445, 0.00520961, 0.0965962, 0.993485) bones/150/scale = Vector3(1, 1, 1) -bones/151/rotation = Quaternion(-0.00975353, 0.00628793, 0.122885, 0.992353) -bones/152/position = Vector3(0.0148591, 1.92404, 0.137158) -bones/152/rotation = Quaternion(0.385562, 0.454022, 0.739995, -0.312431) +bones/151/rotation = Quaternion(-0.0149563, 0.0055059, 0.127324, 0.991733) +bones/152/position = Vector3(-0.0745477, 1.90955, 0.114751) +bones/152/rotation = Quaternion(0.376571, 0.477349, 0.729478, -0.313359) bones/152/scale = Vector3(1, 1, 1) bones/153/rotation = Quaternion(-0.240693, -0.000989651, 0.0015089, 0.9706) -bones/154/rotation = Quaternion(-0.207028, -0.000249487, 0.0173969, 0.97818) -bones/155/position = Vector3(0.000869913, 1.9234, 0.142163) -bones/155/rotation = Quaternion(0.0084324, 0.52239, 0.852646, -0.00568779) -bones/156/rotation = Quaternion(-0.112691, -1.76451e-10, 1.85589e-08, 0.99363) -bones/157/rotation = Quaternion(-0.165284, 0.00233789, 0.0280696, 0.985844) +bones/154/rotation = Quaternion(-0.236626, -0.00520473, -0.00697482, 0.971562) +bones/155/position = Vector3(-0.0885974, 1.90862, 0.119522) +bones/155/rotation = Quaternion(-0.00820967, 0.538437, 0.84249, -0.0151123) +bones/156/rotation = Quaternion(-0.127257, 3.48403e-05, 0.00230921, 0.991867) +bones/157/rotation = Quaternion(-0.166475, -0.00128013, -0.0163376, 0.985909) bones/157/scale = Vector3(1, 1, 1) -bones/158/position = Vector3(-0.0223609, 1.92542, 0.127236) -bones/158/rotation = Quaternion(0.540499, -0.380203, -0.598114, -0.453394) +bones/158/position = Vector3(-0.111584, 1.90931, 0.104119) +bones/158/rotation = Quaternion(0.560822, -0.377937, -0.593374, -0.43652) bones/158/scale = Vector3(1, 1, 1) -bones/159/rotation = Quaternion(-0.254753, 0.000485697, -0.00076468, 0.967006) +bones/159/rotation = Quaternion(-0.257311, 0.000989613, 0.0011653, 0.966327) bones/159/scale = Vector3(1, 1, 1) -bones/160/rotation = Quaternion(-0.207831, 0.000318847, -0.00680566, 0.978141) -bones/161/position = Vector3(-0.0545203, 1.92728, 0.0863507) -bones/161/rotation = Quaternion(0.884512, -0.398341, 0.0451908, -0.23858) +bones/160/rotation = Quaternion(-0.184676, 0.00159045, 0.00155269, 0.982797) +bones/161/position = Vector3(-0.142986, 1.90857, 0.0626328) +bones/161/rotation = Quaternion(0.895033, -0.380082, 0.0569021, -0.226311) bones/161/scale = Vector3(1, 1, 1) bones/162/rotation = Quaternion(-0.113035, -0.0734297, -0.249068, 0.95906) -bones/163/rotation = Quaternion(-0.028993, -0.00804185, -0.134344, 0.990478) -bones/164/rotation = Quaternion(-0.0385618, -0.00976954, -0.171397, 0.984399) +bones/163/rotation = Quaternion(-0.0593413, -0.00469208, -0.0640931, 0.996167) +bones/164/rotation = Quaternion(-0.0599532, -0.00489139, -0.076819, 0.995229) bones/164/scale = Vector3(1, 1, 1) -bones/165/rotation = Quaternion(-0.014143, -0.00486999, -0.166065, 0.986001) -bones/166/position = Vector3(0.0242543, 1.55115, 0.0280308) -bones/166/rotation = Quaternion(-0.449041, -0.424883, -0.565546, 0.545889) -bones/167/position = Vector3(0.256226, 1.5245, 0.0189755) -bones/167/rotation = Quaternion(-0.369844, 0.144003, 0.87992, -0.261188) -bones/167/scale = Vector3(0.986908, 1.02671, 0.986908) -bones/168/rotation = Quaternion(-1.13121e-08, 0.041155, 9.74064e-08, 0.999153) -bones/169/rotation = Quaternion(0.545283, 0.0416871, 0.0108179, 0.837145) -bones/169/scale = Vector3(0.997939, 1.03775, 0.966036) -bones/170/rotation = Quaternion(-8.68685e-08, 0.0128806, 2.38027e-08, 0.999917) -bones/171/rotation = Quaternion(-0.190177, 0.0191485, -0.121295, 0.97404) -bones/171/scale = Vector3(1.01258, 0.979145, 1.00929) -bones/172/rotation = Quaternion(0.18663, 0.392824, -0.0950839, 0.895443) -bones/173/rotation = Quaternion(0.210977, -0.00123142, -0.0845073, 0.973831) -bones/174/rotation = Quaternion(0.0758945, -0.00898559, -0.085519, 0.993401) -bones/175/rotation = Quaternion(0.110533, 0.865988, 0.305311, 0.380305) -bones/176/rotation = Quaternion(0.0563969, 0.0881307, -0.0917444, 0.99027) +bones/165/rotation = Quaternion(-0.0138235, -0.00440513, -0.109396, 0.993892) +bones/166/position = Vector3(-0.0539776, 1.53196, 0.0248234) +bones/166/rotation = Quaternion(-0.503918, -0.421166, -0.513132, 0.552614) +bones/167/position = Vector3(0.17294, 1.50565, -0.00888049) +bones/167/rotation = Quaternion(-0.284535, 0.0567827, 0.928203, -0.232925) +bones/167/scale = Vector3(0.989019, 1.02235, 0.989019) +bones/168/rotation = Quaternion(5.21007e-09, 0.0275832, 1.12698e-07, 0.99962) +bones/168/scale = Vector3(1, 1, 1) +bones/169/rotation = Quaternion(0.399523, 0.0282019, 0.00417159, 0.91628) +bones/169/scale = Vector3(0.998734, 1.02187, 0.980456) +bones/170/rotation = Quaternion(-5.1239e-08, 0.0302232, -6.14124e-08, 0.999543) +bones/171/rotation = Quaternion(-0.124008, 0.0433566, -0.0184796, 0.991161) +bones/171/scale = Vector3(1.01076, 0.98089, 1.00901) +bones/172/position = Vector3(-0.0197299, 0.120467, 0.0346735) +bones/172/rotation = Quaternion(0.188222, 0.393971, -0.108051, 0.893132) +bones/173/rotation = Quaternion(0.261003, -0.065276, -0.0869785, 0.959193) +bones/174/rotation = Quaternion(0.0820235, -0.0286539, -0.0750801, 0.993385) +bones/175/rotation = Quaternion(0.0872694, 0.871726, 0.285979, 0.388192) +bones/176/rotation = Quaternion(0.122552, 0.0537678, -0.0710834, 0.988452) bones/176/scale = Vector3(1, 1, 1) -bones/177/rotation = Quaternion(-0.0309054, 0.145144, -0.0913125, 0.984703) +bones/177/rotation = Quaternion(-0.00787135, 0.0995998, -0.0580613, 0.993301) bones/178/rotation = Quaternion(0.0706864, 0.570289, 0.0774011, 0.814729) bones/178/scale = Vector3(1, 1, 1) -bones/179/rotation = Quaternion(0.135892, 0.399238, -0.274441, 0.86419) +bones/179/position = Vector3(-0.00738886, 0.131406, 0.00407596) +bones/179/rotation = Quaternion(0.153511, 0.401835, -0.266712, 0.862455) bones/179/scale = Vector3(1, 1, 1) -bones/180/rotation = Quaternion(0.145742, -0.0118173, -0.0517318, 0.987898) +bones/180/rotation = Quaternion(0.173473, -0.0318753, -0.0550749, 0.982781) bones/180/scale = Vector3(1, 1, 1) -bones/181/rotation = Quaternion(0.107587, -0.00872554, -0.08612, 0.99042) +bones/181/rotation = Quaternion(0.111762, -0.0142218, -0.0794028, 0.990456) +bones/182/rotation = Quaternion(0.0175236, 0.576541, 0.0027414, 0.816876) bones/182/scale = Vector3(1, 1, 1) -bones/183/rotation = Quaternion(0.112162, 0.429607, -0.331331, 0.832513) -bones/184/rotation = Quaternion(0.226096, -0.0319323, -0.0852448, 0.969842) +bones/183/position = Vector3(0.00557852, 0.125891, -0.0231761) +bones/183/rotation = Quaternion(0.144587, 0.431567, -0.321835, 0.830221) +bones/184/rotation = Quaternion(0.212596, -0.0230085, -0.0737671, 0.97408) bones/184/scale = Vector3(1, 1, 1) -bones/185/rotation = Quaternion(0.155947, -0.0214077, -0.0628172, 0.985533) +bones/185/rotation = Quaternion(0.123657, -0.0147851, -0.0417995, 0.991334) bones/185/scale = Vector3(1, 1, 1) bones/186/rotation = Quaternion(-0.036864, 0.530677, -0.0590597, 0.84471) bones/186/scale = Vector3(1, 1, 1) -bones/187/rotation = Quaternion(0.210478, 0.557523, -0.33385, 0.73035) +bones/187/position = Vector3(0.0221778, 0.109413, -0.0432364) +bones/187/rotation = Quaternion(0.241642, 0.547004, -0.352361, 0.719887) bones/187/scale = Vector3(1, 1, 1) -bones/188/rotation = Quaternion(0.271605, -0.0482729, -0.00828256, 0.961162) +bones/188/rotation = Quaternion(0.272472, -0.0152937, 0.00168495, 0.962041) bones/188/scale = Vector3(1, 1, 1) -bones/189/rotation = Quaternion(0.115994, -0.0155879, -0.00269716, 0.993124) +bones/189/rotation = Quaternion(0.0808998, -0.00844757, 0.00188976, 0.996685) bones/190/rotation = Quaternion(-0.0699756, 0.498239, -0.128393, 0.854621) -bones/191/position = Vector3(-0.0113276, 1.55009, 0.0195325) -bones/191/rotation = Quaternion(-0.592653, 0.248777, 0.426854, 0.636135) -bones/192/position = Vector3(-0.201809, 1.51798, -0.111961) -bones/192/rotation = Quaternion(0.0606607, -0.118983, 0.982985, 0.126108) -bones/192/scale = Vector3(0.986908, 1.02671, 0.986908) -bones/193/rotation = Quaternion(-5.89561e-09, -0.0492459, 1.18497e-08, 0.998787) -bones/194/rotation = Quaternion(0.219456, -0.0488593, -0.0470192, 0.973263) -bones/194/scale = Vector3(0.997613, 1.0112, 0.991752) -bones/195/rotation = Quaternion(7.03633e-10, -0.020305, 1.34749e-07, 0.999794) -bones/196/rotation = Quaternion(-0.0736329, -0.0262188, 0.229842, 0.970084) -bones/196/scale = Vector3(1.00629, 0.980335, 1.01441) -bones/197/rotation = Quaternion(0.18384, -0.392099, 0.0704207, 0.898611) -bones/198/rotation = Quaternion(0.269824, 0.000958948, 0.130288, 0.954054) -bones/199/rotation = Quaternion(0.0477664, 0.00603643, 0.0595422, 0.997064) -bones/200/rotation = Quaternion(-0.175174, 0.882525, 0.25867, -0.351501) -bones/201/rotation = Quaternion(0.11883, -0.0857743, 0.175001, 0.9736) +bones/191/position = Vector3(-0.0898553, 1.53031, 0.0194404) +bones/191/rotation = Quaternion(-0.579818, 0.315311, 0.45305, 0.599279) +bones/192/position = Vector3(-0.291338, 1.49676, -0.078127) +bones/192/rotation = Quaternion(0.140243, -0.0219534, 0.977471, 0.156207) +bones/192/scale = Vector3(0.989023, 1.02234, 0.989023) +bones/193/rotation = Quaternion(-4.26668e-08, -0.0396169, -4.7845e-08, 0.999215) +bones/193/scale = Vector3(1, 1, 1) +bones/194/rotation = Quaternion(0.256956, -0.0403347, -0.0253127, 0.965249) +bones/194/scale = Vector3(0.998481, 1.01073, 0.991309) +bones/195/rotation = Quaternion(-4.64077e-10, -0.03039, -4.62594e-09, 0.999538) +bones/196/rotation = Quaternion(-0.156885, -0.0274014, 0.189813, 0.968818) +bones/196/scale = Vector3(1.00468, 0.987645, 1.00851) +bones/197/position = Vector3(0.0197299, 0.120467, 0.0346734) +bones/197/rotation = Quaternion(0.178613, -0.391175, 0.0974552, 0.897542) +bones/198/rotation = Quaternion(0.316846, 0.0644691, 0.129034, 0.937445) +bones/199/rotation = Quaternion(0.0426719, 0.0161001, 0.048366, 0.997788) +bones/200/position = Vector3(0.00332133, 0.0344233, 0.0338642) +bones/200/rotation = Quaternion(-0.155229, 0.895964, 0.212698, -0.357648) +bones/201/rotation = Quaternion(0.1008, -0.0782283, 0.0805587, 0.988549) bones/201/scale = Vector3(1, 1, 1) -bones/202/rotation = Quaternion(-0.0852873, 0.0292886, 0.108978, 0.989946) +bones/202/rotation = Quaternion(-0.0417092, 0.0129002, 0.0737664, 0.99632) bones/203/rotation = Quaternion(0.0706864, -0.570289, -0.0774011, 0.814729) bones/203/scale = Vector3(1, 1, 1) -bones/204/rotation = Quaternion(0.117141, -0.407896, 0.194022, 0.884451) +bones/204/position = Vector3(0.00738885, 0.131406, 0.00407594) +bones/204/rotation = Quaternion(0.134037, -0.401953, 0.235257, 0.874712) bones/204/scale = Vector3(1, 1, 1) -bones/205/rotation = Quaternion(0.308817, 0.0156599, 0.161436, 0.93719) +bones/205/rotation = Quaternion(0.294598, 0.0339288, 0.129955, 0.946136) bones/205/scale = Vector3(1, 1, 1) -bones/206/rotation = Quaternion(0.155682, 0.0120638, 0.11616, 0.980879) +bones/206/rotation = Quaternion(0.113843, 0.017439, 0.0820986, 0.989947) +bones/207/rotation = Quaternion(0.0175236, -0.576541, -0.0027414, 0.816876) bones/207/scale = Vector3(1, 1, 1) -bones/208/rotation = Quaternion(0.0953736, -0.443125, 0.26156, 0.852133) -bones/209/rotation = Quaternion(0.431463, 0.0422907, 0.181997, 0.882569) +bones/208/position = Vector3(-0.00557855, 0.125891, -0.0231762) +bones/208/rotation = Quaternion(0.146741, -0.429588, 0.300115, 0.838959) +bones/209/rotation = Quaternion(0.349127, 0.0306972, 0.136457, 0.926578) bones/209/scale = Vector3(1, 1, 1) -bones/210/rotation = Quaternion(0.170535, 0.0218573, 0.065966, 0.982898) +bones/210/rotation = Quaternion(0.124086, 0.022454, 0.0375147, 0.991308) bones/210/scale = Vector3(1, 1, 1) bones/211/rotation = Quaternion(-0.036864, -0.530677, 0.0590597, 0.84471) bones/211/scale = Vector3(1, 1, 1) -bones/212/rotation = Quaternion(0.171045, -0.574908, 0.293407, 0.744403) +bones/212/position = Vector3(-0.0221778, 0.109413, -0.0432364) +bones/212/rotation = Quaternion(0.236807, -0.552347, 0.315272, 0.734465) bones/212/scale = Vector3(1, 1, 1) -bones/213/rotation = Quaternion(0.360073, 0.0476119, 0.0100175, 0.931655) +bones/213/rotation = Quaternion(0.321456, 0.0303744, 0.00905741, 0.946394) bones/213/scale = Vector3(1, 1, 1) -bones/214/rotation = Quaternion(0.099738, 0.0137441, -0.00105391, 0.994918) +bones/214/rotation = Quaternion(0.0685803, 0.00801158, -0.00391552, 0.997606) bones/215/rotation = Quaternion(-0.0699756, -0.498239, 0.128393, 0.854621) -bones/216/position = Vector3(0.120463, 1.40682, 0.0742752) -bones/216/rotation = Quaternion(-0.110608, 0.579518, 0.804881, 0.063967) +bones/216/position = Vector3(0.0476842, 1.391, 0.0707229) +bones/216/rotation = Quaternion(-0.0864087, 0.553645, 0.827783, 0.02805) bones/216/scale = Vector3(1, 1, 1) -bones/217/position = Vector3(-0.10975, 1.39997, 0.0192913) -bones/217/rotation = Quaternion(-0.11725, 0.573493, 0.80779, 0.0695233) +bones/217/position = Vector3(-0.18457, 1.38054, 0.0359168) +bones/217/rotation = Quaternion(-0.0865831, 0.541448, 0.835879, 0.0253966) bones/217/scale = Vector3(1, 1, 1) -bones/218/position = Vector3(0.214022, 1.41514, -0.065715) -bones/218/rotation = Quaternion(-0.620135, -0.235924, -0.173955, 0.727676) -bones/219/position = Vector3(-0.123886, 1.40288, -0.172421) -bones/219/rotation = Quaternion(-0.638628, -0.127002, -0.086994, 0.753961) +bones/218/position = Vector3(0.127662, 1.39248, -0.0697567) +bones/218/rotation = Quaternion(-0.658467, -0.125614, -0.0744178, 0.738312) +bones/219/position = Vector3(-0.217046, 1.37583, -0.131619) +bones/219/rotation = Quaternion(-0.66219, -0.0923881, -0.0476361, 0.742091) [node name="horns" parent="base/rig/Skeleton3D" index="0"] -transform = Transform3D(0.999793, 0.00175928, 0.0202809, 0.00092037, 0.991334, -0.131369, -0.0203364, 0.131361, 0.991126, -0.00312752, -0.0330088, -0.142605) +transform = Transform3D(0.999417, -0.0330137, 0.0087312, 0.0337067, 0.994697, -0.0971713, -0.00547695, 0.0974096, 0.995229, -0.020514, -0.0535294, -0.0957195) [node name="iris_001" parent="base/rig/Skeleton3D" index="1"] -transform = Transform3D(-0.0190541, -3.40764e-05, 0.00038617, -1.69519e-05, -0.0188928, -0.00250357, 0.0003873, -0.00250339, 0.0188889, 0.0468303, 1.78479, 0.170323) +transform = Transform3D(-0.0190466, 0.000652148, 0.000100709, -0.000658708, -0.0189632, -0.00178056, 3.92791e-05, -0.00178297, 0.0189744, -0.038593, 1.77289, 0.153793) [node name="eye_001" parent="base/rig/Skeleton3D" index="2"] -transform = Transform3D(-0.0190541, -3.40764e-05, 0.00038617, -1.69519e-05, -0.0188928, -0.00250357, 0.0003873, -0.00250339, 0.0188889, 0.0468303, 1.78479, 0.170323) +transform = Transform3D(-0.0190466, 0.000652148, 0.000100709, -0.000658708, -0.0189632, -0.00178056, 3.92791e-05, -0.00178297, 0.0189744, -0.038593, 1.77289, 0.153793) [node name="black_001" parent="base/rig/Skeleton3D" index="3"] -transform = Transform3D(-0.0190541, -3.40764e-05, 0.00038617, -1.69519e-05, -0.0188928, -0.00250357, 0.0003873, -0.00250339, 0.0188889, 0.0468303, 1.78479, 0.170323) +transform = Transform3D(-0.0190466, 0.000652148, 0.000100709, -0.000658708, -0.0189632, -0.00178056, 3.92791e-05, -0.00178297, 0.0189744, -0.038593, 1.77289, 0.153793) [node name="iris_001_2" parent="base/rig/Skeleton3D" index="4"] -transform = Transform3D(-0.0190541, -3.40764e-05, 0.000386169, -1.69517e-05, -0.0188928, -0.00250357, 0.000387299, -0.00250339, 0.0188889, -0.0436611, 1.78471, 0.172163) +transform = Transform3D(-0.0190466, 0.000652147, 0.000100708, -0.000658708, -0.0189632, -0.00178055, 3.9278e-05, -0.00178296, 0.0189744, -0.129049, 1.76976, 0.15398) [node name="eye_001_2" parent="base/rig/Skeleton3D" index="5"] -transform = Transform3D(-0.0190541, -3.40764e-05, 0.000386169, -1.69517e-05, -0.0188928, -0.00250357, 0.000387299, -0.00250339, 0.0188889, -0.0436611, 1.78471, 0.172163) +transform = Transform3D(-0.0190466, 0.000652147, 0.000100708, -0.000658708, -0.0189632, -0.00178055, 3.9278e-05, -0.00178296, 0.0189744, -0.129049, 1.76976, 0.15398) [node name="black_001_2" parent="base/rig/Skeleton3D" index="6"] -transform = Transform3D(-0.0190541, -3.40764e-05, 0.000386169, -1.69517e-05, -0.0188928, -0.00250357, 0.000387299, -0.00250339, 0.0188889, -0.0436611, 1.78471, 0.172163) +transform = Transform3D(-0.0190466, 0.000652147, 0.000100708, -0.000658708, -0.0189632, -0.00178055, 3.9278e-05, -0.00178296, 0.0189744, -0.129049, 1.76976, 0.15398) [node name="AnimationPlayerLibrary" type="AnimationPlayer" parent="." index="2"] libraries = { @@ -502,11 +554,11 @@ libraries = { [node name="AnimationTree" type="AnimationTree" parent="." index="3"] tree_root = SubResource("AnimationNodeBlendTree_uygj1") anim_player = NodePath("../AnimationPlayerLibrary") -parameters/BlendSpace1D/blend_position = 3.0 -"parameters/BlendSpace1D 2/blend_position" = 3.0 -parameters/Transition/current_state = "talk2" -parameters/Transition/transition_request = "" -parameters/Transition/current_index = 1 +parameters/backward/blend_position = 3.0 +parameters/forward/blend_position = 2.98649 parameters/motion/current_state = "forward" parameters/motion/transition_request = "" parameters/motion/current_index = 2 +parameters/talking/current_state = "talk2" +parameters/talking/transition_request = "" +parameters/talking/current_index = 1