【发布时间】: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