diff --git a/Cargo.lock b/Cargo.lock index 594f5cb..8bb235b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -633,6 +633,15 @@ dependencies = [ "rodio", ] +[[package]] +name = "bevy_ballistic" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fe5d0a61d5239c0bdacc0b4a917d1f485decfb5c316432e48d6f80cd2c39fc6" +dependencies = [ + "bevy_math", +] + [[package]] name = "bevy_color" version = "0.15.4" @@ -2906,6 +2915,7 @@ dependencies = [ "bevy", "bevy-inspector-egui", "bevy_asset_loader", + "bevy_ballistic", "bevy_polyline", "bevy_sprite3d", "bevy_trenchbroom", diff --git a/Cargo.toml b/Cargo.toml index 1d86997..be86a4f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,6 +31,7 @@ bevy_sprite3d = "4.0.0" rand = "=0.8.5" bevy-inspector-egui = { version = "0.30", optional = true } bevy_polyline = "0.11.0" +bevy_ballistic = "0.1.0" [lints.clippy] too_many_arguments = "allow" diff --git a/src/abilities/thrown.rs b/src/abilities/thrown.rs index 27e7214..d9237cd 100644 --- a/src/abilities/thrown.rs +++ b/src/abilities/thrown.rs @@ -12,6 +12,7 @@ use crate::{ }; use avian3d::prelude::*; use bevy::{pbr::NotShadowCaster, prelude::*}; +use bevy_ballistic::launch_velocity; use bevy_sprite3d::{Sprite3dBuilder, Sprite3dParams}; use std::f32::consts::PI; @@ -47,52 +48,6 @@ fn setup(mut commands: Commands, assets: Res, mut sprite_params: Spr }); } -fn launch_velocity( - start_pos: Vec3, - target_pos: Vec3, - initial_velocity: f32, - gravity: f32, -) -> Option { - // Calculate displacement - let delta = target_pos - start_pos; - - // Calculate horizontal distance - let horizontal_dist = (delta.x * delta.x + delta.z * delta.z).sqrt(); - - // Calculate terms for the quadratic formula - let v_squared = initial_velocity * initial_velocity; - let discriminant = v_squared * v_squared - - gravity * (gravity * horizontal_dist * horizontal_dist + 2.0 * delta.y * v_squared); - - if discriminant < 0.0 { - return None; - } - - // Calculate pitch angles - let term1 = v_squared / (gravity * horizontal_dist); - let term2 = discriminant.sqrt() / (gravity * horizontal_dist); - - // let pitch_high = (term1 + term2).atan(); - let pitch_low = (term1 - term2).atan(); - - // Calculate yaw angle - let yaw = delta.z.atan2(delta.x); - - let pitch = pitch_low; - - let dir_x = pitch.cos() * yaw.cos(); - let dir_y = pitch.sin(); - let dir_z = pitch.cos() * yaw.sin(); - - let result = Vec3::new( - initial_velocity * dir_x, - initial_velocity * dir_y, - initial_velocity * dir_z, - ); - - Some(result) -} - fn on_trigger_state( trigger: Trigger, mut commands: Commands, @@ -135,6 +90,7 @@ fn on_trigger_state( SPEED, 9.81, ) + .map(|(low, _)| low) .unwrap() } else { rotation.mul_quat(Quat::from_rotation_y(-PI / 2.))