개발일지 - 견적 내기
게임인재원 4학기 생활 중 작성하는 개발일지. 지금부터 미니프로젝트까지 남은 시간이 6주, 미니 프로젝트 진행 시간이 4주, 총 10주의 시간동안게임 엔진, 그래픽스 엔진, 게임 에디터, 이 셋을 완성하고 클라이언트 프로그램까지 작성을 끝내야 한다. 계획을 어떻게 짜야 좋을까? 우선, 프로젝트를 시작하기 전 6주동안 끝내놔야 할 작업들을 정리하자. - 게임 엔진 게임 엔진은 Entity Component System 구조로 인재원 생활 6개월간 만들어 놓은 것이 있다. 게임 루프와 게임 오브젝트들 간의 계층구조, 씬과 Component가 구현되어 있고, 이 엔진을 활용하여 2학기 프로젝트를 성공적으로 끝마친 바 있으니 게임엔진의 안정성이 1개월짜리 소규모 프로젝트 레벨에서는 검증이 되었다고 할 수 있겠다..
2023.06.16
no image
스키닝
스키닝은 메시의 버텍스가 둘 이상의 노드에 의존할 수 있도록 만드는 렌더링 기법이다. 버텍스가 의존하는 각각의 노드들 기준의 버텍스 월드 좌표들을 구한 후, 이들을 각 본의 가중치에 따라 보간하여 버텍스가 최종적으로 위치하게 될 월드 좌표를 계산한다. 이를 구현하기 위해, 버텍스 정보는 영향을 받는 본들의 인덱스와 각 본에 대한 가중치를 추가로 저장한다. "[bone의 초기 world transform matrix의 역행렬] * [bone의 현재 world transform matrix 행렬]"이라는 특별한 행렬이 상수버퍼에 담기게 되는데, 버텍스의 초기 월드기준 좌표가 들어온 값에 본의 초기 월드 트랜스폼의 역행렬을 곱해 본 기준 버텍스 좌표를 구한 다음, 현재 본의 월드기준 트랜스폼을 곱해 버텍스 좌..
2023.06.15

게임인재원 4학기 생활 중 작성하는 개발일지.

지금부터 미니프로젝트까지 남은 시간이 6주, 미니 프로젝트 진행 시간이 4주,

총 10주의 시간동안게임 엔진, 그래픽스 엔진, 게임 에디터, 이 셋을 완성하고 클라이언트 프로그램까지 작성을 끝내야 한다. 계획을 어떻게 짜야 좋을까?

 우선, 프로젝트를 시작하기 전 6주동안 끝내놔야 할 작업들을 정리하자.

 

- 게임 엔진

 게임 엔진은 Entity Component System 구조로 인재원 생활 6개월간 만들어 놓은 것이 있다. 게임 루프와 게임 오브젝트들 간의 계층구조, 씬과 Component가 구현되어 있고, 이 엔진을 활용하여 2학기 프로젝트를 성공적으로 끝마친 바 있으니 게임엔진의 안정성이 1개월짜리 소규모 프로젝트 레벨에서는 검증이 되었다고 할 수 있겠다. 범용적으로 쓰일 수 있는 에디터가 없다는 것이 문제지만 말이다.

 

- 그래픽스 엔진

 2d 그래픽만 이용해서 게임을 만들 때에는 그래픽스 엔진이라 할 것이 전혀 없었다. 화면에 임의의 위치, 각도, 사이즈로 이미지를 찍어내기만 하는 함수만 있으면, 표현하지 못할 게 없었다.

 3d 그래픽스엔진이라고 뭐가 크게 다를까? 하는 생각이 든다. 그래픽스 엔진이 내부적으로 처리해야 할 일은 여러가지가 있겠지만, 그래픽스 엔진이 게임 엔진에 뚫어줘야 할 API는 결국 특정 월드공간에 메시를 그려달라, 라이트를 배치해 달라, 스크린 공간에  2d 이미지를 찍어달라, 이 정도가 전부일 것이다.

 ..사실, 애니메이션, 파티클 이펙트 같은 것들을 생각하면 그보다는 훨씬 더 많은 인터페이스가 필요하겠지만, 일단은 최대한 간소한 형태로 그래픽스 엔진과 게임 엔진을 연동시킨 후, 에디터 작업을 들어가야겠다.

 

- 엔진 에디터

 최소한 프로젝트 시작 전에, 나와 팀원들의 심리적 안정감을 위해서라도 엔진 에디터는 완성이 되어 있어야 한다. 2학기 자체 엔진 프로젝트를 진행할 때, 맵 에디터가 존재하긴 했지만  에디터는 클라이언트 코드를 분석할 수 있어야겠고, 분석된 클라이언트 코드를 파일로 저장하고, 또 불러올 수 있어야 하니 리플렉션과 시리얼라이제이션을 구현해야 할 것이다. 당연히 둘 다 내가 6주안에 직접 만들 수 있다는 생각은 들지 않는다. 오픈소스를 가져다 쓰는 수 밖에.

 

-결론

 게임 엔진 - 그래픽스 엔진 - 엔진 에디터 - 클라이언트 프로그램 간의 연계가 정말 최소한의 기능만 존재해 마치 뼈만 앙상한 목각인형처럼 돌아가더라도, 작동하는 전체 구조를 만든 다음 각 부위에 필요한 만큼 살을 붙이는 것이 현실적인 생각일 것 같다. 따라서 지금 당장 해야 할 일은...

 

1. world 좌표에 스테틱 매시를 그리는데에 필요한 최소한의 인터페이스를 정의하고, 엔진 클라이언트 프로그램을 그려낸다.

2. 에디터 프로그램에 IMGUI를 적용해 간단한 UI 레이아웃을 그려놓는다.

스키닝

yunu95
|2023. 6. 15. 16:33

스키닝이 적용되어 버텍스들이 여러 본의 가중치에 따라 부드럽게 움직이는 애니메이션

스키닝은 메시의 버텍스가 둘 이상의 노드에 의존할 수 있도록 만드는 렌더링 기법이다. 버텍스가 의존하는 각각의 노드들 기준의 버텍스 월드 좌표들을 구한 후, 이들을 각 본의 가중치에 따라 보간하여 버텍스가 최종적으로 위치하게 될 월드 좌표를 계산한다.

이를 구현하기 위해, 버텍스 정보는 영향을 받는 본들의 인덱스와 각 본에 대한 가중치를 추가로 저장한다. "[bone의 초기 world transform matrix의 역행렬] * [bone의 현재 world transform matrix 행렬]"이라는 특별한 행렬이 상수버퍼에 담기게 되는데, 버텍스의 초기 월드기준 좌표가 들어온 값에 본의 초기 월드 트랜스폼의 역행렬을 곱해 본 기준 버텍스 좌표를 구한 다음, 현재 본의 월드기준 트랜스폼을 곱해 버텍스 좌표를 월드로 보내는 것으로 특정 본에 의존적인 버텍스 월드 좌표를 얻을 수 있다. 이렇게 구해진 값들을 각 본에 대한 가중치에 맞게 보간함으로서 버텍스의 위치는 여러 본의 영향을 골고루 반영하게 된다.