我不明白贝弗的轮换制是怎么运作的。我只是想旋转一个精灵跟随我的光标位置。
有人能给予我一段代码让它工作吗?
我试过了,但不起作用:Bevy rotation in 2d
use bevy::math::{Quat, Vec2};
let pos = transform.translation.truncate(); // player position
let target = event.position; // cursor position
let angle = (target - pos).angle_between(pos); // NaN
transform.rotation = Quat::from_rotation_z(angle);
在上面做一个Angular = NaN,所以它不起作用。
let pos = transform.translation.truncate(); // player position
let target = cursor_position; // cursor position
let direction = target - pos;
let angle = direction.y.atan2(direction.x); // Calculate angle between direction and x-axis
transform.rotation = Quat::from_rotation_z(angle);
结果如下:
这里是repo,如果你想试试:https://github.com/theocerutti/SpaceGameRust
谢谢!
2条答案
按热度按时间h4cxqtbf1#
所需要的是将播放器的前部朝向光标旋转。为了做到这一点,还需要描述玩家正面方向的矢量。
angle = (target - pos).angle_between(pos)
没有帮助,因为pos
没有描述玩家的方向。pos
只是玩家的位置。找到向量
target-pos
相对于x轴的Angular 是有用的,但还不够。从该Angular ,应当减去玩家的取向相对于X轴的Angular 。这将给予所需的旋转Angular 。播放器应基于所产生的Angular 围绕穿过播放器的z轴旋转。要获得有效的解决方案,需要执行以下操作:
确保目标和玩家的坐标在同一参考系中。
atan2
返回(-Pi,Pi]中的值。它必须被转换成[0,2*Pi)中的值。在获取目标相对于x轴的Angular 时,请确保执行此操作。有一个单独的变量来跟踪对象相对于x轴的方向。从目标相对于x轴的Angular 中减去该Angular 。
关于播放器的方向是否必须在每次旋转播放器时更新的观察见下文。
当前系统仅在
player_orient
未更新时才工作,即player_orient = (player_orient + angle_to_rotate) % (2.0*PI);
被注解掉。同时,angle_to_rotate
必须设置为angle_to_target - player_orient
。否则,观察到90度偏移。可能地,在每个帧中,在显示玩家之前,系统假设玩家相对于x轴成90度,然后计算旋转的Angular 并旋转玩家。dzjeubhm2#
你就快到了!主要的问题是你要计算位置向量和方向向量之间的Angular ,但是你应该计算方向向量和x轴之间的Angular :
atan2
函数用于获取方向向量与x轴之间的Angular ,这是旋转的正确Angular