首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >锈蚀中的慢速和起伏相机控制器

锈蚀中的慢速和起伏相机控制器
EN

Stack Overflow用户
提问于 2022-07-25 11:30:14
回答 1查看 77关注 0票数 0

我目前正在使用OpenGL包装器Glium在Rust中进行简单的呈现。我有一个简单的3D模型和一个相机准备就绪,并开始工作一个合适的相机控制器。我使用device_query检查键盘输入,如果是特定的键盘输入,我只需更改x和y坐标。这是有效的,但它的工作真的很糟糕,不定期和起伏不定。

我的事件循环:

代码语言:javascript
复制
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,
        }

这是我的键盘输入文件:

代码语言:javascript
复制
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;
}

我能做什么使相机尽可能平滑?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-25 12:08:43

不要直接更新输入处理程序中的x/y位置,而是创建两个保持x速度和y速度的变量(xv/yv),然后在输入处理程序中执行如下操作:

代码语言:javascript
复制
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速度积分到一个新位置:

代码语言:javascript
复制
// Update camera position.
x += xv * dt;
y += yv * dt;

现在,当你保持空间时,你会以一个恒定的速度向上移动,而不是不可预测的、起伏不定的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73108493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档