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になったらシェイプキーの適応率の設定を終了する。

コメント