diff --git a/assets/lorge_lad.glb b/assets/lorge_lad.glb new file mode 100644 index 0000000..16edd41 Binary files /dev/null and b/assets/lorge_lad.glb differ diff --git a/assets/lorge_lad.glb.import b/assets/lorge_lad.glb.import new file mode 100644 index 0000000..8956b28 --- /dev/null +++ b/assets/lorge_lad.glb.import @@ -0,0 +1,36 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bt6d30ro3uit" +path="res://.godot/imported/lorge_lad.glb-e2e413a868433256cfb9b59b3d455b44.scn" + +[deps] + +source_file="res://assets/lorge_lad.glb" +dest_files=["res://.godot/imported/lorge_lad.glb-e2e413a868433256cfb9b59b3d455b44.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/pickaxe_arm.blend1 b/pickaxe_arm.blend1 new file mode 100644 index 0000000..805a26b Binary files /dev/null and b/pickaxe_arm.blend1 differ diff --git a/project.godot b/project.godot index 6ee6eb1..f33effc 100644 --- a/project.godot +++ b/project.godot @@ -29,36 +29,26 @@ import/blender/enabled=false [input] -ActivateArm1={ +ActivateFrontLeft={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":49,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) ] } -ActivateArm2={ +ActivateFrontRight={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":50,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) ] } -ActivateArm3={ +ActivateBackLeft={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":51,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) ] } -ActivateArm4={ +ActivateBackRight={ "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":52,"key_label":0,"unicode":52,"location":0,"echo":false,"script":null) ] } -ActivateArm5={ -"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":53,"key_label":0,"unicode":53,"location":0,"echo":false,"script":null) -] -} -ActivateArm6={ -"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":54,"key_label":0,"unicode":54,"location":0,"echo":false,"script":null) -] -} [layer_names] diff --git a/raw_assets/lorge_lad.blend b/raw_assets/lorge_lad.blend new file mode 100644 index 0000000..df49214 Binary files /dev/null and b/raw_assets/lorge_lad.blend differ diff --git a/raw_assets/lorge_lad.blend1 b/raw_assets/lorge_lad.blend1 new file mode 100644 index 0000000..02bcec3 Binary files /dev/null and b/raw_assets/lorge_lad.blend1 differ diff --git a/scenes/body.tscn b/scenes/body.tscn deleted file mode 100644 index 1f00e63..0000000 --- a/scenes/body.tscn +++ /dev/null @@ -1,42 +0,0 @@ -[gd_scene load_steps=7 format=3 uid="uid://dgm3241ceqpim"] - -[ext_resource type="Script" path="res://scripts/body.gd" id="1_21au4"] -[ext_resource type="PackedScene" uid="uid://nusoljma3t55" path="res://scenes/pickaxe_arm.tscn" id="2_m4hhp"] -[ext_resource type="Script" path="res://scripts/camera.gd" id="3_mslwr"] - -[sub_resource type="SphereMesh" id="SphereMesh_jcpb6"] -radius = 5.0 -height = 10.0 - -[sub_resource type="SphereShape3D" id="SphereShape3D_16w3w"] -radius = 5.0 - -[sub_resource type="WorldBoundaryShape3D" id="WorldBoundaryShape3D_vlifr"] -plane = Plane(1000, 0, 0, 0) - -[node name="Body" type="RigidBody3D"] -axis_lock_linear_x = true -axis_lock_angular_z = true -script = ExtResource("1_21au4") - -[node name="MeshInstance3D" type="MeshInstance3D" parent="."] -mesh = SubResource("SphereMesh_jcpb6") - -[node name="CollisionShape3D" type="CollisionShape3D" parent="."] -shape = SubResource("SphereShape3D_16w3w") - -[node name="ArmPivot" type="Node3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.8945, 0) - -[node name="PickaxeArm" parent="ArmPivot" instance=ExtResource("2_m4hhp")] - -[node name="Camera3D" type="Camera3D" parent="."] -transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 32, 0, 0) -script = ExtResource("3_mslwr") - -[node name="RaycastPlane" type="StaticBody3D" parent="."] -collision_layer = 2 -collision_mask = 0 - -[node name="CollisionShape3D" type="CollisionShape3D" parent="RaycastPlane"] -shape = SubResource("WorldBoundaryShape3D_vlifr") diff --git a/scenes/main_scene.tscn b/scenes/main_scene.tscn index bfa930a..12fcbb9 100644 --- a/scenes/main_scene.tscn +++ b/scenes/main_scene.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=10 format=3 uid="uid://n05pnykd3tff"] -[ext_resource type="PackedScene" uid="uid://cjjw0n58nmtfw" path="res://scenes/menu.tscn" id="1_47rnc"] -[ext_resource type="PackedScene" uid="uid://dgm3241ceqpim" path="res://scenes/body.tscn" id="1_eeca8"] +[ext_resource type="PackedScene" path="res://scenes/menu.tscn" id="1_47rnc"] +[ext_resource type="PackedScene" uid="uid://xpl5i3rcmscw" path="res://scenes/robot.tscn" id="2_w22pi"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_fouvd"] sky_top_color = Color(0, 0, 0, 1) @@ -39,8 +39,10 @@ size = Vector3(25, 1, 100) [node name="CanvasLayer" type="CanvasLayer" parent="."] [node name="Menu" parent="CanvasLayer" instance=ExtResource("1_47rnc")] +visible = false [node name="UI" type="Control" parent="CanvasLayer"] +visible = false layout_mode = 3 anchors_preset = 0 offset_right = 40.0 @@ -77,5 +79,5 @@ skeleton = NodePath("../..") [node name="CollisionShape3D" type="CollisionShape3D" parent="World/StaticBody3D2"] shape = SubResource("BoxShape3D_qcnmp") -[node name="Body" parent="World" instance=ExtResource("1_eeca8")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 11.4413, 0) +[node name="Robot" parent="World" instance=ExtResource("2_w22pi")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 0) diff --git a/scenes/robot.tscn b/scenes/robot.tscn new file mode 100644 index 0000000..2bbe036 --- /dev/null +++ b/scenes/robot.tscn @@ -0,0 +1,89 @@ +[gd_scene load_steps=4 format=3 uid="uid://xpl5i3rcmscw"] + +[ext_resource type="PackedScene" uid="uid://bt6d30ro3uit" path="res://assets/lorge_lad.glb" id="1_yl7yu"] +[ext_resource type="Script" path="res://scripts/robot.gd" id="2_gcxpt"] +[ext_resource type="Script" path="res://scripts/arm.gd" id="2_kj7im"] + +[node name="Robot" node_paths=PackedStringArray("arms", "skeleton") instance=ExtResource("1_yl7yu")] +script = ExtResource("2_gcxpt") +arms = [NodePath("Skeleton3D/BackRightIK"), NodePath("Skeleton3D/FrontRightIK"), NodePath("Skeleton3D/FrontLeftIK"), NodePath("Skeleton3D/BackLeftIK")] +body_offset = 1.0 +skeleton = NodePath("Skeleton3D") +body_bone = &"Bone" + +[node name="Skeleton3D" parent="." index="0"] +bones/25/rotation = Quaternion(-1.26218e-29, 4.893e-22, -2.98023e-08, 1) +bones/27/rotation = Quaternion(0.5, -0.5, -0.5, -0.5) +bones/28/rotation = Quaternion(2.37545e-17, 2.18557e-08, 6.01506e-30, 1) +bones/53/rotation = Quaternion(-6.7435e-08, 0.707107, 0.707107, -6.7435e-08) + +[node name="BackRightSocket" parent="Skeleton3D" index="0"] +transform = Transform3D(0.707107, -3.09086e-08, -0.707106, 1.0842e-15, 1, -4.37114e-08, 0.707107, 3.09086e-08, 0.707107, 0.598254, 0.00174576, 0.598254) + +[node name="FrontRightSocket" parent="Skeleton3D" index="1"] +transform = Transform3D(0.707107, -1.09501e-22, -0.707107, -2.68658e-22, 1, -4.23516e-22, 0.707107, 4.89441e-22, 0.707107, 0.598254, 0.00174576, -0.598254) + +[node name="FrontLeftSocket" parent="Skeleton3D" index="2"] +transform = Transform3D(0.707107, 3.09086e-08, -0.707106, -4.7509e-17, 1, 4.37114e-08, 0.707106, -3.09086e-08, 0.707107, -0.598254, 0.00174576, -0.598253) + +[node name="Body_001" parent="Skeleton3D" index="3"] +transform = Transform3D(0.707107, 0, -0.707106, 0, 1, 0, 0.707106, 0, 0.707107, 1.19412e-07, -2.32831e-09, 1.78611e-07) + +[node name="Body_001" parent="Skeleton3D/Body_001" index="0"] +visible = false + +[node name="Camera3D" type="Camera3D" parent="Skeleton3D/Body_001" index="1"] +transform = Transform3D(-0.707107, 0, 0.707107, 0, 1, 0, -0.707107, 0, -0.707107, 2.82843, 2.32831e-09, -2.82843) +current = true + +[node name="BackLeftSocket" parent="Skeleton3D" index="4"] +transform = Transform3D(0.707107, -1.66533e-14, -0.707107, 1.11022e-14, 1, 1.05557e-15, 0.707106, 2.22045e-14, 0.707107, -0.598254, 0.00174576, 0.598254) + +[node name="BackRightIK" type="SkeletonIK3D" parent="Skeleton3D" index="9"] +root_bone = &"BackRight_Root" +tip_bone = &"BackRight_Tip" +use_magnet = true +magnet = Vector3(0, 5, 0) +target_node = NodePath("../BackRightTarget") +script = ExtResource("2_kj7im") +action = &"ActivateBackRight" + +[node name="FrontRightIK" type="SkeletonIK3D" parent="Skeleton3D" index="10"] +root_bone = &"FrontRight_Root" +tip_bone = &"FrontRight_Tip" +use_magnet = true +magnet = Vector3(0, 5, 0) +target_node = NodePath("../FrontRightTarget") +script = ExtResource("2_kj7im") +action = &"ActivateFrontRight" + +[node name="FrontLeftIK" type="SkeletonIK3D" parent="Skeleton3D" index="11"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +root_bone = &"FrontLeft_Root" +tip_bone = &"FrontLeft_Tip" +use_magnet = true +magnet = Vector3(0, 5, 0) +target_node = NodePath("../FrontLeftTarget") +script = ExtResource("2_kj7im") +action = &"ActivateFrontLeft" + +[node name="BackLeftIK" type="SkeletonIK3D" parent="Skeleton3D" index="12"] +root_bone = &"BackLeft_Root" +tip_bone = &"BackLeft_Tip" +use_magnet = true +magnet = Vector3(0, 5, 0) +target_node = NodePath("../BackLeftTarget") +script = ExtResource("2_kj7im") +action = &"ActivateBackLeft" + +[node name="BackRightTarget" type="Marker3D" parent="Skeleton3D" index="13"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, -0.744633, 1.5) + +[node name="FrontRightTarget" type="Marker3D" parent="Skeleton3D" index="14"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, -0.744633, -1.5) + +[node name="FrontLeftTarget" type="Marker3D" parent="Skeleton3D" index="15"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.5, -0.744633, -1.5) + +[node name="BackLeftTarget" type="Marker3D" parent="Skeleton3D" index="16"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.5, -0.744633, 1.5) diff --git a/scripts/arm.gd b/scripts/arm.gd index 0e8e706..cef4c9e 100644 --- a/scripts/arm.gd +++ b/scripts/arm.gd @@ -1,34 +1,31 @@ -class_name Arm extends Node3D +@tool -@onready var camera: Camera3D = $"../../Camera3D" -@onready var target: Marker3D = $Target -@onready var ik_skeleton: SkeletonIK3D = $Skeleton3D/SkeletonIK3D +class_name Arm extends SkeletonIK3D + +@onready var ik_target = get_node(target_node) +@onready var skeleton: Skeleton3D = get_parent_skeleton() @export var action: StringName +@export var move_speed: float = 1.5 + +var input_dir: Vector2 +var tip_bone_trans: Transform3D func _ready() -> void: - #$Skeleton3D/PhysicalBoneSimulator3D.physical_bones_start_simulation() - pass + modification_processed.connect(_on_modification_processed) + + start() -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta: float) -> void: - #ik_skeleton.start() - pass +func _unhandled_input(event: InputEvent) -> void: + if event is InputEventMouseMotion: + input_dir = event.relative -func update_target_pos() -> void: - var mouse_pos: Vector2 = camera.get_window().get_mouse_position() - - var origin: Vector3 = camera.project_ray_origin(mouse_pos) - var dir: Vector3 = origin + (camera.project_ray_normal(mouse_pos) * 100) - - var world_space: PhysicsDirectSpaceState3D = camera.get_window().world_3d.direct_space_state - var ray_query = PhysicsRayQueryParameters3D.create(origin, dir) - var collision: Dictionary = world_space.intersect_ray(ray_query) - - if collision == null: return - - var arm_target_pos: Vector3 = collision["position"] - print(collision) - target.global_position.z = arm_target_pos.z - target.global_position.y = arm_target_pos.y +func update_target_pos(delta: float) -> void: + ik_target.global_position.z -= input_dir.x * delta * move_speed + ik_target.global_position.y -= input_dir.y * delta * move_speed + input_dir = Vector2.ZERO + +func _on_modification_processed() -> void: + var tip_bone_id: int = skeleton.find_bone(tip_bone) + tip_bone_trans = skeleton.get_bone_global_pose(tip_bone_id) diff --git a/scripts/body.gd b/scripts/body.gd deleted file mode 100644 index d864dcf..0000000 --- a/scripts/body.gd +++ /dev/null @@ -1,25 +0,0 @@ -class_name Body extends Node3D - -@export var arms: Array[Arm] -@export var pull_strength: float = 5.0 - -var active_arm: Arm - -# Called when the node enters the scene tree for the first time. -func _ready() -> void: - pass - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _unhandled_input(event: InputEvent) -> void: - for arm in arms: - if Input.is_action_pressed(arm.action): - active_arm = arm - return - if Input.is_action_just_released(arm.action): - active_arm = null - return - -func _physics_process(delta: float) -> void: - if active_arm == null: return - - active_arm.update_target_pos() diff --git a/scripts/main.gd b/scripts/main.gd new file mode 100644 index 0000000..08f4a43 --- /dev/null +++ b/scripts/main.gd @@ -0,0 +1,4 @@ +extends Node3D + +func _ready() -> void: + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED diff --git a/scripts/robot.gd b/scripts/robot.gd new file mode 100644 index 0000000..15dce6b --- /dev/null +++ b/scripts/robot.gd @@ -0,0 +1,55 @@ +class_name Body extends Node3D + +@export var arms: Array[Arm] +@export var body_offset: float = 0.25 +@export var skeleton: Skeleton3D +@export var body_bone: StringName +@onready var previous_position: Vector3 = global_position + +var active_arm: Arm + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _unhandled_input(event: InputEvent) -> void: + for arm in arms: + if Input.is_action_pressed(arm.action): + active_arm = arm + return + if Input.is_action_just_released(arm.action): + active_arm = null + return + +func _physics_process(delta: float) -> void: + if active_arm == null: return + + active_arm.update_target_pos(delta) + + var avg_tip_pos: Vector3 + var avg_tip_basis: Basis + + for arm in arms: + var tip_bone_global_pos: Vector3 = skeleton.to_global(arm.tip_bone_trans.origin) + #var tip_bone_global_basis: Basis = arm.tip_bone_tras.basis + + avg_tip_pos += tip_bone_global_pos + + #avg_tip_basis.x += tip_bone_global_basis.x + #avg_tip_basis.y += tip_bone_global_basis.y + #avg_tip_basis.z += tip_bone_global_basis.z + + avg_tip_pos /= arms.size() + #avg_tip_basis.x /= arms.size() + #avg_tip_basis.y /= arms.size() + #avg_tip_basis.z /= arms.size() + + #skeleton.global_position = avg_tip_pos + #var m = MeshInstance3D.new() + var body_bone_id: int = skeleton.find_bone(body_bone) + var body_bone_transform = skeleton.get_bone_global_pose(body_bone_id) + var velocity = global_position - previous_position + print(global_position, previous_position, velocity, avg_tip_pos) + var global_pos = avg_tip_pos + velocity * body_offset + body_bone_transform.origin = global_pos + skeleton.set_bone_global_pose(body_bone_id, body_bone_transform) + previous_position = global_pos + #m.global_position = avg_tip_pos + #skeleton.global_basis = avg_tip_basis