{{ label!='' ? 'Label : ' : (q!='' ? '검색 : ' : '전체 게시글') }} {{ label }} {{ q }} {{ ('('+(pubs|date:'yyyy-MM')+')') }}

[분석] Nobody Wants to Die(노바디 원츠 투 다이) 스토리 정리

이미지
Nobody Wants to Die의 세계   <Nobody Wants to Die>는 미래의 2329년을 배경으로 합니다. 하늘 높은 마천루가 햇빛을 가리고 있고, 자동차는 하늘을 날며, 바다 나 호수 라는 개념은 사라진지 오래인 디스토피아죠. 이 세계는 많은 사람들이 영생을 누리고 있는데, 아이코라이트라는 것을 이용하여 의식을 다른 신체에 옮길 수 있는 기술이 개발되었기 때문입니다. 머리에 총을 맞고 사망하여도, 아이코라이트가 뇌에 잘 남아있다면 언제든지 사망 관리부가 이를 회수하여 새로운 신체와 함께 사망자를 되살릴 수 있습니다. 새로운 신체를 언제든지 돈으로 구매할 수 있습니다.   하지만 이에는 대가가 존재합니다. 모든 이는 21세가 되면 본인 신체에 대한 구독료 를 지불해야 합니다. 즉, 모든 신체는 나의 신체 가 아닌 정부 혹은 공공의 신체 입니다. 따라서 이에 대한 값을 지불해야 하며, 이를 지불하지 못하면 신체는 은행에 회수되고 경매에 부쳐지게 됩니다. 그리고 회수된 신체를 지니고 있던 의식은 끝나지 않는 번호표를 갖고 공짜 신체가 본인에게 들어오기를 기다려야 하죠. 사망 관리부의 형사 제임스 카라 주인공의 정신 상태에 대해 걱정하는 파트너 사라   주인공 제임스 카라 는 사망 관리부 의 형사입니다. 그는 2주 전의 어떤 사건 으로 사망한 뒤 새로운 신체를 받아 복직을 하는 과정에 있습니다. 새로운 신체는 마약 중독자의 신체인 E등급 신체였고, 새로운 신체를 받아들이는 동기화 과정에서 여러 어려움을 겪고 있었습니다. 특히, 이제 세상에 없는 아내 레이첼 의 환각이 자꾸 발생해 고통스러운 동기화 과정을 진행하고 있었죠. 이런 와중에 전 세계에서 가장 오래 산 부자 그린 의 사망 사건을 맡게 됩니다. 그리고 해당 업무에는 사라 라는 파트너가 함께하여, 그를 원격으로 돕게 됩니다. 그린의 사망 그린 의 아파트   주인공은 그린 의 아파트에 도착합니다. 그는 목을 매달고 자살한 것으로 보였습니다. 특이한 점...

[게임리뷰] Dungeons of Hinterberg (힌터베르그의 던전) 리뷰

이미지
  <Dungeons of Hinterberg>   마법의 힘과 던전이 생긴 한 작은 마을 '힌터베르그'에, 주인공은 과로에 지친 몸을 이끌고 휴가를 떠나옵니다. 각 구역에서 뿜어져 나오는 마법의 힘을 빌려 던전을 클리어하는 것은 무료한 일상을 보내는 현대인들에게 각광받는 레저 관광지가 되었습니다. 주인공은 다양한 마법을 구사하며 전투하고, 던전의 퍼즐을 풀며, 관광지 '힌터베르그' 이면에 있는 비밀을 파헤치게 됩니다. 낮에는 던전, 저녁에는 사교 던전 탐험가들의 패션에 대해 토론 중인 주인공과 NPC들   <Dungeons of Hinterberg>(이하 <DoH>)의 하루는 스케쥴이 명확하게 정해져 있습니다. 아침, 낮, 저녁, 밤 4가지입니다. 각 시간대에는 플레이어가 특정 행위를 할 수 있죠. 특히 낮에는 던전을 탐험하고, 저녁에는 NPC들과 사교를 통해 스토리를 진행하거나 관계 보상을 획득할 수 있습니다. 낮에는 <Zelda> 시리즈, 저녁에는 <Persona> 시리즈의 게임에 비유되기도 합니다.

