일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 단어가 품은 세계
- 아무도 없는 숲속에서
- 부에노비스타 소셜클럽
- 타자연습게임
- 시집
- 운석 피하기 게임
- 운석피하기 게임
- 인생의 해상도
- 트렌드코리아2025
- 게임개발
- 나는 매트로폴리탄 미술관 경비원입니다.
- 타이핑좀비
- 고양이발 살인사건
- Ai
- 어른의 행복은 조용하다
- openAI
- comfyui
- 쿠바전통음악
- 나는 스물일곱 2등 항해사입니다.
- Stable diffusion
- Python
- 에르난 디아스
- 타이핑 몬스터
- pygame
- frozen lake
- Gym
- 황선엽
- 숨결이 바람이 될 때
- gymnasium
- 매트로폴리탄
- Today
- Total
스푸79 기록 보관소
운석 피하기 게임 개발(9)- 충돌 처리(1) 본문
충돌 처리는 모든 게임 개발에 가장 중요한 부분이다.
게임을 하면서 플레이어가 몰입을 하게 되는 이유는
바로 게임이라는 가상의 공간에서 펼쳐지는 일들이
실제로 벌어지는 일처럼 느껴지기 때문이다.
소위 말하는 가상에서 벌어지는 일이
실제처럼 느껴져야 한다는 것이다.
그렇게 플레이어가 느끼는 이유는 바로
물체와 물체가 충돌하는 시점에 발생하는 물리적인 현상이
실제 세계와 비슷한게 구현 되었기 때문이다.
지금 개발하고 있는 운석 피하기 게임을 보면
운석과 운석, 운석과 플레이어가 서로 충돌하는 부분이 구현이 안 되어 있다.
어떻게 하면 자연스럽게 충돌하는 현상을 구현할 수가 있을까?
골치 아픈 얘기지만 여기서 물리 아닌 수학이 필요하다.
학교 다닐때 대체 수학을 어디서 써먹냐고 짜증을 냈는데
내가 제일 좋아하는 게임개발에 꼭 필요한 부분일 줄이야.
위의 두가지 예제를 만들어 봤다. 물체의 질량에 따라서 서로 부딪쳤을때 움직임을 구현해 보았다.
서로 부딪쳤을 때 서로의 무게와 속도에 의해 운동량이 변하는 걸 탄성충돌이라고 한다.
위키디피아를 보면 이 탄성충돌에 대한 수학 공식이 잘 나와있다.
https://ko.wikipedia.org/wiki/%ED%83%84%EC%84%B1_%EC%B6%A9%EB%8F%8C
탄성 충돌 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 열교란 상태의 원자는 흑체 복사가 계에서 방출되지 않는 동안 기본적으로 탄성 충돌을 한다. 대체로 두 원자가 되튈 때는 충돌 전과 같은 운동 에너지를 가진
ko.wikipedia.org
위대하신 ChatGPT님에게 코드 작성을 요청했는데 아쉽게도
위의 공식에서 x축, y축 움직임이 아닌 x축에 대한 처리만 되어 있어서 일부 코드를 수정해서 위의 예제를 만들었다.
아래 코드를 보자.
예제는 두 원으로 처리를 했고 충돌 시점은 두 원의 거리가 반지름보다 작은 시점으로 잡았다.
# 충돌 처리 함수
def handle_collision(x1, y1, vx1, vy1, x2, y2, vx2, vy2):
# 두 원 사이의 거리 계산
dx = x2 - x1
dy = y2 - y1
distance = math.sqrt(dx**2 + dy**2)
if distance < 2 * radius: # 충돌 여부 확인
# 단위 벡터 계산
nx = dx / distance
ny = dy / distance
# 상대 속도 계산
tx = -ny
ty = nx
# 속도 벡터의 성분
v1n = nx * vx1 + ny * vy1
v1t = tx * vx1 + ty * vy1
v2n = nx * vx2 + ny * vy2
v2t = tx * vx2 + ty * vy2
# 충돌 후의 속도 성분 (탄성 충돌 공식을 사용)
v1n_prime = (v1n * (mass1 - mass2) + 2 * mass2 * v2n) / (mass1 + mass2)
v2n_prime = (v2n * (mass2 - mass1) + 2 * mass1 * v1n) / (mass1 + mass2)
# 새로운 속도 벡터 계산
vx1 = v1n_prime * nx + v1t * tx
vy1 = v1n_prime * ny + v1t * ty
vx2 = v2n_prime * nx + v2t * tx
vy2 = v2n_prime * ny + v2t * ty
return vx1, vy1, vx2, vy2
아래 코드를 보면 mass1는 빨간 원의 무게, mass2는 파란 원의 무게이다.
# 원의 속성
radius = 20
mass1 = 10
mass2 = 1
# 원의 초기 위치 및 속도
x1, y1 = 100, 280
x2, y2 = 700, 290
vx1, vy1 = 2, 0
vx2, vy2 = -2, 0
원의 반지름은 충돌 간격을 조정하지만 실제로 충돌에 의한 속도 변화는 무게 수치에 따라 영향을 받는다.
위의 예제에 대한 소스코드를 첨부한다.
'게임공작소' 카테고리의 다른 글
운석 피하기 게임 개발(11)- 충돌처리(3)(Sweep And Prune알고리즘) (29) | 2024.09.18 |
---|---|
운석 피하기 게임 개발(10)- 충돌 처리(2) (11) | 2024.09.08 |
운석 피하기 게임 개발(8)- 운석 처리(3) (0) | 2024.08.31 |
운석 피하기 게임 개발(7)- 운석 처리(2) (0) | 2024.08.28 |
운석 피하기 게임 개발(6)- 운석 처리(1) (1) | 2024.08.26 |