モデルにネギを持たせてみたところ、立っている時は概ね正しい位置にネギがあるのですが、
動いたときにネギの位置がおかしくなります。
具体的には次の動画のようになります。
現状のコードと読み込むファイルなども公開しておきます。↓
www13097uf.sakura.ne.jp/3dgame_backup/20160413_stageeditor_negi_zure_debug.zip
パスにステージエディタとありますが、これはステージエディタを作っていたらゲーム本体と切り離せなくなった名残。
この現状に関係ありそうな部分のコードをここに載せておきます。
Charaクラスは操作可能な自分のキャラを表すクラスです。
以下のコードはCharaクラスのコンストラクタで、ここで武器(ネギ)のモデルの読み込みと、
アタッチする左手首のフレームの番号を取得し、メンバ変数に保存しています。
Chara::Chara(string pModelPath, VECTOR pCharaPosition)
{
mModelHandle = MV1LoadModel(pModelPath.c_str());
mCharaPosition = pCharaPosition;
//自キャラは初期状態で奥を向いている
mTargetMoveDirection = VGet(0.0f, 0.0f, 1.0f);
★省略
//武器(ネギ)関係
mWeaponModelHandle = MV1LoadModel("Accessory\\negi.x");
mWeaponAttachFrameNum = MV1SearchFrame(mModelHandle, "左手首");
}
最後で武器(ネギ)をアタッチするフレームのローカル→ワールド変換行列を取得すしメンバ変数に入れています。
//WinMainのメインループから毎フレーム呼ばれる
//自キャラについての更新処理(自キャラ操作の入力処理、それに伴う座標移動)を行う
void Chara::update()
{
VECTOR moveVector = processInput();
//キャラステートごとの入力処理メソッドを呼び出す
CharaState *newState = mCharaState->processInput(moveVector);
if (newState != nullptr)
{
delete mCharaState;
mCharaState = newState;
//新しいキャラステートについて入口処理を呼び出す
mCharaState->enter(this);
}
//各ステートごとのupdate処理を呼び出している
newState = mCharaState->update(&moveVector);
if (newState != nullptr)
{
delete mCharaState;
mCharaState = newState;
//新しいキャラステートについて入口処理を呼び出す
mCharaState->enter(this);
}
/*
newState = mCharaState->move(this, moveVector);
if (newState != nullptr)
{
delete mCharaState;
mCharaState = newState;
//新しいキャラステートについて入口処理を呼び出す
mCharaState->enter(this);
}
*/
newState = gCollision->collMove(this, moveVector);
if (newState != nullptr)
{
delete mCharaState;
mCharaState = newState;
//新しいキャラステートについて入口処理を呼び出す
mCharaState->enter(this);
}
//自キャラの向きに関する処理
angleProcess();
//自キャラのアニメーションに関する処理
animProcess();
//武器をアタッチするフレームのローカル→ワールド変換行列を取得する
mWeaponFrameMatrix = MV1GetFrameLocalWorldMatrix(mModelHandle, mWeaponAttachFrameNum);
}
void Chara::draw()
{
MV1SetPosition(mModelHandle, mCharaPosition);
MV1SetScale(mModelHandle, mModelScale);
MV1DrawModel(mModelHandle); //★後で戻す
//武器(ネギ)の描画
//拡大行列などを使わないといけない
MATRIX newWeaponFrameMatrix = MMult(MGetScale(mWeaponScaleVec), mWeaponFrameMatrix);
MV1SetMatrix(mWeaponModelHandle, newWeaponFrameMatrix);
MV1DrawModel(mWeaponModelHandle);
}
また、ネギの位置がずれる現象に何か心当たりのある方はおられないでしょうか。
ご教授願います。
また、コード全体はステートパターンで実装しており、実行中に1を押すとステージエディタ用のコンソールが表示されます。
実行中に0を押すと、ステージエディタ用ではないコンソールが表示されます。
このときにhdと入力してエンターで、カプセルやらデバッグ用のポリゴンやらを消すことができます。
そのあとに同様のことをするとまたもとに戻ります。