[英]Very Slow and Choppy Camera Controller in Rust
我目前正在使用 OpenGL Wrapper Glium 在 Rust 中進行簡單渲染。 我有一個簡單的 3D model 和一個准備好的相機,並開始使用合適的相機 controller。 我正在使用 device_query 檢查鍵盤輸入,如果它是特定鍵盤輸入,我只需更改 x 和 y 坐標。 這行得通,但它的工作原理非常糟糕,反復無常和波濤洶涌。
我的事件循環:
event_loop.run(move |event, _, control_flow| {
let next_frame_time =
std::time::Instant::now() + std::time::Duration::from_nanos(16_666_667);
####### This is where I change the coordinates ########
x = keyboardinput::keyboard_input_x(x);
y = keyboardinput::keyboard_input_y(y);
*control_flow = glutin::event_loop::ControlFlow::WaitUntil(next_frame_time);
match event {
glutin::event::Event::WindowEvent { event, .. } => match event {
glutin::event::WindowEvent::CloseRequested => {
*control_flow = glutin::event_loop::ControlFlow::Exit;
return;
}
_ => return,
},
glutin::event::Event::NewEvents(cause) => match cause {
glutin::event::StartCause::ResumeTimeReached { .. } => (),
glutin::event::StartCause::Init => (),
_ => return,
},
_ => return,
}
這是我的鍵盤輸入 rs 文件:
use device_query::{DeviceQuery, DeviceState, Keycode};
pub fn keyboard_input_x(mut x: f32) -> f32 {
let device_state = DeviceState::new();
let keys: Vec<Keycode> = device_state.get_keys();
for key in keys.iter() {
println!("Pressed key: {:?}", key);
if key == &Keycode::W {
x -= 0.03;
return x;
}
if key == &Keycode::S {
x += 0.03;
return x;
}
}
return x;
}
pub fn keyboard_input_y(mut y: f32) -> f32 {
let device_state = DeviceState::new();
let keys: Vec<Keycode> = device_state.get_keys();
for key in keys.iter() {
println!("Pressed key: {:?}", key);
if key == &Keycode::Space {
y += 0.03;
return y;
}
if key == &Keycode::LControl {
y -= 0.03;
return y;
}
}
return y;
}
我該怎么做才能使相機盡可能平滑?
不要在輸入處理程序中直接更新您的x
/ y
position,而是創建兩個變量來保存您的 x 速度和 y 速度( xv
/ yv
),然后在您的輸入處理程序中執行以下操作:
bool space_pressed = false;
for key in keys.iter() {
if key == &Keycode::Space {
space_pressed = true;
}
}
if space_pressed {
yv = 1.0; // Move up.
} else {
yv = 0.0; // Don't move.
}
在計算每一幀的主循環中,以秒為單位計算自上一幀以來的時間量(通常稱為 delta-t 或dt
),並將 x 速度和 y 速度整合到新的 position 中:
// Update camera position.
x += xv * dt;
y += yv * dt;
現在,當您保持空間時,您將以恆定的速度向上移動,而不是不可預測和波濤洶涌。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.