モデルにアタッチしたネギの位置がずれる

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
みや

モデルにアタッチしたネギの位置がずれる

#1

投稿記事 by みや » 9年前

DXライブラリで3Dアクションゲームを作っています。

モデルにネギを持たせてみたところ、立っている時は概ね正しい位置にネギがあるのですが、
動いたときにネギの位置がおかしくなります。
具体的には次の動画のようになります。


現状のコードと読み込むファイルなども公開しておきます。↓
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, "左手首");
}
次のコードはCharaクラスの更新関数です。ここで自キャラに関する入力処理やアニメーションに関する処理を行っています。
最後で武器(ネギ)をアタッチするフレームのローカル→ワールド変換行列を取得すしメンバ変数に入れています。

コード:

//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);
}
Charaクラスの描画関数です。自キャラのモデルを描画した後、武器(ネギ)を描画しています。

コード:

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と入力してエンターで、カプセルやらデバッグ用のポリゴンやらを消すことができます。
そのあとに同様のことをするとまたもとに戻ります。

みや

Re: モデルにアタッチしたネギの位置がずれる

#2

投稿記事 by みや » 9年前

自己解決しました!
原因はMV1GetFrameLocalWorldMatrixを呼んだ後にMV1SetPositionやMV1SetScaleを呼んでいたからでした。
MV1SetPositionとMV1SetScaleをMV1GetFrameLocalWorldMatrixの前に移したところ、ズレがなくなりました。
お騒がせしました。

閉鎖

“C言語何でも質問掲示板” へ戻る