[Troubleshooting] Blender에서 Unreal Engine으로 FBX Export-Import 시 Mesh나 Animation 등이 맞지 않는 문제

이미지
 설명 다양한 상황이 존재합니다: 일부 Mesh가 누락되는 상황 Scale이 100배 작아지는 상황 Bone의 pivot이 맞지 않는 상황 원인 및 해결 Skeletal Mesh의 경우 각 Mesh들에 대한 Armature Modifier가 잘 설정되어 있어야 합니다.    예를 들어, Armature 하위의 특정 Bone에 대한 Armature Modifier가 제대로 설정되어 있지 않다면 해당 Mesh는 FBX Export 과정에서 누락될 수 있습니다.   인간형 Skeletal Mesh에서는 그럴 일이 거의 없겠지만, 가령 문이나 구조물 등에 대해 Skeletal Mesh의 형태로 애니메이션을 조절하는 경우에는 움직이지 않는 부분들에 대한 Armature Modifier 누락으로 인해 문제가 발생할 수 있습니다. 단위가 일치해야 합니다.   Unreal Engine의 경우 1cm을 단위로 하며, Blender의 경우 None, Metric System, Imperial System을 사용할 수 있습니다. Imperial System은 논외로 하더라도, 다른 시스템에서는 단위에 대한 scale을 맞춰 주어야 합니다. 다음과 같은 방법들을 생각해볼 수 있습니다: None으로 설정하고, 1cm가 단위라고 생각하여 모델링을 수행하기. Metric System으로 설정하고, Unit Scale을 0.01로 맞춘 뒤 모델링 작업 후 Export 시 100배로 늘리기. Metric System으로 설정하고 그냥 1cm가 단위라고 생각하여 모델링을 수행하기.   만약 이미 모델링을 수행하고 있다면, 2번의 작업을 선택하거나 적절히 scaling을 100배 해주는 작업을 거쳐야 합니다. 이때 Translation과 관련한 문제가 발생할 수도 있으며, 별도로 확인하여 재조정하는 작업이 필요할 것입니다.

[게임리뷰] Lorelei and the Laser Eyes (로렐라이와 레이저 눈) 리뷰

이미지
<Lorelei and the Laser Eyes>   여기 절제된 색으로서 플레이어를 압도하는 게임이 있습니다. 붉은색은 혈흔일까요, 아니면 페인트에 불과할까요? 등장인물인 'Renzo'는 "둘 다"라고 답합니다. 정확히는, "인간의 혈흔은 예술의 붉은색 페인트로서만이 의미가 있다."이죠.  첫 등장부터 플레이어를 압도하는 'Renzo'   <Lorelei and the Laser Eyes>(이하 <LATLE>)는 훌륭한 사운드와 멋진 아트웍으로 플레이어를 긴장 상태에 몰아 넣습니다. 2024년 게임 최고의 연출력을 자랑한다고 감히 말할 수 있지 않을까요? 게임 내내 가득찬 암시와 은유는 플레이어의 흥미를 돋구며, 복잡한 그들의 세계를 멋드러지게 풀어냅니다. 

[DirectX12] ddx(), ddy()

