gpt4 book ai didi

rust - 二维旋转

转载 作者:行者123 更新时间:2023-12-03 11:36:34 24 4
gpt4 key购买 nike

我正在尝试使用 Bevy 0.3,并且可以通过 Camera2dComponents::default() 轻松使用内置转换。 .
这是自上而下的 2d。
问题是试图将玩家的旋转同步到鼠标:

for event in evreader.iter(&cursor_moved_events) {
println!("{:?}", transform);
transform.look_at(Vec3::new(event.position.x(), event.position.y(), 0.0), Vec3::new(0.0, 0.0, 1.0));
println!("{:?}", transform);
}
当然,在这个变换中是我的播放器的变换。
这是输出的内容:
Transform { translation: Vec3(0.0, 0.0, 0.0), rotation: Quat(0.0, 0.0, 0.0, 1.0), scale: Vec3(1.0, 1.0, 1.0) }
Transform { translation: Vec3(0.0, 0.0, 0.0), rotation: Quat(0.5012898, -0.49870682, -0.49870682, 0.5012898), scale: Vec3(1.0, 1.0, 1.0) }
我对什么有点困惑 up在 2d 中的 look_at 中,但我尝试了一些不同的值,结果总是相同的:只要 look_at 运行,播放器就会从 View 中消失。
为什么在此之后相机不再看到播放器,我在此 look_at 中做错了什么?
谢谢

最佳答案

当您使用时 Camera2dComponents 用于 2D, Transform 不是。 Transform更通用,并且还包括 3D 所需的内容。
在你的情况下,它听起来像 look_at() 可能不会做你认为它会做的事情。它创建了一个 3D look at matrix它计算了一个 View 矩阵,它是“at ”一个位置( self.translation )并看向 target (第一个参数)。 up然后是“world up”是什么的 3D 矢量。以便它可以计算旋转校正。

更新解决方案:
如果要旋转自上而下的 2D 播放器,即让播放器的一侧看向光标。然后你需要计算你的玩家位置和目标之间的角度。您可以使用 Vec2::angle_between() 轻松做到这一点.

let pos: Vec2 = ...;
let target: Vec2 = ...;

let angle = (target - pos).angle_between(pos);
transform.rotation = Quat::from_rotation_z(angle);
根据玩家本身的方向,即如果您使用的是 Sprite ,默认方向可能是“看”向左或向上。那么你可能需要抵消 angle .你可以这样做,例如添加 + FRAC_PI_2 (或者无论需要多少。)
假设 transform.translation是玩家的中心位置,那么它看起来像这样:
use bevy::math::{Quat, Vec2};

let pos = transform.translation.truncate();
let target = event.position;

let angle = (target - pos).angle_between(pos);
transform.rotation = Quat::from_rotation_z(angle);

旧答案:
因为您想在自上而下的 2D View 中将相机放置在光标上方。那么你必须使用 from_translation() 或者干脆转移 self.translation ,这是您的相机的位置。
transform.translation = Vec3::new(event.position.x(), event.position.y(), 0.0);
如果您希望光标位置在屏幕的中心,那么您可能需要减去一半的屏幕尺寸。

关于rust - 二维旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65370874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com