Nice programing

바운스 각도를 계산하는 방법?

nicepro 2020. 11. 25. 21:11
반응형

바운스 각도를 계산하는 방법?


나는 잠시 그것을 가지고 놀았지만 단순히 그것을 알아낼 수 없습니다.

미사일을 발사하는 탱크를 만들었는데 미사일이 벽에 부딪히면 튕겨 나가고 싶지만 직각으로 튕겨 나가길 원합니다.

지금은 장애물이 없습니다. 미사일이 viewportRectangle내가 만든 거리를 벗어나면 튕겨 나옵니다 .

내가 찾고있는 솔루션이 상당히 발전된 것입니까?

상대적으로 간단한 방법이 있습니까?


이를 수행하는 더 쉬운 방법은 각도를 계산하는 대신 미사일의 속도를 사용하는 것입니다. 당신이이 미사일을 가지고 말 xVelocityyVelocity수평 및 수직의 움직임을 표현하기 위해. 이러한 속도는 양수 또는 음수로 왼쪽, 오른쪽, 위 또는 아래를 나타낼 수 있습니다.

  • 미사일이 상단 또는 하단 경계선에 부딪히면 yVelocity.
  • 미사일이 왼쪽 또는 오른쪽 경계를 치면 xVelocity.

이렇게하면 반대 축의 움직임이 동일하게 유지됩니다.

ChrisF의 답변 에서 이미지를 빌려 미사일이 I 위치에서 시작한다고 가정 해 보겠습니다.

반사 각도

으로 xVelocity하고 yVelocity두 개의 긍정적 인 방향으로 이동 될 미사일 표시 (2D 그래픽 바로 아래는 통상적 양성). 값을 할당 해 보겠습니다.

xVelocity = 3
yVelocity = 4

미사일이 위치에서 벽에 닿으면 C를 , 그것은 xVelocity변경하지 마십시오,하지만이 yVelocity-4 그래서 다시 위쪽 방향으로 이동하지만, 유지하는 오른쪽으로가는 반전해야한다.

이 방법의 장점은 단지 미사일의 추적 유지할 필요가있다 xPosition, yPosition, xVelocity,와 yVelocity. 이 네 가지 구성 요소와 게임의 업데이트 속도 만 사용하면 미사일이 항상 올바른 위치에 다시 그려집니다. 직각이 아니거나 움직이고있는 더 복잡한 장애물에 들어가면 각도보다 X 및 Y 속도로 작업하는 것이 훨씬 쉽습니다.


벽이 좌표축과 정렬되어 있기 때문에 특수한 경우 코드를 작성하는 것이 합리적이라고 생각할 수 있습니다 (수직 벽의 경우 속도의 x 좌표를 부정하고 수평 벽의 경우 속도의 y 좌표를 부정합니다) ). 그러나 게임이 수직 및 수평 벽에서 잘 작동하게되면 다음으로 생각할 것입니다. "임의의 각도에서 벽은 어떻습니까?" 따라서 처음부터 일반적인 경우에 대해 생각할 가치가 있습니다.

일반적인 경우, 미사일이 속도 v를 갖고 표면 법선 n으로 벽에 부딪친다고 가정합니다 .

벡터 v가있는 미사일이 표면 법선 n으로 벽에 비스듬히 충돌하려고합니다.

스플릿 (V) 성분으로는 U는 벽에 수직 그것에 평행.

v에 빗변이있는 직각 삼각형, 벽에 평행 한 짧은면 u, 벽에 평행 한 긴면 w.

어디:

u = ( v  ·  n / n  ·  n ) n
w = vu

여기서, V는  ·  N은 은 IS 내적 벡터의는 VN . 계산 방법에 대한 설명은 링크를 참조하십시오. 내적 n  ·  n 은 법선 벡터 길이의 제곱으로 평가됩니다. 항상 단위 벡터 의 형태로 법선을 유지 한다면 n  ·  n = 1이고 나누기를 생략 할 수 있습니다.

바운싱 후 벽에 평행 한 운동 성분은 마찰 f의 영향을 받고 벽에 수직 인 성분은 탄성의 영향을받으며 이는 복원 계수 r 의 형태로 주어질 수 있습니다 .

따라서 충돌 후 속도는 v ′ = f wr u 입니다.  완전히 탄력적이고 마찰이없는 충돌에서 v ′ = wu ; 즉, 모션은 Bill의 답변에 제공된 다이어그램에서와 같이 충돌 지점의 법선에 대해 반영됩니다.

이 접근 방식은 3 차원에서도 동일하게 작동합니다.

(분명히 이것은 바운싱에 대한 매우 단순화 된 개념입니다. 각 운동량이나 변형을 고려하지 않습니다. 그러나 많은 종류의 비디오 게임에서 이러한 종류의 단순화는 완벽하게 적절합니다.)


완벽한 입자 (& 빛)의 경우 반사 각도는이 다이어그램 (commons.wikimedia.org)에서 설명하는 것처럼 입사각과 같습니다.

반사 각도

Google에서 "반사각"(따옴표 제외)을 검색합니다.

물체의 탄성과 재질과 장애물을 고려하면 조금 더 복잡합니다.)


이 문제가 있었는데, 내가 찾은 유일한 방법은 충돌 축을 분리하는 것뿐이었습니다!

시도 해봐:

x += velocity * Math.cos(angle * Math.PI /180);
y += velocity * Math.sin(angle * Math.PI /180);

if (x < 0 || x > canvas.width) {
     angle = 180 - angle;   
}
else if (y < 0 ||y > canvas.height) {
     angle = 360 - angle; 
}

도움이 되었기를 바랍니다.


As an aside to the specific physics question you are asking, I would recommend the book "Beginning Math and Physics for Game Programmers" by Wendy Stahler. I found it quite useful for my game/physics programming projects.

The code that accompanies the book is C++ but if you know C#, it would be pretty easy to make the conversion.

Have a good one!


Not complicated at all - pseudo-code:

angleObjectHitWall = a;
bounceAngle = 180-a;

Of course this is a very simple calculation, and is totally irrelevant once you start to take into account factors such as material, gravity, walls which aren't straight, etc...


180-a will not work in all instances, unless you are merely working a bounce on a top surface when X is increasing.

One direction to head is the XNA forums or pick up XNA sample code. It is C# and it is for building games. I am not stating you want to build your games in XNA, but it is a great tool, and it is free.


This is really a physics question, so if you are not a physicist (and since you are asking this question, I'm going to take it that you are not) it will require a lot of reading and brainstorming to get it right.

I suggest reading this wikipedia entry to get the basic idea about the depth of your question.

If you only want to make it "look plausible" then I wouldn't worry about it too much and use Bill the Lizard's answer, however if you want to make it right you will have quite an adventure. Don't let this scare you tho! Good luck!


if(!Collide(Missle, Mainchar)){
(Velocity.x)*-1;
(Velocity.y)*-1;
}

작동하고 간단하고 행운입니다.

참고 URL : https://stackoverflow.com/questions/573084/how-to-calculate-bounce-angle

반응형