rust 从光标位置旋转精灵

eanckbw9  于 2023-06-06  发布在  其他
关注(0)|答案(2)|浏览(612)

我不明白贝弗的轮换制是怎么运作的。我只是想旋转一个精灵跟随我的光标位置。
有人能给予我一段代码让它工作吗?
我试过了,但不起作用: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
谢谢!

h4cxqtbf

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 。
关于播放器的方向是否必须在每次旋转播放器时更新的观察见下文。

use bevy::math::{Quat, Vec2};
use std::f32::consts::PI;

// Initialize player orientation at the very beginning.
// It is the angle with respect to X-axis.
// IMPORTANT NOTE: Check what value it is (0 degrees or 90 degrees etc)
// and set it here.
let player_orient = PI/2.0;

...

let pos = transform.translation.truncate(); // player position
let target = Vec2::new(cursor_position.x - window.width() / 2., cursor_position.y - window.height() / 2.);                // cursor position
let direction = target - pos; 

// obtain angle to target with respect to x-axis. 
let mut angle_to_target = direction.y.atan2(direction.x);
// represent angle_to_target in [0, 2*PI)
if angle_to_target < 0. {
  angle_to_target += 2.0*PI;
}

let angle_to_rotate = angle_to_target - player_orient;
transform.rotation = Quat::from_rotation_z(angle_to_rotate);

// Update the player's orientation.
// Always, represent it in the range [0, 2*PI).
player_orient = (player_orient + angle_to_rotate) % (2.0*PI);

当前系统仅在player_orient未更新时才工作,即player_orient = (player_orient + angle_to_rotate) % (2.0*PI);被注解掉。同时,angle_to_rotate必须设置为angle_to_target - player_orient。否则,观察到90度偏移。可能地,在每个帧中,在显示玩家之前,系统假设玩家相对于x轴成90度,然后计算旋转的Angular 并旋转玩家。

dzjeubhm

dzjeubhm2#

你就快到了!主要的问题是你要计算位置向量和方向向量之间的Angular ,但是你应该计算方向向量和x轴之间的Angular :

use bevy::math::{Quat, Vec2, Vec3};

let pos = transform.translation.truncate(); // player position
let target = Vec2::new(event.position.x, event.position.y); // 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);

atan2函数用于获取方向向量与x轴之间的Angular ,这是旋转的正确Angular

相关问题