在 OpenGL 中的四元数之间进行插值 - 导弹制导

问题描述 投票:0回答:0

我正在使用 OpenGL 和 Rust 制作空战游戏。目前我被困在导弹制导系统上。 思路如下: 导弹在玩家的位置产生,并有玩家的旋转。 导弹有一个目标,它应该每帧都朝着它旋转。

我正在使用四元数来存储每个模型的方向。 四元数在

cgmath
库中实现。

我尝试简单地使用 SLERP 逐渐转向目标,但它导致导弹的奇怪运动。它在发射后立即向左急转,然后继续略微向右转,直到完全偏离目标并开始原地打转,但仍然没有击中目标。如果在 Z 轴正向射击时,导弹将完全失败并向后退到玩家位置的后面。 这是我目前拥有的代码:

let current_quat = self.model.orientation;
let current_vec = self.model.front().normalize();
let vec_to_target = (target.position() - self.position()).normalize();

// Closest rotation that turns current_vec into vec_to_target
let best_quat = Quaternion::from_arc(current_vec, vec_to_target, None);

let new_quat = current_quat.slerp(best_quat, 0.01);
        
self.model.set_orientation(new_quat);

使用 SLERP 是正确的方法吗?我将如何让它发挥作用?提前谢谢你!

math opengl vector linear-algebra quaternions
© www.soinside.com 2019 - 2024. All rights reserved.