사실 힘을 직접 적용한다기 보다는...
position을 직접 식에 따라 주는 형식이라 조금 다르다고 볼 수 있긴 하다.
랜덤이란 무작위라는 뜻이지만
실제로 컴퓨터에서는 정확한 난수라는 것은 만들지 못하는 것으로 알려져있다.
양자컴퓨터에 한해서 난수를 만드는 데에 성공한 사례가 있지만
현재 상용화되어 있지 않기에 우리는 정확한 난수를 만들지 못한다.
그래서 우리는 유사 난수를 생성한다.
시드 값을 바탕으로 유사난수를 생성하는 것이다.
우리는 무작위하면 생각나는 것이 로또 번호다.
하지만 게임에서는 랜덤한 힘의 적용이다.
예를 들어 화산 폭발과 같은 경우 뭐가 어디에 떨어질까?
피하는 게임이라고 한다면 규칙을 간파했을 때 그 게임의 재미가 떨어진다.
그래서 우리는 게임에서의 랜덤을 집어넣어 사용자에게 몰입감과 재미를 줄 수 있다.
난이도 조절부터 자연스럽게 보이는 애니메이션까지 모든 것에 랜덤한 요소가 들어있다.
실제로 난수를 얻을 때 우리는
RAND 함수를 무척 많이 쓴다.
시드 값으로는 보통 현재 시간을 받아서 쓰며
따로 우리가 난수를 직접 만들 필요 없이 그냥 쓰곤 한다.
그래서 우리가 화산폭발에 대해 랜덤으로 이전에 배운 포물선 운동을 적용해본다면
-a1 < x < a1
b1 < y < b2
위와 같이 랜덤하게 범위에 대한 난수를 생성하고자 한다.
즉, 등속운동에 대하여 랜덤 속력을 적용하고
포물선운동에 대하여 초기 속력을 적용한다
초기속력,y 가 높을수록 위로 많이 올라갈 것이며
초기속력,x 가 높을수록 좌,우로 많이 날라갈 것이다.
쉽게 짜자면
아래와 같이 속력을 랜덤으로 적용하여
obj.Vx = rand() * a / (float)RAND_MAX - Width/2;
obj.Vy = rand() * a / (float)RAND_MAX ;
이전에 배웠던 포물선공식에 넣으면 될 것이다.
[Game Developer, 게임개발자/게임 수학,물리] - 게임 물리 - 2가지 이상의 힘이 작용할 때
하지만 자연스럽게 넣은 랜덤 요소조차
부자연스럽게 느껴질텐데..?
그것은 현실에서는 정규분포를 이루기 때문이다.
실제로 화산 폭발할 때 평균적으로 나오는 속력이 있다는 말이다.
즉, 모든 속력이 나올 확률이 같다는 전제가 틀렸다.
평균 속력이 있으며 그 주변의 값이 제일 많이 나온다는 말이다.
그니까 로또에서의 랜덤과 이러한 운동에서의 랜덤을 같이 보면 안된다는 말이다.
즉, 실제 현실처럼 운동을 표현하기 위해서는 모든 사건이 일어날 확률이 같은 난수를 생성하는 것이 아니라
정규분포에 따른 확률을 적용해야한다는 말이다.
**물론 각 경우마다 다르다.
그럼 운동에서 내가 정규분포 식을 어떻게 알아서 계산을 해?
사실 우리는 배웠다 정규분포 식을 구하기 위해서는 2개만 필요하다.
표준 편차와 평균만 정하면 된다.
하지만 위에서 보다시피 그마저도 식이 어렵다.
우리는 공학자다.
앞서 해놓은 것들을 이용하는 사람이다.
선조들이 박스 뮬러 변환을 만들어냈다.
감사하다.
Box-Muller transformation
위의 식의 뜻은
평균이 0이고 표준편차가 1인 정규분포를 따르는 0과 1사이에서 얻을 수 있다는 말이다.
다시 정리하면
우리가 모든 확률이 일어날 확률이 같은 일양난수를 정규분포를 따르는 난수로 바꿀 수 있다는 말이다.
** 우리가 가지고 있는 rand 함수가 일양난수를 생성하는 것이다.
즉, 위에선 U1, U2 (0과 1 사이의 난수) 로 정규분포를 따르는 X1,X2를 구할 수 있다.
다시 말해서 rand로 2가지 난수를 만들어서
정규분포를 따르는 난수를 만들 수 있다는 말이다.
우리는 rand()로
일양난수와 정규분포를 따르는 난수 둘 다 만들 수 있다.
끝
'Game Development, 게임개발 > 게임 수학,물리' 카테고리의 다른 글
게임 물리 - 운동방정식의 해석, 미분방정식 (0) | 2021.08.21 |
---|---|
게임 물리 - 원운동 (0) | 2021.08.20 |
게임 물리 - 2가지 이상의 힘이 작용할 때 (0) | 2021.08.19 |
게임 물리 - 라디안의 이용 (0) | 2021.08.19 |
게임 물리 - 등속 직선 운동 (0) | 2021.08.19 |