switch to using bevy_ballistic
This commit is contained in:
10
Cargo.lock
generated
10
Cargo.lock
generated
@@ -633,6 +633,15 @@ dependencies = [
|
|||||||
"rodio",
|
"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]]
|
[[package]]
|
||||||
name = "bevy_color"
|
name = "bevy_color"
|
||||||
version = "0.15.4"
|
version = "0.15.4"
|
||||||
@@ -2906,6 +2915,7 @@ dependencies = [
|
|||||||
"bevy",
|
"bevy",
|
||||||
"bevy-inspector-egui",
|
"bevy-inspector-egui",
|
||||||
"bevy_asset_loader",
|
"bevy_asset_loader",
|
||||||
|
"bevy_ballistic",
|
||||||
"bevy_polyline",
|
"bevy_polyline",
|
||||||
"bevy_sprite3d",
|
"bevy_sprite3d",
|
||||||
"bevy_trenchbroom",
|
"bevy_trenchbroom",
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ bevy_sprite3d = "4.0.0"
|
|||||||
rand = "=0.8.5"
|
rand = "=0.8.5"
|
||||||
bevy-inspector-egui = { version = "0.30", optional = true }
|
bevy-inspector-egui = { version = "0.30", optional = true }
|
||||||
bevy_polyline = "0.11.0"
|
bevy_polyline = "0.11.0"
|
||||||
|
bevy_ballistic = "0.1.0"
|
||||||
|
|
||||||
[lints.clippy]
|
[lints.clippy]
|
||||||
too_many_arguments = "allow"
|
too_many_arguments = "allow"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ use crate::{
|
|||||||
};
|
};
|
||||||
use avian3d::prelude::*;
|
use avian3d::prelude::*;
|
||||||
use bevy::{pbr::NotShadowCaster, prelude::*};
|
use bevy::{pbr::NotShadowCaster, prelude::*};
|
||||||
|
use bevy_ballistic::launch_velocity;
|
||||||
use bevy_sprite3d::{Sprite3dBuilder, Sprite3dParams};
|
use bevy_sprite3d::{Sprite3dBuilder, Sprite3dParams};
|
||||||
use std::f32::consts::PI;
|
use std::f32::consts::PI;
|
||||||
|
|
||||||
@@ -47,52 +48,6 @@ fn setup(mut commands: Commands, assets: Res<GameAssets>, mut sprite_params: Spr
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn launch_velocity(
|
|
||||||
start_pos: Vec3,
|
|
||||||
target_pos: Vec3,
|
|
||||||
initial_velocity: f32,
|
|
||||||
gravity: f32,
|
|
||||||
) -> Option<Vec3> {
|
|
||||||
// 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(
|
fn on_trigger_state(
|
||||||
trigger: Trigger<TriggerState>,
|
trigger: Trigger<TriggerState>,
|
||||||
mut commands: Commands,
|
mut commands: Commands,
|
||||||
@@ -135,6 +90,7 @@ fn on_trigger_state(
|
|||||||
SPEED,
|
SPEED,
|
||||||
9.81,
|
9.81,
|
||||||
)
|
)
|
||||||
|
.map(|(low, _)| low)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
} else {
|
} else {
|
||||||
rotation.mul_quat(Quat::from_rotation_y(-PI / 2.))
|
rotation.mul_quat(Quat::from_rotation_y(-PI / 2.))
|
||||||
|
|||||||
Reference in New Issue
Block a user