我目前正在使用OpenGL包装器Glium在Rust中进行简单的呈现。我有一个简单的3D模型和一个相机准备就绪,并开始工作一个合适的相机控制器。我使用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,
}这是我的键盘输入文件:
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;
}我能做什么使相机尽可能平滑?
发布于 2022-07-25 12:08:43
不要直接更新输入处理程序中的x/y位置,而是创建两个保持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速度积分到一个新位置:
// Update camera position.
x += xv * dt;
y += yv * dt;现在,当你保持空间时,你会以一个恒定的速度向上移动,而不是不可预测的、起伏不定的。
https://stackoverflow.com/questions/73108493
复制相似问题