【问题标题】:Make character always face the mouse cursor使角色始终面向鼠标光标
【发布时间】:2022-10-13 05:14:03
【问题描述】:

在搜索这个主题时,我发现并测试了许多不同的实现,但我的用例似乎与其他用例略有不同。

我有一个静态相机,但玩家可以在屏幕上自由移动。

当播放器位于屏幕中央时,我的计算工作正常,如下所示。

但是,当我将播放器移动到一个角落(在本例中为右下角)时,它不会面对光标。似乎计算忽略了玩家的位置,只考虑了光标相对于窗口的位置。

我的代码是用 Rust(使用 Bevy 引擎)实现的,但我确信逻辑可以从任何语言改编。

let window_size = Vec2::new(window.width(), window.height());
let difference = mouse_position.extend(0.0) - window_size.extend(0.0) / 2.0 - player.translation;
let angle = difference.y.atan2(difference.x) + PI;

*transforms.get_mut(game.player.entity.unwrap()).unwrap() = Transform {
    translation: player.translation,
    rotation: Quat::from_rotation_y(angle),
    ..default()
};

注意 1:.extend(0.0) 通过将 0.0 添加为 z 将其从 Vec2 转换为 Vec3。

注意 2:player.translation 是一个 Vec3,带有玩家在屏幕上的位置。

【问题讨论】:

  • 似乎摄像机角度与游戏世界并不完全一致。我怀疑它在看你的光标,但它在 xz 平面上方的点在相机后面。您可以通过进行两次转换来修复它。首先需要将鼠标的屏幕空间坐标转换为世界空间。然后可以在不同的深度再次执行此操作,以获得鼠标在世界上可能占据的点。您可以获取此射线与地平面的交点,以发现角色应面向的位置。
  • @Locke 你所说的很可能是真的,因为我从 2d 游戏中复制了逻辑。我不熟悉“Raycasting”,我只是用谷歌搜索,我相信这可能是要走的路。谢谢!

标签: rust trigonometry game-development bevy


【解决方案1】:

正如@Locke 所指出的,这似乎不是调整我的计算的问题,但是缺少一个完整的实现:光线投射,这是 3d 应用程序能够将鼠标坐标转换为 3d 世界位置所必需的。对于 Bevy 和 Rust,我发现了以下似乎提供此功能的库:

https://github.com/aevyrie/bevy_mod_raycast

【讨论】:

    猜你喜欢
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多