D 언어로 DX 라이브러리를 사용하여 D 언어 군을 강림

여러분, 오늘은 무슨 날인지 아십니까?
그래, 예수 그리스도께서 이 세상에 탄생했다고 하는 크리스마스입니다.
그에 따라 크리스마스까지의 카운트다운 캘린더를 Advent(강림) Calendar라고 부르는 풍습이 기독교국에서 할 수 있었습니다.
그리고, 그 풍습이 엔지니어에게 발견되어 버린 결과, 12월은 다양한 것 "1" 「2」 가 강림하는 달이 되었습니다.
D 언어 Advent Calendar 도 그 중 하나입니다.
마지막 날인 오늘은 D 언어를 쓰고 D 언어 군을 강림합시다.

D언어군이란?



D 언어의 공식 마스코트입니다.
이런 모양을 하고 있습니다.


덧붙여서 일본어 번역판 사이트라면 트게토게인 거친 화상이 되고 있습니다.
D言語くん

D언어군은 D Ver.0.x 시대부터 존재하고 있기 때문에, 아마 나중에 본가가 고해상도로 바꿨다고 생각합니다.
아래의 D언어군이 일본에서 널리 알려진 분의 D언어군의 모습이군요.

3차원으로 된 D언어군



D언어군의 2차원 화상은 옛날부터 존재했지만,
다각형 모델은 오랫동안 없었습니다.
하지만 지난 주 당돌에 3D 모델이 탄생했습니다.

본을 넣어, 예의 포즈 취해 완성!
#D 언어 피 c. 라고 r. 코 m / 8 A T 카이 MBT — イ五 (@fifth_tea) December 18, 2013



모델도 Metasequoia 포맷(.mqo)과 Miku Miku Dance용 포맷(.pmd)으로 공개되고 있습니다. skydrive

이번에는 이것을 사용하여 D언어군을 강림시킵니다.

사용 라이브러리



첫 과제



Derelict3 에 포함되어 있는 Open Asset Import Library(Assimp3)GLFW3 를 사용해 구현하려고 했지만, 매우 큰 문제가 있었습니다.
  • .mqo 및 .pmd를 지원하지 않음
    무려 Assimp3는 일본에서 압도적인 아마추어 인기를 자랑하는 Metasequoia와 Miku Miku Dance를 지원하지 않습니다.
    Blender 등으로 COLLADA 또는 FBX로 내보내면 사용할 수 있지만 단지 번거로움 (포맷 변환이 만능이라고도하지 않습니다)
  • Assimp3→GLFW3 변환이 번거롭다
    Assimp3는 많은 모델 파일을 읽을 수 있습니다만, 읽는 것만으로 OpenGL등으로 표시하기 위해서는 한번 더 뚜껑 수고가 필요합니다.
    그렇게 되면 Assimp3와 GLFW3의 코드량이 늘어나 D언어의 기사는 없어지므로 이번은 그만두었습니다.
    이 기사를 작성하기로 결정한 것 자체가 5 일 전입니다.

  • 그래서 이번에는
  • 메타세쿼이아 형식도 Miku Miku Dance 모델도 읽을 수 있다
  • 고기능 API이므로 샘플 코드가 간단

  • DX 라이브러리 을 사용하여 D 언어 군을 표시합니다.
    D언어는 C언어와 바이너리 호환이므로, C언어제의 라이브러리를 제대로 만지면 D언어 프로그램 안에서 함수나 변수나 구조체를 사용할 수도 있습니다.
    이번은 羽流布 씨 가 공개하고 있는 D언어판 DX 라이브러리 3.11을 이용합니다. 벡터

    코드 작성



    처음 DX 라이브러리를 썼기 때문에 잘 모르겠지만 이런 코드로 MMD 모델을 표시할 수 있는 것 같습니다.
    PMD 파일과 VMD 파일은 미리 준비한 것을 두어 두면 한 줄로 읽을 수있는 것 같습니다. .

    main.d
    module main;
    import dx4d;
    import string;
    import std.file;
    
    void main()
    {
      int count, x, y;
    
      try
      {
        int mHandle;
        VECTOR Camera;
        dx_ChangeWindowMode(TRUE);
    
        if (dx_DxLib_Init() < 0 )
        {
          throw new Exception("DXライブラリの初期化に失敗");
        }
    
        if ((mHandle = dx_MV1LoadModel("data/Mr_D.pmd")) == -1)
        {
          throw new Exception("モデルの読み込みに失敗");
        }
    
        Camera.x = 0.0f;
        Camera.y = 10.0f;
        Camera.z = -20.0f;
    
        dx_SetBackgroundColor(0, 0, 255);
        dx_ClearDrawScreen();
        dx_SetCameraNearFar(1.0f, 150.0f);
        dx_SetCameraPositionAndTarget_UpVecY(Camera, dx_VGet(0.0f, 10.0f, 0.0f));
    
        if (dx_MV1AttachAnim(mHandle, 0, -1, FALSE) == -1)
        {
          throw new Exception("アニメーションの再生に失敗");
        }
        dx_MV1SetAttachAnimTime(mHandle, 0, 0.0f);
    
        if (dx_MV1DrawModel(mHandle) == -1)
        {
          throw new Exception("モデルの描画に失敗");
        }
    
        dx_WaitKey();
      }
      catch( Exception e )
      {
        std.file.write( "error.log", e.msg );
      }
      finally
      {
        dx_DxLib_End();
      }
    }
    

    할 수 있었습니다.


    쿠 ~ 피곤했습니다 w 이것으로 완결입니다!

    요약



    DX 라이브러리는 대단하다. 처음으로 그렇게 생각했다.

    좋은 웹페이지 즐겨찾기