【DXライブラリ】シェイプキーの設定をする

DXライブラリとC言語でゲーム制作。今回はシェイプキーの設定について。表情の変化をさせたい場合などにシェイプキーを使います。

DXライブラリにシェイプキーそのものを作る機能はないので3Dモデリングソフト(Blenderなど)で作る必要があります。

シェイプキーの設定をしたい

シェイプキーとはオブジェクトの形状を記憶する機能のこと。これを使うことで表情の変化などができるようになる。DXライブラリにはシェイプキーそのものを作る機能はないのでBlenderなどの3Dモデリングソフト(Blender)などで作成する必要がある。

作成したシェイプキーを確認する場合はDxLibModelViewerを開き、「シェイプ」タブから確認する。No.*の横の名前が各シェイプキーの名前。有効率のバーを動かすことで変化を確認できる。

シェイプキーの確認

コード上でシェイプキーを設定する場合はまず MV1SearchShape() で設定したいシェイプキーの番号を取得する。

宣言 int MV1SearchShape(int MHandle, char *ShapeName);
概要 指定名のシェイプキーをモデルから検索する
引数 int aMHandle モデルのハンドル
char *ShapeName 検索するシェイプキーの名前
戻り値 0以上 指定名のシェイプキーの番号
-2 指定名のシェイプキーが見つからなかった
-1 エラー発生

シェイプキーの番号をメモって下で紹介する関数で直接指定してもいいが、シェイプキーを追加するたびに番号がずれるためシェイプキーの名前から検索して取得する方法をここでは採用している。

そして MV1SetShapeRate() で指定のシェイプキーの設定をする。

宣言 int MV1SetShapeRate(int MHandle, int ShapeIndex, float Rate);
概要 シェイプキーの適用率を設定する
引数 int MHandle モデルのハンドル
int ShapeIndex 適応率を設定したいシェイプキーの番号
float Rate 適応率。0.0f(0%) ~ 1.0f(100%)
戻り値 0 成功
-1 エラー発生

シェイプキーによる形状変化は処理が重めなのでスマホ・低スペックのPCの場合は注意。

サンプルコード

それでは実装。

まずDefine.hにシェイプキーの適応率変化パターンの列挙体を追加する。

Define.h

//シェイプの適応率の変化パターン列挙体
typedef enum {
	SHAPE_NONE, //シェイプの有効率をデフォルト(0)にする
	SHAPE_PLAY, //シェイプの有効率を1.0fに近づける
	SHAPE_REVERSE, //シェイプの有効率を0.0fに近づける
	SHAPE_STOP //シェイプの有効率の更新を止める
}ShapeChangeType;

extern ShapeChangeType shapechangetype;

続いてPlayerの構造体にシェイプキー関連の変数を追加する。

Player.cpp

//プレイヤーの構造体
typedef struct {
  //以下を追加
  float ShapeRate; //シェイプキーの有効率
  int ShapeChangeMode; //シェイプキーの有効率変化タイプ
}player_t;

シェイプキー関連の処理を追加していく。

Player.h

//以下を追加
void Player_ShapeChange();
void Player_Shape();

Player.cpp

//初期化関数に以下のコードを追加
void Player_Initialize() {
  //中略

  //シェイプキーの有効率初期化
  player.ShapeRate = 0.0f;

  //シェイプキーの有効率変化パターンの初期化
  player.ShapeChangeMode = SHAPE_NONE;
}

//シェイプキーの設定
void Player_ShapeChange() {
  int ShapeIndex = -2;

  //指定のシェイプの番号をモデル中から検索する
  ShapeIndex = MV1SearchShape(player.ModelHandle, "(設定したいシェイプキーの名前)");

  //指定のシェイプキーがあれば適応率を変更する
  if (ShapeIndex >= 0) {
    //適応率を変更
    switch (player.ShapeChangeMode) {
    case SHAPE_NONE:
      player.ShapeRate = 0;
      break;
    case SHAPE_PLAY:
      player.ShapeRate += 0.1f;
      break;
    case SHAPE_REVERSE:
      player.ShapeRate -= 0.1f;
      break;
    case SHAPE_STOP:
      break;
    default:
      break;
    }

    //ShapeChangeModeの切り替え
    if (player.ShapeRate > 1.0f) {
      player.ShapeRate = 1.0f;
      player.ShapeChangeMode = SHAPE_REVERSE;
    }
    else if (player.ShapeRate < 0) {
      player.ShapeRate = 0;
      player.ShapeChangeMode = SHAPE_NONE;
    }

    //シェイプキーの適応率を設定
    MV1SetShapeRate(player.ModelHandle, ShapeIndex, player.ShapeRate);
  }
}

//シェイプキーの更新
void Player_Shape() {
  //エンターキーが押されたらシェイプキーの設定開始
  if (Input_GetKeyboardDown(KEY_INPUT_RETURN)) {
    player.ShapeChangeMode = SHAPE_PLAY;
  }

  if (player.ShapeChangeMode > SHAPE_NONE) Player_ShapeChange();
}

//更新
void Player_Update() {
  //中略

  //シェイプキーの設定をする関数を最後に追加
  Player_Shape();
}

キーボードのEnterキーが押されたら指定のシェイプキーの適応率の設定を開始。0.0fから適応率を増やしていき、1.0fになったら今度は減少させ、0.0fになったらシェイプキーの適応率の設定を終了する。

コメント

タイトルとURLをコピーしました