기존에 땅을 파는 로직을 추가했다. 처음엔 땅을 파는 판정을 할 구의 반지름 내에 들어온 버텍스의 스칼라 값을 가까울수록 값을 많이 변화시키는 방식으로 작성했는데, 그냥 일정한 값만큼 값을 변경하도록 수정했다. 이렇게 하니까 한번 땅을 파거나 메울때마다 얼마나 팔 것인지 값을 조절할 수 있게 되었다. 나중에 장비를 업그레이드 하면 땅을 더 많이 팔 수 있도록 해야할 때 유용해보인다. 마우스를 꾹 누르면 일정 시간마다 땅을 파고 메우는 기능도 추가했다. 이렇게 하니까 제법 아스트로니어와 비슷해보였다. 구 형태로 지형을 편집하도록 구현해보니 왜 아스트로니어가 구 형태가 아닌 원 형태를 채택했는데 알겠다. 구 형태로는 땅을 원하는대로 고르게 파기가 어려웠고 메워도 내가 원하는 형태가 아니다보니 메우고 파기..
사이드 프로젝트
프로파일러로 체크해본 결과 평상시에 CPU가 한 프레임을 처리하는데 드는 시간이 5ms가 나오다가 메시를 렌더링 할때마다 16ms가 나오게 되었다. 특히 MeshCollider로 런타임에 충돌체를 생성하는것이 오래 걸리고 있었다.MeshCollider를 모두 꺼버리자 6ms가 줄어들어 10ms가 되었다. 하지만 여전히 Marching Cubes를 연산하느라 5ms정도를 먹고있다.코드를 확인하니 보여줄 필요가 없는 메시는 GameObject를 꺼버리고, 사용하게 되면 켜도록 처리했는데 여기에서 시간을 꽤 먹고있었다. 애초에 Marching Cubes는 스칼라 필드가 모두 1인경우 메시가 없으므로, 이 경우엔 액티브를 끄지 않고, mesh를 클리어 하는 방향으로 수정해보았다.게임 오브젝트를 켜고 끄는 처리만..
메시를 만들고 나서 Normal 값을 생성하도록 후처리 과정을 추가했다. normal값도 미리 룩업테이블에 두고 사용할 수 있을지 기대해봤지만, 기울기가 일정하지 않기 때문에 실시간으로 처리하는게 자연스러워서 실시간 처리로 수정했다. Cube에 MeshCollider를 추가했다. 그 외에도 테스트용으로 렌더러와 콜라이더를 끌 수 있는 기능을 추가했다. 이는 #if UNITY_EDITOR로 감쌌기 때문에 혹시나 빌드를 했을 때 코드가 노출되지 않도록 처리했다.Cube는 생성될 때 부모 transform을 null로 해둬서 최상위 부모로 올라가기 때문에 부모를 설정할 수 있도록 코드를 수정했다.그 외에도 마칭큐브 연산할 때 매번 생성되는 리스트를 캐싱하는 등 짜잘하게 최적화를 했다. 테스트 할때마다 중복되는..
기존에는 큐브에 버텍스 값과 인덱스를 넣을 때 배열을 넣어줘야 해서 ToArray 함수로 배열을 따로 만들었었는데, SetVertices, SetTriangles 함수로 넣으면 List를 넣을 수 있어서 넣어줬다.SetTriangles를 넣을 때 SubMesh라는 파라미터를 넣어야 했는데, 이는 큰 메시 하나가 여러개의 머터리얼로 사용할 때, 어떤 머터리얼을 사용할 것인지를 의미했다. 즉 사용할 머터리얼의 인덱스를 넣어줘야 했는데, 지금은 하나의 머터리얼만 사용해서 0을 넣어줬다. 큐브에 직접 접근해서 값을 수정하는게 좋지 않아 보여서 Generator 스크립트를 추가했다. 이제 무조건 이 Generator를 통해서만 큐브를 생성할 수 있도록 처리했다.Generator의 경우 컴포넌트일 필요가 없어서 M..
내가 구현한 Marching Cubes 알고리즘에서 몇가지 구멍이 있었다. 일단 스칼라 값이 인근 버텍스에도 영향을 줘야 한다는 것을 알고 있었으면서 정작 y축은 그렇지 않게 만들었다. 그리고 버텍스가 없으면 렌더링이 되면 안되는데, 예외처리를 잘못해서 버텍스가 없어도 렌더링이 되고있었다(Unity의 GameObject가 꺼지지 않고 있었다).그래서 밑에 잔상같은게 남는 문제가 있었는데 렌더링을 막아서 해결했고, 파도 모양이 이상하게 나오는것도 수정했다.이제 렌더링이 되니까 노이즈로 지형생성을 해보자. 수정 전 수정 후
아스트로니어를 플레이하는데 실시간으로 지형에 변화를 주는게 너무 신기하고 재미있어 보였다. 그래서 전통적인 복셀 그래픽은 아니지만, Marching Cubes 알고리즘으로 복셀 그래픽을 구현해보려고 한다.현재로써는 Marching Cubes 알고리즘을 이해했고, 만들어내는데까지 성공했다. 내 목표는 런타임중에 지형을 파거나 쌓아 올려보는것과 동굴이나 절벽같은 지형을 의도한 대로 생성하는 것까지 구현하는 것이다. 현재는 Marcing Cubes 알고리즘을 이해해서 실제로 구현까지 했는데, 지금까지 가볍게 기록한 내용을 공개하는게 좋겠다 싶어서 그간 짧게 기록해둔 내용과 앞으로 개발하는 과정을 글로 적어볼 예정이다.