https://youtu.be/MNp3w8MRKcE
제목 : 물 끓는 시간 예측 시뮬레이션
진행 기간 : 2020-10~11
참여인원 : 1명
역할 : 개발
기여도 : 100%
교과명 : 컴퓨터그래픽스(2)
활동 요약 : 컴퓨터그래픽스(1)과 (2)를 통해 배운 그래픽스 개념과 화학 개념 (열역학, 열용량)을 융합하여 물 끓는 시간을 예측하는 시뮬레이션을 유니티를 통해 개발하였다.
지식 응용 |
분석 실험 |
문제 해결 |
도구 활용 |
설계 능력 |
팀웍 기술 |
의사 전달 |
영향 분석 |
공학 윤리 |
자기 계발 |
O | O | O | O | O |
우리 학과는 1학기에 한 번씩 학부 경진대회가 열리고, 나는 늘 경진대회에 참여해왔다. 소소한 장학금이 걸려있기도 하고, 프로그래밍은 자신 없어도 참여함에 의미를 늘 두었던 편이다. 3학년 2학기, 컴퓨터 그래픽스 강의와 연관된 개발 경진대회가 열렸다. 주제는 자유였고, OpenGL이 기본이되 유니티 엔진으로 개발해도 상관없었다.
1. 주제 선정
자유주제... 정말 어려운 말이다. 나는 도대체 뭘 어떻게 만들어야 할지 고민에 빠지기 시작했다. 괜히 혼자 대회 나간다고 깝죽거렸다며 나를 탓하던 찰나, 동생이 야식으로 라면이 먹고 싶다고 물을 끓이기 시작했다. 동생이 같이 먹겠냐 물어봐서 안 먹겠다고 했는데, 물에 수프를 넣으니까 갑자기 먹고 싶어지는 것이다ㅎ 다가가서 하나만 더 끓이라고 말하려던 찰나... 문득! 떠오른 아이디어!
"물이 끓어오르는 시간을 미리 알 수 있는 방법은 없나?"
"냄비 종류에 따라서 물 끓는 시간이 달라진다던데, 왜 달라지는 거지?"
도대체 무슨 생각의 흐름인지는 모르겠지만, 문득 이런 생각이 들었다. (문과 출신 다운 면모!)
"이걸 주제로 정해야겠어!"
유레카! 를 외치며 알몸으로 욕조에서 뛰어나온 아르키메데스처럼 나는 후다닥 방으로 뛰어들어가서 메모를 남겼다. [주제 : 주어진 냄비 재질과 화력으로 물 끓는 시간을 도출해내는 것!]이라고 말이다.
2. 설계 과정
프로젝트의 목표
1. 냄비 재질과 화력에 따라 물이 끓는점에 도달하는 시간을 시각적으로 보여준다.
2. 프로그램을 확장시켰을 때 다양한 액체의 종류, 재질, 조리 기구 등 실험 주체의 다양성을 구현할 수 있도록 한다.
실생활 기대효과
사용자는 해당 시뮬레이션을 통해 시간을 효율적으로 활용할 수 있다.
산업적인 가치
다양한 재질과 화력을 활용해서 제철, 단열 등의 다양한 분야에 적용할 수 있다.
이 프로젝트의 목표는 사용자가 선택한 냄비 재질과 화력에 따라 물이 끓는 점에 도달하는 시간을 시각적으로 보여주는 것이다. 만약 사용자가 주물을 선택하고 강 버튼을 눌렀다면, 주물 냄비에 담긴 물을 가스레인지의 강불로 끓였을 때의 예상 시간을 보여줄 수 있도록 하는 것이다.
일단 어떻게 하면 주어진 재질, 화력만으로 물이 끓는 시간을 도출해낼 수 있을까? 생각하며 여기저기 서치를 해보았다.
일단 열전도율 공식과 열용량 공식을 통해 t값 (=시간 값)을 뽑아내서 예상 시간을 추출해보기로 했다. 공식 두 개로 이리저리 조합해보는 시간을 상당히 오래 가졌다. 참고로 난 이 날 열전도율, 열용량, 비열이란 것을 처음 알았다. 너무 힘들어서 전공이 에너지 공학인 뼈 이과 동생에게 자문을 구하고 같이 머리를 싸매며 공부를 했던 기억이 있다. (의문의 화학 공부)
개발은 일단 OpenGL, MFC로 하기로 했다. 냄비의 재질과, 화력을 선택하면 물이 끓어오르는 시간을 분 단위로 보여주고 추가적으로 시간/온도 그래프를 보여주는 것으로 설계했다.
3. 기술적인 한계
1달 동안 OpenGL, MFC로 열심히 개발에 매진해보았으나 제시간에 구현해낼 수 없겠다는 생각이 들었다. 그래서 마감 1주일 전 과감히 툴을 바꾸는 시도를 했다. (발표할 때 보니, 모든 팀이 감점을 감안하고 유니티 엔진으로 툴을 바꾸어 개발했었다. 일찍 판단해서 바꿀 걸... 하고 후회했다.)
유니티로 툴을 바꾸면서 시간/온도 그래프를 구현 내기 어렵다고 판단되었다. 그래프 대신 무엇을 넣어야 하나 고민하다가 예상 시간을 타이머로 구현하는 것으로 대체하기로 하였다. 조금 더 실생활에 유용하게끔, 접근하기 좋게끔 하였다.
4. 구현 순서와 과정
4-1. 프로그램에 사용할 오브젝트 제작
유무료 FBX 파일이나 유니티 에셋을 알아서 찾아 쓰라 하셔서 최대한 무료로 서치 해보려고 했다. 왜냐면... 시간과... MONEY를 아끼기 위해... 그런데 아무리 찾아도 마음에 드는 가스레인지 에셋이 없었다. 그럼 내가 직접 만들면 되지 뭐
3DS MAX로 가스레인지를 간단하게 후딱 만들어보았다. 당시 삼디 맥스에 대한 자신감이 뿜 뿜 했었기 때문에... 냄비와 각 Material도 만들어뒀는데, 유니티 에셋 스토어에 그보다 더 좋은 에셋이 있어서 그걸 활용했다. 에셋 스토어 최고 최고
4-2. 사용자의 실제 환경과 유사하게 오브젝트 배치
실생활에 조금 더 가깝게 시뮬레이션을 만드는 만큼, 그리고 유니티를 쓰는 만큼. 사용자의 실제 환경처럼 Scene을 꾸며보고 싶었다. Terrain에 마룻바닥 이미지도 깔아주고, 테이블을 배치했다. 그리고 그 위에 가스레인지, 물컵과 도마, 칼도 올려두었다. 사실 주방처럼 꾸미고 싶었지만, 나에게 남은 기간은 단 1주일이었기에 구성만 후다닥 맞춰보았다.
4-3. 냄비 선택 Scene 구성
냄비 선택 화면 Scene을 만들어보았다. 냄비 재질은 총 스테인리스, 알루미늄, 주물 세 가지로 선택할 수 있게끔 하였다. 각 재질은 버튼으로 구성하였고 Highlighted Color와 Pressed Color를 활용해서 버튼 위로 마우스를 올릴 때 색상 변화가 되도록 하였다. 사용자가 쉽게 클릭할 수 있도록 하기 위함이다.
사용자가 원하는 냄비를 선택하면, 선택한 냄비 재질에 따라 공식에 들어갈 열 전달계수가 바뀌도록 하였다. 예를 들어 주물을 선택하면 주물에 해당하는 열전달계수가 공식으로 쏙 들어간다.
4-4. 화력 선택, 예상 시간을 보여주는 Scene 구성
x버튼을 누르면 냄비 선택 scene으로 나갈 수 있도록 했고, 화살표 버튼을 누르면 해당 scene에서 선택한 모든 값과 화면이 초기화될 수 있도록 했다. 상단 가운데의 00:00은 사용자가 선택한 냄비의 재질과 화력에 따른 물이 끓어오르는 예상 시간을 보여주는 타이머다. 아래 강, 중, 약 버튼은 화력 버튼이다.
4-5. 마우스 휠 클릭, 휠 스크롤 클릭, 오른쪽 버튼을 이용해 카메라 컨트롤
마우스의 휠을 클릭한 뒤 움직이면 화면을 이동할 수 있도록 하고, 마우스의 휠을 스크롤하면 화면을 확대/축소할 수 있도록 했다. 대신 확대/축소는 거리에 대한 제약을 걸을 수 있도록 했다. 마우스의 오른쪽 버튼을 클릭한 채 움직이면 화면을 회전할 수 있도록 했다.
이때 활용한 함수는 Input.GetAxis(), Input.GetmouseButton()이다.
4-6. 예상 시간 스트립트 구현
사용자가 선택한 냄비 재질과, 선택한 화력에 따른 예상 시간을 정수로 보여주는 스크립트를 작성하고 계산된 값은 00:00의 형태로 보이도록 하였다.
4-7. 각 버튼에 스크립트 연결
Anchor Preset을 이용해서 버튼과 텍스트를 배치했다. Vertical Layout Group과 Layout Element를 활용해서 화면이 늘어나거나 줄어들어도 레이아웃에 변화가 없도록 화면을 구성했다. 화력 버튼을 강 중 약으로 나누어 배치하였고 Switch Case 문을 활용하였다.
화력 버튼(2번)을 누르면 열 전달계수, 비열, 물 용량, 화력이 오른쪽 상단에 이미지(4번)로 띄워줄 수 있도록 했다. SetActive(), ToString() 함수를 이용해서 TextUI에 문자열 값을 출력하도록 했다. (숫자를 출력해도 상관은 없었겠지만...)
또한 화력 버튼 (2번)을 눌렀을 때 예상 시간 타이머 (3번)이 실행되도록 했다. StartTimer()이라는 함수를 정의하고 버튼을 누르기 전까지 타이머를 비활성화시킨 후, 버튼의 OnClick 속성을 이용해서 화력 버튼과 함수를 연결했다.
4-8. 불 Particle 조절
사용자가 선택한 강, 중, 약 불 버튼에 따라 화력이 달라 보이게 할 수 있도록 스크립트를 통해 Particle 시스템을 조절하였다. Particle System의 Color와 Scale을 이용해서 화력의 세기가 달라 보이게 했고, 불의 생동감을 부여하기 위해 Point Light도 추가했다.
사용자가 버튼을 눌렀을 때 불이 보이게 해야 하므로 Particle System의 Play On Awake를 비활성화한 다음, 화력 버튼의 Onclick 속성과 Play() 함수를 이용해서 버튼을 꼭 클릭해야만 불 파티클이 활성화될 수 있도록 했다.
4-9. 기포 파티클, 연기 파티클 활성화
화력 버튼을 누르고 예상 시간의 절반이 되면 저절로 연기 파티클과 기포 파티클이 활성화가 되도록 했다. 근데 잘 안 보인다... (흐릿...)
4-10. 예상 시간 타이머가 00:00이 되면 자동으로 타이머를 멈출 수 있도록 스크립트 구현
현재 시간 (currentTime)이 0 이하가 됐을 때 현재 시간을 0으로 초기화해서 마이너스 값으로 넘어가지 않도록 제어했다.
4-11. 초기화 버튼, 닫기 버튼 구현
초기화 버튼을 누르면 현재 화면이 초기화될 수 있도록 하고, 닫기 버튼을 누르면 메인화면으로 돌아갈 수 있도록 했다. SceneManager의 LoadScene 메소드를 활용했다. 화면을 초기화할 때는 타이머도 같이 초기화되어야 하기 때문에 버튼을 누르면 StartTimer() 함수 (타이머 시작 함수)가 False가 되도록 했다.
4-12. 타이머가 00초가 될 때 알림 사운드 활성화
타이머가 00:00이 될 때 알림 사운드를 활성화해서 물이 끓어오르는 시간에 도달했음을 알 수 있도록 했다. Audoi Source의 Play On Awake를 비활성화시킨 후, 스크립트에 Play() 함수를 이용해서 현재 시간이 0이 되면 추가한 Audio 에셋이 자동으로 출력될 수 있게 했다.
5. 결과물
결과물은 위에 올려둔 영상 링크로 대체한다. 네이버 블로그에도 올려두었다. 대회 당일은 해당 결과물의 보고서를 기준으로 발표, 데모 시연, 질의응답까지 했다.
6. 느낀 점
남은 기간은 1주일이었지만 개발은 3일 동안 했었다. 3학년 2학기는 이거 외에도 많은 팀플과 작업이 있었기 때문이다. 발표 시간이 끝나고 질의응답 시간에 교수님께서 이런 질문을 하셨다. 물이 끓어오르면 기포의 크기가 점점 커진다는 걸 알고 있는지, 그걸 생각해보았는지 에 대한 질문이었다. 이 부분은 고려하지 않아서 왜인지 부끄러웠다. 짧은 기간 동안 빠르게 만들었지만, 조금 더 생각해볼걸... 하는 생각도 들었다.
마지막에는 "그래서 어떤 재질의 냄비를 활용했을 때 물이 가장 빨리 끓어올랐는가?"라고 물어보셨다. 그 건 알루미늄이었다고, 알아낸 바를 대답했다. 화학 공부를 열심히 하셨거나, 관심이 많은 학우들은 시시하게 들릴지 몰라도 난 아니었기에 대답을 참 열심히 했었다. 교수님께서는 개인적인 호기심에서 프로젝트를 시작했다는 점을 호기롭게 봐주셨다. 질의응답이 끝나고 교수님이 재밌게 잘 봤다고 해주셔서 정말 기뻤다.
프로젝트를 하면서 가장 뿌듯했던 때는 내 단순한 호기심이 창작물로서 만들어진 때였다. 조사 과정에서 직접 공식을 서치 하고, 조합하고, 값을 뽑아내고, 자문을 구하기도 하고, 직접 냄비에 물을 올려 실험을 해보면서 현재 가지고 있는 문제점을 해결하는 방법에 대해 여러 방면으로 생각해볼 수 있었다.
나는 여태껏 프로그램을 혼자 구현해본 적이 없었다. 대부분 팀과 함께였기 때문이었다. 그래서 이번 프로젝트를 혼자 진행해보기로 마음을 먹었다. 스스로 주제를 결정하고, 스스로 설계하고, 이를 직접 개발하는 과정을 홀로 온전히 겪어보고 싶었다. 개인으로 프로젝트를 진행하면서 문제점을 스스로 해결하는 힘을 기를 수 있었던 것 같다. 또 그 과정에서 문제를 해결하는 힘을 길러야겠다.라고 다짐했다.
여담.
부끄럽지만 대회에서는 입상을 하지 못했다. 점수는 80점대 후반이었던 것으로 기억한다. 쟁쟁한 팀들이 많았고, 나는 보고서에 많은 시간을 투자하지 못했기 때문에 이 부분에서 점수가 많이 깎였다...ㅎㅎ 상은받지 못했지만, 가장 큰 목표였던 구현해내기에 성공했고 홀로 시뮬레이션을 만들어냈다는 점에서 큰 의미가 있었던 프로젝트였다. 또 상을 받은 다른 팀들의 대단한 작품을 볼 수 있어서 좋았다.
'🍅 About me > 활동' 카테고리의 다른 글
비교과 활동 - 2021 교내 비교과 포트폴리오 대회 / 우수상 수상 (0) | 2022.04.20 |
---|---|
교과활동 - 티켓 예매 애플리케이션 검색 과정 UX개선 / HCI (0) | 2022.04.19 |
교과 활동 - "JIRA(지라)"로 졸업 작품 테스크 관리하기 (0) | 2022.02.23 |
교과 활동 - 첫 애플리케이션 기획, 마음 케어를 위한 애플리케이션 한울고래 (0) | 2022.02.22 |
봉사 활동 - 아름다운가게 봉사 활동 (2) | 2022.02.19 |