이미지
텍스처의 밉맵 수준은 언제 결정되나요?   DirectX12에서 적절한 대답은, "Sample() 함수를 호출할 때"이다. 즉, 픽셀 셰이더 단계가 될 것이다. Sample() 함수 내에서는 다시 SampleGrad()를 호출한다. SampleGrad()에는 ddx, ddy 값을 의미하는 매개변수가 전달되며, 이를 통해서 밉맵 수준을 결정할 수 있는 것이다. ddx, ddy의 값을 어떻게 얻나요?   그렇다면 Sample() 내에서 SampleGrad()를 호출하기 위해 ddx, ddy 값을 계산해야 할 것이다. HLSL에서는 ddx(), ddy() 내장 함수를 지원하며, 이를 통해서 해결할 수 있다.   ddx(), ddy()에 대한 설명을 읽어보면 화면 공간의 x, y에 대해서 지정된 값의 편도함수를 반환한다고 써져있다. 이를 이해하는 데 약간의 혼란이 있을 수 있다. 이것이 어떻게 동작하는지를 알면 조금 더 명확해질 것이다.   그래픽 하드웨어는 병렬적으로 프로세스를 처리하며, 워프의 개념이 있어서 가령 32개의 스레드가 동일한 코드를 발맞추어 실행한다. 픽셀 셰이더는 특히 픽셀 단위로 처리되며, 각각의 스레드도 최소한 2x2 픽셀 단위로 처리된다. 따라서 해당 스레드는 자신 주변의 픽셀에 대한 정보 역시 알 수 있게 된다.   따라서 ddx()와 ddy()는 "내 픽셀에서 평가된 매개변수로 주어진 값"과 "옆 픽셀에서 평가된 매개변수로 주어진 값"의 차이 를 반환하는 것이다. 예를 들어, 다음과 같은 코드를 작성하면 화면 공간에서 x나 y로 움직일 때 텍스처 좌표의 변화가 얼마나 급격하게 변하는지를 확인할 수 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 PixelOut PS(VertexOut pin) {     PixelOut pixelOut;           ...

[코딩의탑] 5층: 포탈(Portal), 더 나아가기

이미지
2층에서 많은 부족함이 있었죠..   2층 에서 우리가 구현한 포탈은 다음과 같은 부족함이 있습니다: 포탈을 단순히 월드에 배치하기만 했으며, 포탈 건의 요구사항을 고려하지 않았습니다. 가령 포탈은 벽에 생성될 수 있어야 합니다. 플레이어의 포탈 이동만을 고려했습니다. 큐브 등 다른 오브젝트 역시 통과할 수 있어야 합니다. 포탈에 걸쳐있는 오브젝트는 포탈 양면에서 보일 수 있어야 합니다. 즉, 오브젝트의 복사가 이루어져야 합니다. Near plane clippng으로 인해 포탈에 들어가기 직전 카메라가 평면과 겹치는 순간, 포탈 평면의 뒷면 모습이 비춰집니다. 포탈에 비추는 플레이어의 모습이 3인칭으로 보여야 합니다. 효율적인 포탈 재귀 렌더링 방법이 필요합니다. 복습해봅시다. 벡터와 점의 변환   포탈 건너편으로 이동하는 효과를 주기 위해서, 우리는 적절히 오브젝트를 이동 및 회전시켜야 합니다. 속도 역시 적절한 방향으로 보존되어야 하죠. 포탈   먼저 위치와 속도는 3차원 벡터로 표현될 수 있습니다. 그리고 이것이 포탈과 포탈 사이에서 자연스럽게 이어져야 하죠. 마치 포탈이 붙어있는 것처럼요! 다음 그림을 참고해보세요. 블루 포탈과 오렌지 포탈은 서로가 위 방향 축을 기준으로 180도 회전한 상태에서 맞붙어있는 것처럼 느껴야 합니다. 블루 포탈과 오렌지 포탈   이는 각 포탈을 일종의 지역 좌표계로 생각해볼 수 있습니다. 포탈의 [앞 방향 벡터, 우측 방향 벡터, 위 방향 벡터]를 각각 [X, Y, Z]축으로 삼는 셈이죠. 우리는 마치 "이어져 있는" 환상을 선사해야 하므로, 한쪽 지역 좌표계의 좌표 값을 그대로 다른쪽 지역 좌표계의 좌표 값으로 자연스럽게 넘겨주면 됩니다. 다양한 방법이 있겠지만 성능을 위해, 각 축에 대한 내적의 값을 이용하도록 합시다. 각 축은 정규화되어 있고 수직이므로, 내적을 이용할 수 있습니다. 좌표계의 변환 소스 코드: APortal::TransformVectorToDestSpace(), Tra...