fix aiming on elevation
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
[ext_resource type="Script" path="res://scripts/player.gd" id="1_xt3i8"]
|
[ext_resource type="Script" path="res://scripts/player.gd" id="1_xt3i8"]
|
||||||
|
|
||||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_14v7g"]
|
[sub_resource type="CylinderShape3D" id="CylinderShape3D_apl1i"]
|
||||||
height = 1.8
|
height = 1.8
|
||||||
|
|
||||||
[sub_resource type="CapsuleMesh" id="CapsuleMesh_dtg5r"]
|
[sub_resource type="CapsuleMesh" id="CapsuleMesh_dtg5r"]
|
||||||
@@ -16,7 +16,7 @@ script = ExtResource("1_xt3i8")
|
|||||||
|
|
||||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9, 0)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9, 0)
|
||||||
shape = SubResource("CapsuleShape3D_14v7g")
|
shape = SubResource("CylinderShape3D_apl1i")
|
||||||
|
|
||||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
|
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9, 0)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9, 0)
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
[gd_scene load_steps=6 format=3 uid="uid://c0buetf2h266d"]
|
[gd_scene load_steps=5 format=3 uid="uid://c0buetf2h266d"]
|
||||||
|
|
||||||
[ext_resource type="Material" uid="uid://btpy4dp5lb8il" path="res://resources/materials/test_triplanar.tres" id="1_ixaua"]
|
[ext_resource type="Material" uid="uid://btpy4dp5lb8il" path="res://resources/materials/test_triplanar.tres" id="1_ixaua"]
|
||||||
[ext_resource type="Script" path="res://scripts/camera/following_camera.gd" id="2_7j742"]
|
|
||||||
[ext_resource type="PackedScene" uid="uid://b73y71y3efmv" path="res://scenes/player.tscn" id="2_f4ehn"]
|
[ext_resource type="PackedScene" uid="uid://b73y71y3efmv" path="res://scenes/player.tscn" id="2_f4ehn"]
|
||||||
[ext_resource type="Script" path="res://scripts/camera/main_camera.gd" id="3_f4hhh"]
|
[ext_resource type="Script" path="res://scripts/camera/main_camera.gd" id="3_f4hhh"]
|
||||||
|
|
||||||
@@ -10,8 +9,6 @@
|
|||||||
[node name="Test" type="Node"]
|
[node name="Test" type="Node"]
|
||||||
|
|
||||||
[node name="Player" parent="." instance=ExtResource("2_f4ehn")]
|
[node name="Player" parent="." instance=ExtResource("2_f4ehn")]
|
||||||
process_priority = 1
|
|
||||||
process_physics_priority = 1
|
|
||||||
|
|
||||||
[node name="Geometry" type="Node" parent="."]
|
[node name="Geometry" type="Node" parent="."]
|
||||||
|
|
||||||
@@ -28,22 +25,14 @@ size = Vector3(50, 1, 50)
|
|||||||
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Lights"]
|
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Lights"]
|
||||||
transform = Transform3D(0.994881, 0.0858869, -0.0532522, 0, 0.526956, 0.849893, 0.101056, -0.845542, 0.524258, 0, 0, 0)
|
transform = Transform3D(0.994881, 0.0858869, -0.0532522, 0, 0.526956, 0.849893, 0.101056, -0.845542, 0.524258, 0, 0, 0)
|
||||||
shadow_enabled = true
|
shadow_enabled = true
|
||||||
|
shadow_blur = 6.0
|
||||||
[node name="Cameras" type="Node" parent="."]
|
|
||||||
|
|
||||||
[node name="FollowingCamera" type="Camera3D" parent="Cameras"]
|
|
||||||
fov = 20.0
|
|
||||||
near = 35.0
|
|
||||||
far = 100.0
|
|
||||||
script = ExtResource("2_7j742")
|
|
||||||
height_offset = 0.5
|
|
||||||
distance = 50.0
|
|
||||||
angle_degrees = Vector3(-35, -45, 0)
|
|
||||||
|
|
||||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
|
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
|
||||||
environment = SubResource("Environment_wctar")
|
environment = SubResource("Environment_wctar")
|
||||||
|
|
||||||
[node name="MainCamera" type="Camera3D" parent="." node_paths=PackedStringArray("current_camera")]
|
[node name="MainCamera" type="Camera3D" parent="."]
|
||||||
transform = Transform3D(0.866025, -0.321394, 0.383022, 0, 0.766044, 0.642788, -0.5, -0.55667, 0.663414, 4.894, 6.43, 6.963)
|
transform = Transform3D(0.866025, -0.321394, 0.383022, 0, 0.766044, 0.642788, -0.5, -0.55667, 0.663414, 4.894, 6.43, 6.963)
|
||||||
|
current = true
|
||||||
|
fov = 20.0
|
||||||
|
near = 35.0
|
||||||
script = ExtResource("3_f4hhh")
|
script = ExtResource("3_f4hhh")
|
||||||
current_camera = NodePath("../Cameras/FollowingCamera")
|
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
class_name FollowingCamera
|
|
||||||
extends Camera3D
|
|
||||||
|
|
||||||
@export var height_offset: float = 0.4
|
|
||||||
@export var distance: float = 6
|
|
||||||
@export var angle_degrees: Vector3
|
|
||||||
|
|
||||||
|
|
||||||
func _process(_delta: float) -> void:
|
|
||||||
var follow_position := (
|
|
||||||
Referencer.player.global_position + Vector3.UP * height_offset
|
|
||||||
)
|
|
||||||
|
|
||||||
global_rotation_degrees = angle_degrees
|
|
||||||
global_position = follow_position + transform.basis.z * distance
|
|
||||||
@@ -1,7 +1,12 @@
|
|||||||
class_name MainCamera
|
class_name MainCamera
|
||||||
extends Camera3D
|
extends Camera3D
|
||||||
|
|
||||||
@export var current_camera: Camera3D
|
@export var height_offset: float = 0.5
|
||||||
|
@export var distance: float = 50
|
||||||
|
@export var angle_degrees: Vector3 = Vector3(-35, -45, 0)
|
||||||
|
@export var aim_offset_factor: float = 0.2
|
||||||
|
|
||||||
|
var _floor_height: float = 0
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
@@ -9,12 +14,18 @@ func _ready() -> void:
|
|||||||
|
|
||||||
|
|
||||||
func _process(_delta: float) -> void:
|
func _process(_delta: float) -> void:
|
||||||
global_position = current_camera.global_position
|
var player_position := Referencer.player.global_position
|
||||||
global_rotation = current_camera.global_rotation
|
if Referencer.player.is_on_floor():
|
||||||
fov = current_camera.fov
|
_floor_height = player_position.y
|
||||||
near = current_camera.near
|
player_position.y = _floor_height
|
||||||
far = current_camera.far
|
|
||||||
|
|
||||||
|
var mouse_pos := get_viewport().get_mouse_position()
|
||||||
|
var aim_position := Player.mouse_project(mouse_pos, player_position, self)
|
||||||
|
|
||||||
func is_camera_current(camera: Camera3D) -> bool:
|
var aim_relative := aim_position - player_position
|
||||||
return current_camera == camera
|
var follow_position := player_position + aim_relative * aim_offset_factor
|
||||||
|
|
||||||
|
global_rotation_degrees = angle_degrees
|
||||||
|
global_position = (
|
||||||
|
follow_position + Vector3.UP * height_offset + transform.basis.z * distance
|
||||||
|
)
|
||||||
|
|||||||
@@ -10,7 +10,10 @@ const FALL_ACCELERATION: float = 25
|
|||||||
|
|
||||||
@export var _respawn_height: float = -5
|
@export var _respawn_height: float = -5
|
||||||
|
|
||||||
|
var aim_position: Vector3
|
||||||
|
|
||||||
var _respawn_point: Vector3
|
var _respawn_point: Vector3
|
||||||
|
var _floor_height: float = 0
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
@@ -19,7 +22,9 @@ func _ready() -> void:
|
|||||||
|
|
||||||
|
|
||||||
func _process(_delta: float) -> void:
|
func _process(_delta: float) -> void:
|
||||||
_mouse_turning()
|
_mouse_aiming()
|
||||||
|
look_at(aim_position, Vector3.UP, true)
|
||||||
|
|
||||||
_process_respawning()
|
_process_respawning()
|
||||||
|
|
||||||
|
|
||||||
@@ -27,23 +32,33 @@ func _physics_process(delta: float) -> void:
|
|||||||
if not is_multiplayer_authority():
|
if not is_multiplayer_authority():
|
||||||
return
|
return
|
||||||
|
|
||||||
_mouse_turning()
|
|
||||||
_lateral_movement(delta)
|
_lateral_movement(delta)
|
||||||
_vertical_movement(delta)
|
_vertical_movement(delta)
|
||||||
|
|
||||||
move_and_slide()
|
move_and_slide()
|
||||||
|
|
||||||
|
|
||||||
func _mouse_turning() -> void:
|
static func mouse_project(
|
||||||
var mouse_pos := get_viewport().get_mouse_position()
|
mouse_pos: Vector2, player_pos: Vector3, camera: Camera3D
|
||||||
var camera := Referencer.main_camera
|
) -> Vector3:
|
||||||
var from := camera.project_ray_origin(mouse_pos)
|
var from := camera.project_ray_origin(mouse_pos)
|
||||||
var direction := camera.project_ray_normal(mouse_pos)
|
var direction := camera.project_ray_normal(mouse_pos)
|
||||||
var plane := Plane(Vector3.UP, global_position)
|
var plane := Plane(Vector3.UP, player_pos)
|
||||||
var intersection: Variant = plane.intersects_ray(from, direction)
|
var intersection: Variant = plane.intersects_ray(from, direction)
|
||||||
if not intersection:
|
if not intersection:
|
||||||
return
|
return Vector3.ZERO
|
||||||
look_at(intersection as Vector3, Vector3.UP, true)
|
return intersection as Vector3
|
||||||
|
|
||||||
|
|
||||||
|
func _mouse_aiming() -> void:
|
||||||
|
var mouse_pos := get_viewport().get_mouse_position()
|
||||||
|
var player_position := global_position
|
||||||
|
if is_on_floor():
|
||||||
|
_floor_height = player_position.y
|
||||||
|
player_position.y = _floor_height
|
||||||
|
var camera := Referencer.main_camera
|
||||||
|
aim_position = mouse_project(mouse_pos, player_position, camera)
|
||||||
|
aim_position.y = global_position.y
|
||||||
|
|
||||||
|
|
||||||
func _process_respawning() -> void:
|
func _process_respawning() -> void:
|
||||||
|
|||||||
Reference in New Issue
Block a user