유니티로 glTF 적재기를 만들지 않았어요.

5275 단어 UnityC#glTF

입문


이 글은 만고 고급 달력 2019 의 11일째 글입니다.
만고는 니코니코 요금 계산 시스템을 개발하고 있다.
유료 관계를 접할 수 있었으면 좋겠어요. 그런데 평소에 취미로 Unity+C#
이번에는 저쪽에 관한 보도입니다.
간단한 glTF 캐리어 제작 방법 등을 설명하는 기사가 있었지만 복잡한 모형을 묘사한 기사는 찾지 못했다
고전을 많이 해서 남았다.그것은 비망록이다.
Qiita 기사는 도만고에 오기 전까지는 비공개 기사로만 공유되기 때문에 다른 기사에 비해 읽기 어렵습니다. 따뜻한 시선으로 지켜봐 주세요.

왜 하지?


VR을 위한 화신 형식인 VRM은 glTF를 기반으로 하기 때문에 glTF 자체에 관심이 있습니다.
만질 기회가 없고 말랑말랑함만 이해했기 때문에 참고해서 직접 만들어 보고 싶어요.
(VRM의 로드 시간을 최적화하려는 경우도 있습니다.)

실제로 한 일


GLB 처리


GLB 파일의 바이트 그룹을 Span으로 설정하고 제목 부분을 Slice, MemoryMarshal 로 Cast를 설정하여 구조체로 처리합니다.
유니티라도 System.Memorynuget에서 떨어뜨리면 사용할 수 있으니 꼭 사용하세요.
var headerSpan = glbSpan.Slice(0, Marshal.SizeOf<Format.GLBHeader>());
var header = MemoryMarshal.Cast<byte, Format.GLBHeader>(headerSpan)[0];
블록을 처리할 때 MemoryMarshal 처리를 통해 처리 속도에 거의 신경을 쓰지 않고 구조체로 배열하여 처리할 수 있다.
이때 격식의 종류JSONBIN의 판정은 int로 처리하면 1byte마다 ASCII 판정(즉, enum로 판정할 수 있음)을 사용하지 않아도 되기 때문에 격식부는 int로 진행하는 것을 권장한다.
JSON: 0x4e4f534a
BIN:  0x004e4942

glTF의 JSON 부서 처리


mebiusbox/gltf(Github) 공개된 다음 그림을 참고하여 해상도를 설치했습니다.

처음에는 glTF의 json 구조를 읽으면서 실시했는데 이 빠른 참고 덕분에 쉽게 진행되었습니다.

메쉬 처리

Primitive를 수조로 격자에 저장하여 순환 방식으로 처리한다.Primitive = Unity에서 말하는 하위 메쉬를 나타냅니다.
버전을 몇 분 먼저 확보해야 하지만 첫 번째 위치수 *Primitive 수로 초기화했습니다.
여기에는 이 표준 스토리지 PositionNormal, TexCoord0 가 있습니다.Indices Primitive 수 분의 플러그 그룹을 초기화하고 각각 저장합니다.
실제로 Unity의 격자를 사용할 때 subMeshCount 에서 Primitive 의 수량을 설정했고 SetTriangles 방법에서 Indices 를 설정했다.
var umesh = new Mesh
{
    vertices = position,
    normals = normal,
    uv = texcoord0.ToArray(),
    subMeshCount = mesh.Primitives.Count
};

for (var i = 0; i < mesh.Primitives.Count; i++)
    umesh.SetTriangles(indices[i], i);
직접 그리면 좌표계에 따라 디스플레이가 좌우로 반전되므로 변환이 필요합니다.
여기서 변환해야 하는 것은 PositionNormal (Tangent는 VRM 사양에 포함되지 않으므로 생략됨)
위치의 x 좌표를 간단하게 반전시키고 Indices를 Vector3로 간주한 상태에서 X 좌표와 Z 좌표를 교체합니다.

곤란한 일


오른손 좌표를 왼손 좌표로 변환할 때 Span의 성능


접근기의 값 그룹을 얻기 위해 공백을 사용하여 속도를 높이려고 시도했지만 다시 쓸 때 성능이 좋지 않았습니다
(1000 사이클 약 3000ns)MemoryMarshal.Cast에 출연float한 뒤에도 이 자리에 글을 쓰는 등 성능이 전혀 좋아지지 않아 머리를 안았다.
그 결과 현재 단원의 .NET Standard 버전은 2.0으로 운행 시 최적화되지 않아 성능이 떨어지기 때문에 이를 일반 수조로 하고 바늘로 만지작거리며 성능을 향상시켰다.
따라서 사전에 일정한 무더기를 확보하고 그곳에 유지함으로써 고속화할 수 있다.

총결산


실제 자신의 손으로 적재기를 만들어 glTF 자체와 유니티의 묘사 주변 등을 알 수 있다.
바퀴의 재발명이지만 성능 조정을 포함한 다양한 지식을 얻었기 때문에 상당히 긍정적이다.
아직 전체를 이루지 못했기 때문에 완성된 후에 코드를 포함한 상세한 보도를 쓰고 싶습니다.

좋은 웹페이지 즐겨찾기