簡體   English   中英

非常慢且不穩定的相機 Controller in Rust

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM