답변:
벽의 법선 벡터를 알고 물체에 대해 들어오는 방향이 있다면 원하는 것은 평면을 가로 지르는 벡터 의 반사입니다 .
경우 n은 정규화 된 벡터이며, V는 는 IS 들어오는 방향, 다음, 당신이 원하는 것은 - (2 ( N · V ) N - V ). 빼기 부호는 반사 속도가 물체의 속도가 바뀌므로 실제로 방향을 바꾸지 않는다는 사실을 설명합니다.
이 대답은 각도가 아닌 벡터 수학으로 주어집니다. 각도를 사용해야 할 명백한 이유가없는 경우 일반적으로 선호되기 때문입니다. 각도에 대해 이야기해야하는 경우 반사 각도는 입사각과 같습니다. 각도가 법선에서 측정되면 나가는 각도는 들어오는 각도의 부정입니다. 각도가 벽에서 측정되면 들어오는 각도의 보완입니다.
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;
}
if it's a 2D game and your walls are guaranteed to be horizontal or vertical
이 정확하지 않습니다. 답변의 두 번째 부분은 올바른 구현을 해결합니다. IMHO는 부품의 순서를 반대로하여 일반적인 솔루션을 먼저 제시하고 강조해야하며 직각 솔루션은 예외적 인 경우를 단순화합니다.
이것은 벽 법선 벡터를 따라 벡터를 반영하는 것입니다.