코드 설명:
- 첫 번째 장면에서는 수평면을 향하여 공을 자유낙하시키고, 공이 수평면에 닿았을 때 튕겨져나오는 것을 보여준다.
- 물리I 활용 - 충돌 시 처음 속력의 절반으로 줄어드므로, 운동 에너지는 1/4로 줄어 역학적 에너지 보존 법칙에 의해 공의 최고점 높이가 1/4로 게속 줄어드는 모습을 print되는 숫자들 중 첫 숫자에서 관찰할 수 있다.
- 물리I 활용 - 또한 print되는 숫자들 중 두번째 숫자는 최고점에 도달한 시각을 의미하고, 최고점에서 튕겨난 후 최고점에 도달하는 시간차를 관찰하면 등가속도 운동 공식에 따라 시간차가 약 1/2로 계속 줄어드는 모습을 관찰할 수 있다.
- 두 번째 장면에서는 빗면을 향하여 공을 자유낙하시키고, 공이 빗면에 닿았을 때 튕겨져나오다가 굴러가는 것을 보여준다. 시간차가 1/2로 줄어드는 모습이 관찰된다. <- 검증 필요
- 물리II 활용 - 힘, 속도, 위치를 벡터로 나타내고, 충돌 시 공이 받는 충격을 벡터의 회전과 벡터의 성분을 이용하여 구하였다.
- 물리II 활용 - 물리II의 포물선 운동의 원리를 이용하여 충돌 후 포물선으로 운동하는 공의 모습을 구현하였다.
- 세 번째 장면에서는 두 빗면을 향하여 공을 자유낙하시키고, 공이 빗면에 닿았을 때 튕겨져나오고, 굴러가고, 두 빗면이 만나는 지점에서 공이 정지하는 것을 보여준다.
- 물리II 활용 - 힘의 합성을 이용하여 두 빗면에서 받는 수직항력을 동시에 적용한다.
찾아본 부분:
- PyGame 기본 세팅
- PyGame으로 도형 그리기
- PyGame으로 장면 전환 구현 (제미나이 이용)
- tan값으로 sin과 cos을 가장 효율적으로 구하는 방법 (cot 이용 X)
- 행렬 연산을 위해 numpy 이용
- Box, Ground객체 기본 설정 (배드가이 이용)
제미나이 프롬프트 "나는 PyGame을 어제 시작했는데, PyGame으로 한 장면에서 a == 1일때 다른 장면으로 전환하는 코드를 만들어줄수 있어?"
문제와 해결 과정:
- 물체가 가끔 빗면에 충돌 후 즉시 정지하거나 빗면을 통과한다, 빗면에 물체가 굴러갈 때, 마치 빗면 위에 물체가 떠있는 듯 보였다.
- PyGame의 원 그리기에서 물체의 중심을 설정하는 방식이 잘못되어 시각화된 상황과 코드에서 작동하는 상황이 달랐던 문제를 해결하였다. 이를 통해 남에게서 가져온 코드를 제대로 이해하지 못하였을 때 발생하는 문제점을 체감하였다.
- 위를 적용하여도 현상이 남아 있자, 충돌 감지 방식을 공이 바닥을 통과하지 못하도록 수정하고, 바닥 충돌 판정이 여러 번 발생하는 것을 막기 위해 충돌 즉시 공의 위치를 바닥 위로 보정하였다. 하지만 그 결과 정확성과 일반성을 약간 희생하게 되었고, 추가적인 문제도 생기게 되어, 추후 이 문제를 해결할 더 근원적인 방법을 찾아보아야겠다.
- 빗면에 물체가 충돌하였을 때 의도하지 않은 방향으로 물체가 튕겨나갔다.
- PyGame에서의 y축의 방향이 일반적인 y축의 방향과 다름이 문제를 일으킬 수 있음을 파악하고, y축의 방향을 돌린 후 연산, 복원하여 문제를 해결하였다. 대략적인 느낌이 비슷하다고 '동일하게 작동하겠지?'라고 어림짐작하면 문제가 발생할 수도 있음을 느꼈다.
- 삼각함수 간의 변환이 정상적으로 작동하지 않는다.
- 이 문제는 변수값을 print하여 확인하는 디버깅 방식을 사용하여 오류를 검출하였다. (체스 프로젝트에서 사용했던 방식) 삼각함수 간의 변환 방법을 검색하여 나의 코드와 비교하고, 내가 실수한 부분과 고려하지 않은 부분을 수정하였다.
- 이것과 물리엔진 구현 이외의 자잘한 구현을 다른 사람과 도구의 도움을 받아 완성하는 것에서, 다른 정보를 이용하는 것의 효율성을 느꼈다.
남아있는 문제점:
- 시간차와 최고점 높이가 물리학적 계산 결과와 약간 불일치한다 - 시간 단위를 무한정 쪼갤 수 없기 때문에, 물체가 땅에 박히지 않도록 보정하기 때문에 발생하는 것으로 추정된다.
- 위치 보정을 적용한 이후 바닥에 있는 공이 스스로 위아래로 진동하기 시작했다
소감
- 체스 프로그램 개발 활동으로 얻은 역량을 활용할 수 있는 기회가 되었음.
- 체스 프로그램 개발 전 협업을 위해 학습한 Github 사용법이 코드 관리에 도움이 되었음을 느낌.
- 코딩과 교과를 연결하는 과정이 흥미로웠고, 프로그래밍 활동이 교과 복습에도 도움이 되었음.
- 이후 추가적인 코딩 활동을 이어나가면서도, 이 프로젝트를 나의 물II 추가학습에도 이용해볼 생각이 있음.
향후 구현하고 싶은 것
- 세로로 수직인 벽 (Ground의 정의에 기울기가 포함되어 있어, 완전히 수직인 벽을 구현할 수 없다.)
- 공끼리의 충돌
프로그램화시 이점
- 실제로 동역학 시뮬레이션이 필요한 경우 (ex. 골드버그 장치 시뮬레이션)
- 게임의 물리적 상황에서의 사용 (ex. 플랫포머형 게임)