This commit is contained in:
Leon Liu 2025-08-14 16:52:35 +09:00
parent b992a1dd5f
commit c798cc8547

View File

@ -3,7 +3,7 @@ use bevy::{
input::mouse::{MouseScrollUnit, MouseWheel}, input::mouse::{MouseScrollUnit, MouseWheel},
math::DVec3, math::DVec3,
prelude::*, prelude::*,
window::{WindowMode, WindowResolution}, window::{WindowMode, WindowResized, WindowResolution},
}; };
use bevy_inspector_egui::{bevy_egui::EguiPlugin, quick::WorldInspectorPlugin}; use bevy_inspector_egui::{bevy_egui::EguiPlugin, quick::WorldInspectorPlugin};
use iyes_perf_ui::{PerfUiPlugin, prelude::*}; use iyes_perf_ui::{PerfUiPlugin, prelude::*};
@ -206,7 +206,6 @@ fn sync_name_labels(
mut commands: Commands, mut commands: Commands,
objects_with_names: Query<(Entity, &Name, &Position), Changed<Name>>, objects_with_names: Query<(Entity, &Name, &Position), Changed<Name>>,
existing_labels: Query<&ObjectLabel>, existing_labels: Query<&ObjectLabel>,
ui_scale: Res<UiScale>,
) { ) {
for (entity, name, _position) in objects_with_names.iter() { for (entity, name, _position) in objects_with_names.iter() {
// Check if label already exists for this entity // Check if label already exists for this entity
@ -243,7 +242,6 @@ fn update_label_positions(
mut label_query: Query<(&mut Node, &ObjectLabel, &mut Text), With<ObjectLabel>>, mut label_query: Query<(&mut Node, &ObjectLabel, &mut Text), With<ObjectLabel>>,
objects_query: Query<(&GlobalTransform, &Name, &Radius)>, objects_query: Query<(&GlobalTransform, &Name, &Radius)>,
camera_query: Query<(&Camera, &GlobalTransform)>, camera_query: Query<(&Camera, &GlobalTransform)>,
ui_scale: Res<UiScale>,
) { ) {
let Ok((camera, camera_transform)) = camera_query.single() else { let Ok((camera, camera_transform)) = camera_query.single() else {
return; return;
@ -491,11 +489,10 @@ fn n_body(mut query: Query<(&Mass, &mut Position, &mut Velocity)>) {
.map(|(mass, pos, vel)| (mass.0.0, pos.0.0, vel.0.0)) .map(|(mass, pos, vel)| (mass.0.0, pos.0.0, vel.0.0))
.collect(); .collect();
// Perform integration steps // Helper function to calculate gravitational forces
for _ in 0..STEPS { let calculate_forces = |bodies: &Vec<(f64, DVec3, DVec3)>| -> Vec<DVec3> {
// Calculate forces for all bodies
let mut forces: Vec<DVec3> = vec![DVec3::ZERO; bodies.len()]; let mut forces: Vec<DVec3> = vec![DVec3::ZERO; bodies.len()];
for i in 0..bodies.len() { for i in 0..bodies.len() {
for j in 0..bodies.len() { for j in 0..bodies.len() {
if i != j { if i != j {
@ -504,26 +501,36 @@ fn n_body(mut query: Query<(&Mass, &mut Position, &mut Velocity)>) {
if r_mag_au > 1e-10 { if r_mag_au > 1e-10 {
// Avoid division by zero // Avoid division by zero
// Calculate force directly in AU/day² units // Calculate gravitational acceleration in AU/day² units
let force_magnitude = let acceleration_magnitude = G_AU * bodies[j].0 / (r_mag_au * r_mag_au);
G_AU * bodies[i].0 * bodies[j].0 / (r_mag_au * r_mag_au); let acceleration_vec = r_vec.normalize() * acceleration_magnitude;
let acceleration = force_magnitude / bodies[i].0; // F/m = a forces[i] += acceleration_vec;
let force_vec = r_vec.normalize() * acceleration;
forces[i] += force_vec;
} }
} }
} }
} }
forces
};
// Update velocities and positions using Verlet integration // Perform integration steps using Leapfrog (Verlet) symplectic integrator
for _ in 0..STEPS {
// Step 1: Half-step momentum update - p ← p - (h/2)∇U(q)
let forces = calculate_forces(&bodies);
for i in 0..bodies.len() { for i in 0..bodies.len() {
// Update velocity: v += a * dt bodies[i].2 += forces[i] * (DT * 0.5); // Update velocity (momentum/mass)
bodies[i].2 += forces[i] * DT; }
// Update position: x += v * dt // Step 2: Full-step position update - q ← q + h∇T(p)
// For classical mechanics, ∇T(p) = p/m = v (velocity)
for i in 0..bodies.len() {
let velocity = bodies[i].2; let velocity = bodies[i].2;
bodies[i].1 += velocity * DT; bodies[i].1 += velocity * DT; // Update position
}
// Step 3: Half-step momentum update - p ← p - (h/2)∇U(q)
let forces = calculate_forces(&bodies);
for i in 0..bodies.len() {
bodies[i].2 += forces[i] * (DT * 0.5); // Update velocity again
} }
} }