paint-brush
젤다의 전설 - 황혼의 공주 레벨 뷰어 구축~에 의해@hackerclz1yf3a00000356r1e6xb368
396 판독값
396 판독값

젤다의 전설 - 황혼의 공주 레벨 뷰어 구축

~에 의해 Tommy6m2024/08/03
Read on Terminal Reader

너무 오래; 읽다

나는 Twilight Princess(Nintendo GameCube)용 웹 BMD 뷰어 프로그래밍을 시작했습니다. 왜냐하면 나는 이 게임을 좋아하고 게임 제작자로서 레벨을 분석하고 레벨이 어떻게 만들어졌는지 세부적으로 몰입하는 데 매료되었기 때문입니다.
featured image - 젤다의 전설 - 황혼의 공주 레벨 뷰어 구축
Tommy HackerNoon profile picture
0-item


이 프로젝트는 확실히 제가 진행한 프로젝트 중 가장 발전된 프로젝트 중 하나입니다. 저는 Twilight Princess(Nintendo GameCube)용 웹 BMD 뷰어 프로그래밍을 시작했습니다. 왜냐하면 저는 이 게임을 좋아하고 게임 제작자로서 레벨을 분석하고 레벨이 어떻게 만들어졌는지 세부적으로 몰입하는 데 매료되었기 때문입니다. 이 프로젝트는 제가 그 열정을 탐구하고 제가 좋아하는 게임에 대해 더 깊이 이해할 수 있는 방법입니다. 도전적이고 보람있는 학습 경험입니다. 나는 이 프로젝트가 나를 어디로 데려갈지, 그리고 그 과정에서 어떤 새로운 발견을 하게 될지 기대됩니다. 지금까지 이 프로젝트는 수개월에 걸쳐 연구하는 데 걸렸습니다. rarc, bmd, gcm yaz0, j3d, tev 등에 대한 지식과 결과를 조사하고 공유한 20명 이상의 다른 사람들의 작업을 기반으로 한 연구입니다. 저는 어떤 사람을 우연히 만나 그들에게 공로를 인정했습니다.


("LordNed", "thakis", "Jasper St. Pierre", "Kiwi", "Dolphin Emulator Team", "Gamma", "Zan") - 그들의 선구적인 노력에 감사드립니다!

물, 안개, 애니메이션 텍스처는 현재 로드맵에 있는 기능입니다.

데모

프로그램은 three.js와 webGL을 사용하여 프로그래밍되었습니다. 크롬 브라우저에서는 60fps로 일정하게 실행됩니다. 불행히도 저는 연구의 공정한 사용에 대한 한계가 어디까지인지 알고 싶지 않기 때문에 대화형 뷰어(모델, 방 등)를 귀하와 공유할 수 없습니다. 내 몽타주를 즐겨보세요:


https://api.fenixfox-studios.com/assets/d43523dd-5cbe-4da4-9c7d-2d275690050a

명세서

BMD 및 BDL은 Nintendo가 GameCube 및 Wii 게임에 모델 데이터를 저장하기 위해 사용하는 파일 형식입니다. 이는 더 큰 JSYSTEM 툴킷의 구성 요소인 Nintendo의 J3DGraph 라이브러리의 일부입니다. BMD는 Luigi's Mansion 게임에 처음 등장했습니다. 당시에는 Super Mario Sunshine에서 사용된 유일한 모델 형식이었습니다. Wind Waker는 MDL3이라는 재료 FIFO 명령어에 대한 추가 섹션이 포함된 BMD의 확장인 BDL 형식을 추가로 도입했습니다. MDL3은 렌더링 효율성을 향상시키는 데 사용됩니다. Super Mario Galaxy 2는 이 모델 형식을 사용한 마지막 게임이었습니다.


JSYSTEM은 Nintendo가 콘솔용 게임을 만드는 데 사용하는 독점 게임 개발 툴킷입니다. 여기에는 3D 모델링, 애니메이션, 물리학 등의 작업을 위한 다양한 라이브러리와 도구가 포함되어 있습니다. J3DGraph는 3D 그래픽 처리 기능을 제공하고 BMD 및 BDL 파일 형식을 담당하는 JSYSTEM 내의 라이브러리입니다. BMD는 Binary MoDel을 나타내고 BDL은 Binary Display List를 나타냅니다.


JSYSTEM 툴킷은 2000년대 초반 리버스 엔지니어와 게임 모더가 Nintendo GameCube 및 Wii 게임의 코드를 분석하고 디컴파일하기 시작하면서 발견되었습니다. 그들은 많은 게임이 유사한 코드 구조와 라이브러리를 공유한다는 사실을 발견했으며, 이는 공통 개발 툴킷의 존재를 의심하게 만들었습니다. 많은 연구와 실험 끝에 그들은 게임에서 JSYSTEM 라이브러리를 식별하고 추출할 수 있었고 J3DGraph 라이브러리와 BMD 및 BDL 파일 형식을 포함한 다양한 구성 요소를 문서화하고 리버스 엔지니어링하기 시작했습니다.


JSYSTEM에 대한 이해가 높아짐에 따라 모더들은 JSYSTEM 형식으로 작업하기 위한 자체 도구를 개발하기 시작했고 자신만의 사용자 정의 모델과 텍스처를 만들고 심지어 JSYSTEM 라이브러리를 사용하여 새로운 게임을 만들기 시작했습니다. 이로 인해 많은 모더가 자신의 연구 결과와 도구를 온라인으로 공유하면서 오늘날에도 계속 존재하는 활발한 모딩 커뮤니티가 만들어졌습니다.

개발

