繁体   English   中英

从两个 Vector2 点求角度

[英]Finding angle from two Vector2 points

我正在尝试从两个 Vector2 位置获取角度。

这些点是通过以下光线投射代码找到的:

RaycastHit2D hit = Physics2D.Raycast(groundedPos.transform.position, Vector3.down, 1, lmask); // lmask is only the blocks
Vector2 firstPos = hit.point;

RaycastHit2D hit2 = Physics2D.Raycast(groundedPos.transform.position + new Vector3(5f, 0, 0), Vector3.down, 1, lmask);
Vector2 secondPos = hit2.point;

我如何从这两个 Vector3 点获得角度?

之后我需要更改 object 的轮换。

编辑:

平地:

平坦的

不平坦:

不平坦

正如您在图像中看到的那样,红色光线投射是光线投射代码命中并显示它们的地方,带有圆形碰撞器的黑色正方形是玩家,而这两个块是我试图改变其旋转的东西。 如您所见,在平坦的地方很好。 但是不平坦,它搞砸了。

得到两个位置后,找出从起点到第二点的角度,然后应用欧拉旋转,绕 z 轴旋转。

transform.rotation = Quaternion.Euler ( 0, 0, Vector2.SignedAngle ( Vector2.right, secondaPos - firstPos ) );

注意 - 如果您尝试旋转 GameObject 的子项,您可能会“双重”旋转 object,这就是您更新帖子时使用的图像中的样子。 如果碰撞器附加到子 object,您是否也需要旋转该 object?

首先,您的代码的一个普遍问题是maxDistance 您将1作为两个射线投射的最大距离传递,但您的图像显示如果它不平坦,它可能不会撞到地面

=> 其中一个位置可能是“无效的”,因为光线投射没有到达地面,因此该值只是一个默认值(0, 0) ,这会扰乱旋转。

你要么想把它包装好然后做,例如

var hit = Physics2D.Raycast(groundedPos.transform.position, Vector2.down, 1, lmask);
var hit2 = Physics2D.Raycast(groundedPos.transform.position + new Vector3(5f, 0, 0), Vector2.down, 1, lmask);

if(hit.collider && hit2.collider)
{
    var firstPos = hit.point;
    var secondPos = hit2.point;
    
    ...
}

或者更确切地说,使用float.PositiveInfinity作为光线的最大距离,因此它们总是会击中某些东西。

var hit = Physics2D.Raycast(groundedPos.transform.position, Vector2.down, float.PositiveInfinity, lmask);
var hit2 = Physics2D.Raycast(groundedPos.transform.position + new Vector3(5f, 0, 0), Vector2.down, float.PositiveInfinity, lmask);

var firstPos = hit.point;
var secondPos = hit2.point;
...

然后替代这个你也可以使用

var direction = secondPos - firstPos;
transform.rotation = Quaternion.Euler(0, 0, Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg);

这可能会稍微更有效率。

或者简单地设置

transform.right = direction;

或者如果这是关于Rigidbody2D你宁愿 go 通过

rigidbody2D.MoveRotation(Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM