2025-11-23 18:40:48 +00:00
|
|
|
use macroquad::prelude as mq;
|
|
|
|
|
use rapier3d::prelude::*;
|
|
|
|
|
|
|
|
|
|
mod engine;
|
|
|
|
|
use engine::*;
|
|
|
|
|
|
2025-11-23 23:43:48 +00:00
|
|
|
mod camera;
|
2025-12-07 00:41:00 +00:00
|
|
|
mod drone;
|
2025-11-28 20:39:09 +00:00
|
|
|
mod rendering;
|
2025-11-23 23:43:48 +00:00
|
|
|
|
2025-11-23 18:40:48 +00:00
|
|
|
mod graphics_util;
|
|
|
|
|
|
2025-11-28 20:39:09 +00:00
|
|
|
use crate::rendering::Renderer;
|
|
|
|
|
|
2025-11-23 18:40:48 +00:00
|
|
|
#[macroquad::main("3D")]
|
|
|
|
|
async fn main() {
|
2025-11-28 20:39:09 +00:00
|
|
|
let mut world = World::default();
|
|
|
|
|
let mut renderer = Renderer::new();
|
2025-11-23 18:40:48 +00:00
|
|
|
|
2025-12-06 15:38:01 +00:00
|
|
|
renderer.light.set_location(
|
|
|
|
|
vector![70.0, 150.0, -90.0].into(),
|
|
|
|
|
vector![-0.4, -0.7, 0.6].into(),
|
|
|
|
|
);
|
|
|
|
|
|
2025-11-23 18:40:48 +00:00
|
|
|
// Physics Initialization
|
|
|
|
|
world.register_free_collider(
|
2025-12-07 00:41:00 +00:00
|
|
|
ColliderBuilder::cuboid(250.0, 5.0, 250.0)
|
2025-12-03 21:28:27 +00:00
|
|
|
.restitution(0.5)
|
2025-11-23 18:40:48 +00:00
|
|
|
.build(),
|
|
|
|
|
None,
|
|
|
|
|
);
|
2025-12-06 15:38:01 +00:00
|
|
|
// add_objects(&mut world);
|
|
|
|
|
//
|
|
|
|
|
renderer.update_light(&world);
|
2025-11-28 20:39:09 +00:00
|
|
|
|
2025-12-06 15:38:01 +00:00
|
|
|
let drone_rb_handle = world.register_body(
|
|
|
|
|
RigidBodyBuilder::dynamic()
|
|
|
|
|
.translation(vector![0.0, 10.0, 0.0])
|
2025-12-07 00:41:00 +00:00
|
|
|
.rotation(vector![0.6, 0.0, 0.0])
|
|
|
|
|
.linear_damping(0.1)
|
|
|
|
|
.angular_damping(0.1)
|
2025-12-06 15:38:01 +00:00
|
|
|
.build(),
|
|
|
|
|
);
|
|
|
|
|
world.register_collider(
|
|
|
|
|
ColliderBuilder::cuboid(5.0, 0.5, 5.0)
|
|
|
|
|
.restitution(0.3)
|
|
|
|
|
.build(),
|
|
|
|
|
drone_rb_handle,
|
|
|
|
|
None,
|
|
|
|
|
);
|
|
|
|
|
let motor_positions = [
|
2025-12-07 00:41:00 +00:00
|
|
|
point![5.0, 3.0, 5.0],
|
|
|
|
|
point![-5.0, 3.0, 5.0],
|
|
|
|
|
point![-5.0, 3.0, -5.0],
|
|
|
|
|
point![5.0, 3.0, -5.0],
|
2025-12-06 15:38:01 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
|
|
let mut tick = 0;
|
2025-12-07 00:41:00 +00:00
|
|
|
|
2025-11-28 20:39:09 +00:00
|
|
|
loop {
|
|
|
|
|
renderer.update_camera();
|
|
|
|
|
if mq::is_key_pressed(mq::KeyCode::L) {
|
|
|
|
|
renderer
|
|
|
|
|
.light
|
|
|
|
|
.set_location(renderer.camera.position, renderer.camera.front);
|
2025-12-03 21:28:27 +00:00
|
|
|
renderer.update_light(&world);
|
2025-11-28 20:39:09 +00:00
|
|
|
println!(
|
|
|
|
|
"Light Pos: {}, Light Front Vec{}",
|
|
|
|
|
renderer.light.position, renderer.light.front
|
|
|
|
|
);
|
|
|
|
|
}
|
2025-11-23 18:40:48 +00:00
|
|
|
|
2025-11-28 20:39:09 +00:00
|
|
|
if mq::is_key_pressed(mq::KeyCode::C) {
|
|
|
|
|
add_objects(&mut world);
|
|
|
|
|
}
|
2025-11-29 23:22:17 +00:00
|
|
|
if mq::is_key_pressed(mq::KeyCode::M) {
|
|
|
|
|
renderer.apply_config();
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-28 20:39:09 +00:00
|
|
|
// Physics Simulation
|
2025-12-06 15:38:01 +00:00
|
|
|
{
|
|
|
|
|
let drone_rb = world.bodies.get_mut(drone_rb_handle).unwrap();
|
|
|
|
|
drone_rb.reset_forces(true);
|
|
|
|
|
drone_rb.reset_torques(true);
|
|
|
|
|
for (i, pos) in motor_positions.iter().enumerate() {
|
|
|
|
|
// Thrust is applied upward at motor position
|
2025-12-07 00:41:00 +00:00
|
|
|
let mut force = nalgebra::Vector3::new(0.0, drone_rb.mass() * 2.8, 0.0);
|
2025-12-06 15:38:01 +00:00
|
|
|
|
|
|
|
|
// drone_rb.reset_forces(true);
|
|
|
|
|
|
2025-12-07 00:41:00 +00:00
|
|
|
force = drone_rb.rotation().transform_vector(&force);
|
|
|
|
|
drone_rb.add_force_at_point(force, drone_rb.position().transform_point(&pos), true);
|
2025-12-06 15:38:01 +00:00
|
|
|
// drone_rb.apply_force_at_point(force, *pos, true);
|
|
|
|
|
|
|
|
|
|
// let torque = if i % 2 == 0 {
|
|
|
|
|
// vector![0.0, 0.5, 0.0]
|
|
|
|
|
// } else {
|
|
|
|
|
// vector![0.0, 0.5, 0.0]
|
|
|
|
|
// };
|
|
|
|
|
// drone_rb.add_torque(torque, true);
|
|
|
|
|
// println!("{:}", drone_rb.translation());
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-12-03 21:28:27 +00:00
|
|
|
|
2025-12-07 00:41:00 +00:00
|
|
|
world.step();
|
|
|
|
|
|
2025-12-06 15:38:01 +00:00
|
|
|
renderer.draw(&mut world);
|
|
|
|
|
|
|
|
|
|
if tick >= 30 {
|
2025-12-03 21:28:27 +00:00
|
|
|
world.clear_ofb();
|
|
|
|
|
renderer.update_light(&world);
|
2025-12-06 15:38:01 +00:00
|
|
|
tick = 0;
|
2025-12-03 21:28:27 +00:00
|
|
|
}
|
2025-12-06 15:38:01 +00:00
|
|
|
tick += 1;
|
|
|
|
|
|
|
|
|
|
mq::next_frame().await;
|
2025-11-28 20:39:09 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn add_objects(world: &mut World) {
|
|
|
|
|
for i in 0..1 {
|
2025-11-23 23:43:48 +00:00
|
|
|
let body = world.register_body(
|
|
|
|
|
RigidBodyBuilder::dynamic()
|
2025-11-28 20:39:09 +00:00
|
|
|
.translation(vector![0.0, 50.0 + i as f32, 0.0])
|
2025-11-23 23:43:48 +00:00
|
|
|
.rotation(vector![std::f32::consts::PI / 4.2, i as f32, i as f32])
|
|
|
|
|
.build(),
|
|
|
|
|
);
|
|
|
|
|
world.register_collider(
|
2025-12-03 21:28:27 +00:00
|
|
|
ColliderBuilder::cuboid(5.0, 5.0, 5.0)
|
|
|
|
|
.restitution(0.3)
|
2025-11-23 23:43:48 +00:00
|
|
|
.build(),
|
|
|
|
|
body,
|
|
|
|
|
None,
|
|
|
|
|
);
|
|
|
|
|
}
|
2025-11-23 18:40:48 +00:00
|
|
|
}
|