WIN32API FrameWork/한단계씩 직접 구현

65. 간단한 점프 물리 법칙

hyrule 2022. 6. 9. 19:30

http://hyrule.tistory.com/111 

 

*** 공부 방법 ***

1. 코딩을 해야 하는 부분은 첫 부분에 변수나 함수, 메소드에 대한 선언이 코드블럭으로 표시되어 있다. //ex) MakeFunction(); 2. 코드블럭 하단에는 해당 선언에 대한 구현 로직이 작성되어 있다. 처

hyrule.tistory.com

 


GameInfo.h

- GRAVITY = 9.8f 로 정의해놓자.

 

class CGameObject;
protected://물리 처리
	bool m_PhysicsSimulate;
	bool m_Ground;
	float m_GravityAccel;
	float m_FallTime;
	float m_FallStartY;
	bool m_Jump;
	float m_JumpVelocity;
public:
	void SetPhysicsSimulate(bool Physics);
	void SetGravityAccel(float Accel);
	void SetJumpVelocity(float JumpVelocity);
	void Jump();

 

{ bool m_PhysicsSimulate }

- 일단 물리 시뮬레이션을 할것인지 말것인지를 설정해주어야 한다. 물리 효과를 굳이 줄 필요가 없는 오브젝트도 많기 때문이다. 기본값 false

 

{ bool m_Ground }

- 현재 땅에 닿아 있는지 아닌지를 판별하기 위한 변수. 기본값 true

 

{ float m_GravityAccel }

- 중력 가속도.

 

{ float m_FallTime }

- 자유낙하를 시작했을 때 얼마나 떨어지고 있는지. 기본값 0.f

 

{ float m_FallStartY }

- 떨어지기 시작한 Y지점이 어디인지. 기본값 

 

{ bool m_Jump }

- 점프했는지 여부를 확인하기 위한 변수. 기본값 false

 

{ float m_JumpVelocity }

- 점프 속도. 기본값 0.f


< Update() >

- 낙하를 시작했을 때 게임오브젝트의 위치를 구하는 방법은 이렇다.

- 낙하 시작 지점을 기억해 두고, 중력 법칙에 따라 일정 시간이 지난 후의 이동 거리를 구한다.

- 이 거리를 낙하 시작 지점에서 빼주면 위치를 구할 수 있다.

	// 물리 시뮬레이션 적용을 할때 땅에 서있지 않으면
	if (!m_Ground && m_PhysicsSimulate)
	{
		// 떨어지는 시간을 누적시켜준다.(중력가속도)
		m_FallTime += DeltaTime * m_GravityAccel;

		//속도 변수를 생성하고
		float Velocity = 0.f;

		//점프 중이면 낙하시간에 점프속도만큼의 가속도를 추가한다.
		if (m_Jump)
			Velocity = m_JumpVelocity * m_FallTime;

		//최종적으로 위치를 구해준다.
		m_Pos.y = m_FallStartY - (Velocity - 0.5f * GRAVITY * m_FallTime * m_FallTime);
	}

 

이론 참고: http://www.cyberschool.co.kr/html/text/gtgh/gtphy/1/dgasok.htm

 

1-5. 등가속도운동 - 공통물리 - 사이버스쿨

건물의 높이 = 평균속도 x 걸린 시간.    평균속도는 29.4/2 = 14.7 ,  걸린 시간은 3 초이므로               건물 높이 = 14.7 x 3 = 44.1 m  그런데, 3층에서 떨어뜨리면 가속도가 9.8 m/s²이기 때

www.cyberschool.co.kr

 

m_FallTime += DeltaTime * m_GravityAccel;

- DeltaTime * 중력 가속도만큼 곱해서 떨어진 시간을 누적시켜 준다.

 

- if (m_Jump)
     Velocity = m_JumpVelocity * m_FallTime;

-> 만약 점프한 상태라면, 낙하 방향의 반대쪽으로 가속도를 가진다.

 

- m_Pos.y = m_FallStartY - (Velocity - 0.5f * GRAVITY * m_FallTime * m_FallTime);

낙하 시작 지점으로부터 일정 시간동안 낙하했을 때의 거리를 빼서 위치를 구한다. WIN32API에서의 y좌표계는 반대 방향이므로, 낙하를 사면 사실 좌표값이 더 커지는 것임을 감안해야 된다.

-- 점프 속도는 1차 방정식인 반면, 중력 낙하 거리는 2차 방정식이다. 처음에는 점프 속도가 중력 낙하 거리보다 커서 위쪽으로 이동하지만, 곧 역전되어 도로 떨어지게 된다.


GameFrameworkStepbyStep_65_JumpPhysics.zip
8.75MB