diff --git a/docs/museums/biome_generator/rails.gd b/docs/museums/biome_generator/rails.gd index 304b0e2..1400017 100644 --- a/docs/museums/biome_generator/rails.gd +++ b/docs/museums/biome_generator/rails.gd @@ -7,7 +7,7 @@ extends Path3D @export var axes_distance: float = 3.0 @export var rail_distance: float = 1.2 @export var cameras: Node3D -@export_range(0.0, 1.0) var basic_swing: float = 0.5 +@export_range(0.0, 1.0) var basic_swing: float = 0.1 @export_group("Rails Bulding") @export var sleepers_distance: float = 1.0 @@ -37,6 +37,8 @@ var fireworks_colors: Array[Color] = [ var train_instance: Node3D var train_progress: float = 0.0 var swing_time: float = 0.0 +var curve_roll: float = 0.0 +var curve_pitch: float = 0.0 var stop_offset: Array[float] = [] var stops_position: Array[Vector3] = [] @@ -211,25 +213,42 @@ func train_move(delta: float) -> void: if stop_offset.size() > 0: next_stop_index = stop_offset.size() - 1 var center_position = to_global(curve.sample_baked(train_progress, true)) + var prog_back = wrapf(train_progress - 2.0, 0.0, total_length) + var back_position = to_global(curve.sample_baked(prog_back, true)) var prog_forward = wrapf(train_progress + 2.0, 0.0, total_length) var forward_position = to_global(curve.sample_baked(prog_forward, true)) - + if center_position.distance_to(forward_position) > 0.01: train_instance.global_position = center_position train_instance.look_at(forward_position, Vector3.UP) train_instance.rotate_y(PI) - if cameras: - cameras.global_position = center_position - cameras.global_basis = train_instance.global_basis + if cameras: + cameras.global_position = center_position + cameras.global_basis = train_instance.global_basis + var real_speed = abs(train_speed * stop_multiply) + var speed_factor = clamp(real_speed / max(speed_max, 0.001), 0.0, 1.0) + var dir_prev = (center_position - back_position).normalized() + var dir_next = (forward_position - center_position).normalized() + var signed_curve = dir_prev.cross(dir_next).y + var curve_amount = clamp(abs(signed_curve) * 8.0, 0.0, 1.0) + + curve_roll = lerp(curve_roll, (-signed_curve * 0.08) * speed_factor, delta * 4.0) + curve_pitch = lerp(curve_pitch, curve_amount * 0.012 * speed_factor, delta * 4.0) + if not stop_ongoing: - var real_speed = abs(train_speed * stop_multiply) - swing_time += delta * real_speed * 2.0 + swing_time += delta * real_speed * (2.0 + curve_amount) var amplitude_z = 0.006 * basic_swing var amplitude_x = 0.004 * basic_swing + var curve_sway = sin(swing_time * 1.35) * 0.01 * curve_amount * speed_factor train_instance.rotation.z += sin(swing_time) * amplitude_z train_instance.rotation.x += cos(swing_time * 0.8) * amplitude_x + train_instance.rotation.z += curve_roll + curve_sway + train_instance.rotation.x += curve_pitch + else: + train_instance.rotation.z += curve_roll + train_instance.rotation.x += curve_pitch func _execute_stop(go_forward: bool = true) -> void: stop_ongoing = true