WinAPI 65 RigidBody (2)

CJB_ny·2022년 10월 10일
0

WinAPI

목록 보기
68/79
post-thumbnail

오늘 배운거 👍👍👍

  • 현실의 저항 구현?

  • 저항 구현하기 복잡하다 -> 최대 속력 제한


힘을 적용 시키지 않더라도 이전에 준 힘때문에

_velocity의 크기가 남아 있어서 해당 방향으로 계속 움직이는데

이 부분을 마찰로써 상쇄 시켜 주어야한다.

질량이 엄청 큰 물체가 있다고 가정을 하자.

만약 힘을 안 주고 있을 경우에만 마찰을 적용시킨다면은

엄청 작은 힘으로도 큰 질량을 가지는 물체가 움직일 것이다.

현실에서는 이상한 상황이다.

현실처럼 구현을 할려면은 '최대 정지 마찰력', '운동 마찰력'을 구분 해주어야 하는데...

그냥 이거 두개 하나의 마찰력으로 통일 하도록 하자.

대신 언제나 마찰력은 적용되도록 하자.

현실

현실에서는 공기저항 무슨 저항 등등 '저항'이 있기 때문에

내가 아무리 빨리 달린다 한들 그 이상 속도가 안 난다.

저항이 없다면은 내가 걸을 때마다 가속도가 붙어서 언젠가는 빛의 속도로 걸어야한다.

게임에서는 저항을 구현하기가 까다롭고 지금 구현할려면은 많이 복잡하기 때문에

'최대 속도를 제한' 하는 방법으로 구현을 하도록 하자.

구현

막 엄청 복잡하거나 어렵지는 않고

마찰력 때문에 크기가 음수가 나오는 예외 사항과 (뒤로가는 현상) 제로벡터가 나오도록 조금 예외 처리 해주면 될거같다.

AddForce ❗❗

현재 질량은 1.f, AddForce를 통해 주는 가속도는 200.f

F = M * A 이기 때문에

200 = 1 * 200이다.

그러면은

1초 뒤에 200의 속도에 도달하게 될 것이다.

x 축이 시간이라면은 시간에 따른 속도값은 200을 유지를 한다.

void RigidBody::finalUpdate()
{
	// 순수 힘의 크기
	float force = _force.Length();

	if (0.f != force)
	{
		// 방향
		_force.Normalize();

		// 가속도 : 순수 힘의 크기 / 질량
		float accel = force / _mass;

		// 힘의 방향이 곧 가속도의 방향이다.
		// (현재 방향벡터로 바뀐 _force * 가속도)
		// 가속도
		_accel = _force * accel; // == _accel = _force / _mass;

		 // 속도 (방향 + 속력) 한번 붙은 속도는 초기화 할 필요가 없다.
		_velocity += _accel * DeltaTime_F;
	}

	// =================
	// 마찰력 적용
	// =================
	
	// 마찰력에 의한 반대방향으로의 가속도
	if (!_velocity.IsZero())
	{
		Vector2 vel = _velocity;
		vel.Normalize();
		Vector2 friction = (-vel) * _frictCoeff * DeltaTime_F;

		if (_velocity.Length() <= friction.Length())
		{
			// 마찰 가속도가 본래 속도보다 더 큰 경우
			_velocity = Vector2(0.f, 0.f);
		}
		else
		{
			_velocity += friction;
		}
	}
	
	// 최대속도 제한
	if (_velocity.Length() > _maxVelocity)
	{
		_velocity.Normalize();
		_velocity *= _maxVelocity;
	}

	// 속도에 따른 이동
	Move();

	// 힘 초기화
	_force = Vector2(0.f, 0.f);
}

현재 이러한 흐름으로 가야한다.

문제점

키를 하나만 꾹 누르면 상관이 없는데 두개 누르면 바로

IsZero if의 else로 빠져서 움직인다.

=> 현재 마찰 계수가 200이라 움직이면은 안되는데..

중간정리 ❗❗

움직일 때 속력이 0 -> 부터 시작을 하기 때문에 처음에 느리다.

현재 마찰 계수가 100이기 때문에 주는 힘은 200이라 최대 속도 200까지 도달하는데 1초가 걸리는게 아니라 2초가 걸린다.

그래서 처음에 바로 원래의 최대 속도로 움직이고 싶다면은

초기에 이런식으로 속도를 하면 안되고

이런식으로 따로 빼주도록 하자.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글