[英]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.