벽 충돌 결과 각도 결정


14

그래서 고정 수평 또는 수직 벽 방향으로 움직이는 물체가 있습니다. 물체가 튀어 나오는 각도를 어떻게 계산합니까? 물체는 임의의 각도로 벽에 접근 할 수 있습니다.

답변:


18

벽의 법선 벡터를 알고 물체에 대해 들어오는 방향이 있다면 원하는 것은 평면을 가로 지르는 벡터반사입니다 .

경우 n은 정규화 된 벡터이며, V는 는 IS 들어오는 방향, 다음, 당신이 원하는 것은 - (2 ( N · V ) N - V ). 빼기 부호는 반사 속도가 물체의 속도가 바뀌므로 실제로 방향을 바꾸지 않는다는 사실을 설명합니다.

이 대답은 각도가 아닌 벡터 수학으로 주어집니다. 각도를 사용해야 할 명백한 이유가없는 경우 일반적으로 선호되기 때문입니다. 각도에 대해 이야기해야하는 경우 반사 각도는 입사각과 같습니다. 각도가 법선에서 측정되면 나가는 각도는 들어오는 각도의 부정입니다. 각도가 벽에서 측정되면 들어오는 각도의 보완입니다.


좋은 설명입니다. 그것은 나를 위해 잘 작동했습니다! 감사!
DRiFTy 2019

13

2D 게임인지 3D 게임인지 지정하지 않았습니다. 그러나 2D 게임이고 벽이 수평 또는 수직으로 보장되고 물체를 튕겨 내려면 반사를 처리하는 것보다 훨씬 쉬운 방법이 있습니다.

수직 벽에 부딪 칠 때 물체 속도의 X 성분을 무시하고 수평 벽에 부딪 칠 때 물체 속도의 Y 성분을 무시하십시오. 예:

if( /* hit vertical wall */ )
{
    object.velocity.x *= -1;
}
if( /* hit horizontal wall */ )
{
    object.velocity.y *= -1;
}

그러나 각도를 아는 것이 정말로 중요하다면 일반적으로 반사 각도는 입사각과 같습니다. 이 각도는 벽의 법선과 관련하여 측정됩니다. 다음은 명확하게 설명하는 그림입니다.

여기에 이미지 설명을 입력하십시오

임의의 벽에 대해 이것을 처리해야하는 경우 벡터를 반영하는 방법을 조사해야합니다. 벽의 법선과 입사 벡터를 취하고 반사 된 벡터를 반환하는 작은 공식입니다. XNA가 사용하는 공식은 다음과 같습니다.

public static Vector3 Reflect(Vector3 vector, Vector3 normal)
{
    return vector - 2 * Vector3.Dot(vector, normal) * normal;
}

그리고 2D의 경우 다음을 수행 할 수 있습니다.

public static Vector2 Reflect(Vector2 vector, Vector2 normal)
{
    return vector - 2 * Vector2.Dot(vector, normal) * normal;
}

죄송합니다. 2D 게임입니다. 벽을 사용할 수 있기를 원한다고 말했기 때문에 각도를 기준으로 유지하고 싶습니다. 감사!
DRiFTy

2D도 포함하도록 편집했습니다. 실제로, 그것은 단지 2D 벡터, 동일한 연산 및 공식과 동일합니다
Gustavo Maciel

2D 게임의 벽이 기울어 져있을 수 있으므로 설명 if it's a 2D game and your walls are guaranteed to be horizontal or vertical이 정확하지 않습니다. 답변의 두 번째 부분은 올바른 구현을 해결합니다. IMHO는 부품의 순서를 반대로하여 일반적인 솔루션을 먼저 제시하고 강조해야하며 직각 솔루션은 예외적 인 경우를 단순화합니다.
XenoRo

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.