AY3の6畳細長部屋

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

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

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

シェイプキーとはオブジェクトの形状を記憶する機能のこと。これを使うことで表情の変化などができるようになる。シェイプキーを利用する場合当然ながらBlenderなどの3Dモデリングソフトなどで作成する必要がある。

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

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

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

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

宣言:int MV1SetShapeRate(int MHandle, int ShapeIndex, float Rate);
引数:int MHandle モデルのハンドル
   int ShapeIndex 有効率を設定するシェイプキーの番号

   float Rate 適応率(0.0f~1.0f)
戻り値: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;

追加した変数の初期化を書き加える。

//初期化
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;
		}

		//ShapePlayFlagの切り替え
		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になったら設定を終了する。

シェイプキーの番号の取得について、DxLibModelViewerを見れば番号はわかるのだがシェイプキーを追加するたびに番号がずれるためシェイプキーの名前から検索して取得する方がずれを気にしなくていいので楽。

最後にPlayer.hに今回追加した関数を加える。

Player.h

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

3Dゲーム制作まとめページに戻る

モバイルバージョンを終了