처음에는 실제 *.dol 또는 *.gcm 컨테이너 형식에 별 관심이 없었습니다. 왜냐하면 다른 사람들이 이미 바로 사용할 수 있는 도구(나중에 직접 gcm 리더 생성)를 훌륭하게 제공했기 때문입니다. 약간의 검색 끝에 방이나 기타 요소와 같은 흥미로운 내용이 포함되어 있는 것처럼 보이는 폴더를 발견했습니다. Faron Woods와 같은 큰 영역은 덩어리로 나누어 별도의 파일로 저장되었으며 나중에 병합되어 전체 영역을 형성했습니다.


하지만 저는 쉽게 시작하고 싶었어요. 아마도 간단한 것일 수도 있습니다! 폴더에 있는 것들을 대부분 풀어낸 뒤, 파일들을 크기별로 분류해 보니 초간단한 물건을 발견했습니다. HexWorkshop 에서 파일을 확인했을 때 VTX, INF, DRW 및 SHP와 같은 마커를 우연히 발견했습니다. 꼭지점 위치를 보면 단순한 문 손잡이가 달린 평평한 상자라는 것을 알 수 있었습니다. 나는 그것이 호수바닥 사원에서 나오는 문이라는 것을 곧 깨달았다.


나는 물체가 어떻게 보일지 알았고 정점 좌표와 질감 정보 같은 기본 정보를 어디서 찾을 수 있는지도 알고 있었습니다.


BMD 형식 문서


일부 정보는 귀하의 사례에 맞지 않으므로 주의해야 합니다. 특정 속성은 해당 문서에서 말하는 것과 다릅니다. 하지만 3D 모델과 그 텍스처를 추출하려면 이와 같은 형식 시트만 있으면 됩니다!


적어도 단순한 물체를 추출하려는 시도에 성공한 후에는 더 깊이 파고들어 완전한 영역을 다루어야 할 때라고 생각했습니다! 방금 작성한 것과 동일한 알고리즘으로 무장하여 R00_00이라는 파일을 선택했습니다. 오르돈 마을이나 파론 숲이었으면 좋겠다고 생각했습니다. 그러나 그것은 중요하지 않았습니다. 왜냐하면 내가 가진 것은 쓰레기 더미뿐이었기 때문입니다. 분명히 잘못된 정점 순서의 경우입니다. 이 사진을 보면 어떤 방인지 알 수 있나요?


모양별로 천천히 물을 테스트했습니다. 곳곳에 절벽과 묘비가 나타나기 시작했습니다. 내가 카카리코 묘지 지역을 보고 있다는 것이 분명해졌습니다.


꽤 시간이 지나서 이런 결과를 얻을 수 있었습니다. 특정 개체가 누락되고 일부 면이 반전되었으며 텍스처가 하나도 올바르게 적용되지 않은 것 같습니다.


해결책은 다소 혼란스러웠습니다. 특정 모양에는 특정 재질 지수가 정의되어 있지만 직접적인 1:1 관계는 없었습니다. 대신 BMD 파일의 INF 섹션에 정의된 장면 계층 구조를 살펴봐야 했습니다. 이 계층 구조는 모양이나 재료를 나타낼 수 있는 노드 트리로 구성되었습니다. 일반적으로 계층 구조는 재질로 시작하고 그 뒤에 몇 가지 모양이 옵니다. 예를 들어 (mat1, shp2, shp5, shp6, mat2, shp1, shp12...)와 같은 내용이 표시될 수 있습니다. 이 경우 모양 2, 5, 6은 모두 재료 1을 사용하는 식입니다.



글쎄요, 하지만 그 게임을 해본 사람이라면 누구나 재질이 이상하다는 것을 눈치챌 것입니다. 색상이 흐릿하고, 재질 간의 블렌딩도 없으며, 전체적으로 상당히 어둡게 보입니다. 이 시점에서 나는 이 모든 것 중에서 가장 놀라운 부분을 다루었을 것입니다. GameCube는 TEV 단계 또는 텍스처 환경 단계를 사용하여 이러한 작업을 처리합니다. TEV 스테이지는 텍스처 혼합, 색상 관리, 투명도 효과 적용을 담당합니다. GameCube는 두 개의 렌더 패스와 멀리 있는 객체를 먼저 렌더링하는 방식으로 오늘날 우리가 알고 있는 투명도 효과를 실제로 지원하지 않았다는 점에 유의하세요. 일부 GitHub 저장소, 일부 기사, 일부 포럼 스레드가 있습니다. 최대한 많은 정보를 얻으세요!


추가해야 할 또 다른 중요한 부분은 안개, 꽃, 구름과 같은 대기 효과였습니다. 이 시점까지는 안개와 블룸 효과를 성공적으로 만들 수 없었지만 구름 그림자를 찾아 블렌딩 TEV 스테이지에 넣었습니다. 나는 여전히 구름의 정확한 UV 좌표를 찾고 있습니다.


그 방의 최종 결과는 다음과 같습니다. (실제로 여기까지 오는 데 꽤 시간이 걸렸습니다.)


결론

이 프로젝트는 놀라운 여정이었습니다. 똑똑한 사람들이 과거의 기술적 한계를 어떻게 해결했는지 알아보는 데 시간을 투자하면서 <황혼의 공주>의 복합적인 아름다움을 감상하는 데 도움이 되었습니다. 저는 좋은 진전을 이루었지만 여전히 탐색하고 구현해야 할 항목이 엄청나게 많습니다. 저는 이 뷰어에 안개, BTK(텍스처 애니메이션) 및 기타 대기 효과와 같은 기능을 추가하여 최대한 정확하고 몰입감을 높이는 작업을 계속할 계획입니다.