gpt4 book ai didi

c# - 如何逐渐旋转一个物体以面对另一个转动最短距离

转载 作者:可可西里 更新时间:2023-11-01 08:09:48 25 4
gpt4 key购买 nike

我目前正在尝试旋转 Sprite ,具体取决于它与直接面向目标的角度(或弧度,我更喜欢度数)不同,问题是当目标到达某个位置时, Sprite 决定旋转一个完整的 360 到其他方式而不是做 10 额外的。这张图片可能更好地解释了问题:

Blue square = target, Red square = the object, green line = rotation it wants, black line = current rotation, brown arrow = how it rotates to achieve this, red arrow = how I want it to rotate.

蓝色方 block = 目标

红色方 block = 对象

绿线=它想要的旋转

黑线=当前旋转

棕色箭头 = 它如何旋转以实现此目的

红色箭头 = 我希望它如何旋转。

请注意,情况 1 始终有效,具体取决于它的旋转方式,但情况 2 它始终执行该旋转,无论它是在当前旋转的“右侧”还是“左侧”。

这是我用来旋转对象的代码。

    Vector2 distance = new Vector2(target.worldPos.X - this.worldPos.X, target.worldPos.Y - this.worldPos.Y);
float wantRot = (float)Math.Atan2(distance.Y, distance.X);
if (this.rotation < wantRot)
this.rotation += MathHelper.ToRadians(45) * Time.deltaTime;
if (this.rotation > wantRot)
this.rotation -= MathHelper.ToRadians(45) * Time.deltaTime;

我想要实现的是让它根据红色箭头而不是棕色箭头旋转(在情况 2 中)。

注意:我不是编程方面的专家,我只是在过去的一年里偶尔做过(主要是简单的 2D 射击/射击类游戏),所以深入的解释将不胜感激.我也是一名学习编程的学生。

PS:对于标题的建议也将不胜感激,因为我完全不知道该放什么。

最佳答案

您的问题是目标可能处于 5 角,而物体可能面向 355 度(例如)。根据你的测试,5小于355,所以逆时针走。

你应该做的是测试目标是在你左边 180 度以内,还是在你右边 180 度以内,然后相应地移动。

棘手的部分是让支票在 360 <-> 0 周围“环绕”。看起来你的情况下还剩下 0 度,所以很难测试 wantRot 位于 0 度范围内的一侧

如下图所示绘制一个圆圈,然后将您的对象放在我们面对的左侧。您会看到您必须分别检查 2 个阴影区域。

Visualisation

方法一

分别检查所有情况。

注意:下面的代码是我的想法,未经测试。您需要将度数更改为弧度。

int MoveDir = 0;
var BehindMe = this.rotation - 180;
if (BehindMe < 0)
BehindMe += 360;

if (wantRot != this.rotation)
{
if (wantRot == BehindMe)
MoveDir = 1; // or randomly choose
else if ((wantRot > BehindMe && wantRot < this.rotation) ||
(this.rotation < 180 && (wantRot > BehindMe ||
wantRot < this.rotation)))
MoveDir = -1;
else if ((wantRot < BehindMe && wantRot > this.rotation) ||
(this.rotation > 180 && (wantRot < BehindMe ||
wantRot > this.rotation))
MoveDir= 1;

this.rotation += MoveDir * MathHelper.ToRadians(45) * Time.deltaTime;
}

方法二

从图像中,您可能会意识到您可以只检查右侧的对象,如果不是,则假设它在左侧(因为只要当前角度小于 180 度,检查它在对很容易)。如果当前角度大于 180 度,则反转概念 - 检查它是否在左侧,如果不在则假设在右侧。如下所示:

int MoveDir = 0;
var BehindMe = this.rotation - 180;
if (BehindMe < 0)
BehindMe += 360;

if (wantRot != this.rotation)
{
if (this.rotation <= 180)
{
if (wantRot > this.rotation && wanrRot < BehindMe)
MoveDir = 1;
else
MoveDir = -1;
}
else
{
if (wantRot < this.rotation && wanrRot > BehindMe)
MoveDir = -1;
else
MoveDir = 1;
}

this.rotation += MoveDir * MathHelper.ToRadians(45) * Time.deltaTime;
}

关于c# - 如何逐渐旋转一个物体以面对另一个转动最短距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7846775/

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