移動途中にキャラクターが消える

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

移動途中にキャラクターが消える

#1

投稿記事 by fab » 14年前

敵キャラをステージのボーンに沿って移動させるようにしたかったのですが、うまくいきません。
pointbonecntにボーンの数を入れ、pointbonenumには今いる地点のボーン番号、tg_num に次の目的地ボーン番号を入れて、pointbonenumがボーン数と同じになったら1に戻す(ループさせる)としたかったのですが、なぜかループした瞬間(pointbonenumが1に戻った瞬間)キャラクタが消えてしまいました。(x座標を表示してみたところ、ありえない数になっていました)
コードはこちらです。

コード:

 void c_enemy::Check(){
	cnt++;
//------------
// 移動関係
//------------	
	
	move_v = VGet( 0.0f,0.0f,0.0f );
	int tg_num = pointbonenum+1;
	if(tg_num >= pointbonecnt) tg_num=1;
	VECTOR tg_v = MV1GetFramePosition( PointBoneHandle, tg_num );
	a=tg_num;
	float a = tg_v.x - enemy_v.x;
	float b = tg_v.z - enemy_v.z;
	v = VNorm(VGet( a, 0.0f, b )); //姿勢ベクトル登録(現在地から目標地へのベクトル)
	if(sqrt(a*a+b*b)<2.0f){ //キャラが目標地にたどりついたら
		move_v = VScale( v, sqrt(a*a+b*b) );
		//enemy_v = MV1GetFramePosition( PointBoneHandle, tg_num );
		pointbonenum = tg_num;
	}else{ ////キャラが目標地にたどりつかなかったら
		move_v = VScale( v, 2.0f );
	}

	//向き設定
	float TargetAngle ;			// 目標角度
	float SaAngle ;				// 目標角度と現在の角度との差

	// 目標の方向ベクトルから角度値を算出する
	TargetAngle = (float)(atan2( v.x, v.z ) + PI);
	// 目標の角度と現在の角度との差を割り出す
	// 最初は単純に引き算
	SaAngle = TargetAngle - yaw;
	// ある方向からある方向の差が180度以上になることは無いので
	// 差の値が180度以上になっていたら修正する
	if( SaAngle < -PI ){
		SaAngle += (float)PI*2;
	}else if( SaAngle > PI ){
		SaAngle -= (float)PI*2;
	}
	// 角度の差が0に近づける
	if( SaAngle > 0.0f ){
		// 差がプラスの場合は引く
		SaAngle -= 0.5f;
		if( SaAngle < 0.0f ){
			SaAngle = 0.0f;
		}
	}else{
		// 差がマイナスの場合は足す
		SaAngle += 0.5f;
		if( SaAngle > 0.0f ){
			SaAngle = 0.0f;
		}
	}
	yaw = TargetAngle - SaAngle; // モデルの角度を更新
	
	/*
	if(Key[KEY_INPUT_LEFT]==1){
		pointbonenum--;
		if(pointbonenum == 0) pointbonenum=pointbonecnt-1;
	}
	if(Key[KEY_INPUT_RIGHT]==1){
		pointbonenum++;
		if(pointbonenum == pointbonecnt) pointbonenum=1;
	}
	int tg_num = pointbonenum+1;
	if(tg_num >= pointbonecnt) tg_num=1;
	a=tg_num;

	VECTOR tg_v = MV1GetFramePosition( PointBoneHandle, tg_num );
	float a = tg_v.x - enemy_v.x;
	float b = tg_v.z - enemy_v.z;
	v = VNorm(VGet( a, 0.0f, b )); //姿勢ベクトル登録(現在地から目標地へのベクトル)
	//move_v = VScale( v, sqrt(a*a+b*b) );
	//move_v = VScale( v, 2.0f );
	//enemy_v = VAdd( enemy_v, move_v );
	enemy_v = MV1GetFramePosition( PointBoneHandle, tg_num );
	*/
	
	hit=Make_Sph(30.0f,enemy_v,1);//当たり判定作成
}

void c_enemy::Move(){

	mat = MGetScale(VGet(0.2f,0.2f,0.2f));//スケール

	//ロール
	zAxis = VGet(mat.m[2][0], mat.m[2][1], mat.m[2][2]);
	//Quaternion = Quaternion * CreateRotationQuaternion(roll, zAxis);
	//ピッチ
	xAxis = VGet(mat.m[0][0], mat.m[0][1], mat.m[0][2]);
	Quaternion = Quaternion * CreateRotationQuaternion(pitch, xAxis);
	//ヨー	
	yAxis = VGet(mat.m[1][0], mat.m[1][1], mat.m[1][2]);	
	//Quaternion = Quaternion * CreateRotationQuaternion(yaw, yAxis);

	matRot = QuaternionToMatrix(Quaternion);
	MATRIX m;
	m = MGetRotY( yaw ) ;
	matRot = MMult( matRot , m );
	mat = MMult( mat, matRot );//回転×スケール	
	//v = VTransform( norm_v , matRot );//姿勢ベクトル回転
	//v = VNorm( v );//姿勢ベクトル正規化
	enemy_v = VAdd( enemy_v, move_v );
	matTrans = MGetTranslate( enemy_v );
	mat = MMult( mat, matTrans );//移動×回転×スケール	
	MV1SetMatrix( EnemyHandle, mat );//行列セット

}


ちなみにコード55行目以降のように、座標を直接指定するとキャラが消えることはありませんでした。
どなたか原因が分かる方はいますでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 移動途中にキャラクターが消える

#2

投稿記事 by softya(ソフト屋) » 14年前

データと動くソースコードを頂けると検証できますのでお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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