3Dゲーム モデルに武器を持たせる方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
ptolemy
記事: 258
登録日時: 12年前

3Dゲーム モデルに武器を持たせる方法

#1

投稿記事 by ptolemy » 11年前

僕は、DXライブラリを使って3Dゲームを作っているんですがモデルに武器を持たせる方法についてなやんでいます。
それはなにかというと、普通、3Dモデルに武器を持たせる場合は、
モデリングソフトで武器のモデルとプレイヤーのモデルを武器を持った状態にして、一つのモデルとしてうごかす。
それか、
あらかじめ、プレイヤーのモデルを武器を持つ手の形にしておいて、プログラミングでプレイヤーの手の位置に合うように武器を設置する。
のかまたは、他なのかわかりません。
普通どういった方法で武器をもたせますか?

また、武器を入れ替えるときは、武器をもったモデル自体を入れ替えるのか武器だけを入れ替えるのかわかりません。

説明が下手なのでしっかり伝わっていないかもしれないですが、ご回答

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

Re: 3Dゲーム モデルに武器を持たせる方法

#2

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

手のボーンのマトリックスを毎フレーム得て、そこに武器をくっ付けるのが多いパターンじゃないでしょうか。
そうすれば腕のアニメーションに勝手にくっ付いて動きます。
持つ手の形は、はじめからアニメで用意しておくしか無いでしょうね。

過去ログ参考。
「ボーン(DXLibでいうフレーム)に武器を取り付ける方法 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=9331
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 12年前

Re: 3Dゲーム モデルに武器を持たせる方法

#3

投稿記事 by ptolemy » 11年前

参考に作ってみました。

コード:

int PLAYER ;    // キャラクターモデル
int M92F ;  // アクセサリーモデル
int RightHandFrameNo ;
MATRIX RightHandMatrix ;
PLAYER = MV1LoadModel( "高校生.x" ) ;
M92F= MV1LoadModel( "M92F.pmd" ) ;

SetDrawScreen( DX_SCREEN_BACK ) ;

// メインループ
while(~~){
	ClearDrawScreen() ;
	RightHandFrameNo = MV1SearchFrame( PLAYER, "NewJoint24_Joint" ) ;

	RightHandMatrix = MV1GetFrameLocalWorldMatrix(PLAYER, RightHandFrameNo ) ;

	MV1SetMatrix(M92F, RightHandMatrix ) ;

	MV1DrawModel(M92F) ;
        MV1DrawModel(PLAYER) ;
}
このようにしてみたんですが、何の変化もありません。
関数の戻り値を確認しましたがすべて成功と出ました。
なにか間違いは、ありますか?

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

Re: 3Dゲーム モデルに武器を持たせる方法

#4

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

> このようにしてみたんですが、何の変化もありません。
変化がないとは? 元の状態がわからないので変化がないという結果の意味が分かりません。
得られているマトリクスがどういう代物なのか確認をお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 12年前

Re: 3Dゲーム モデルに武器を持たせる方法

#5

投稿記事 by ptolemy » 11年前

すみません。
元の状態というか現状をお伝えします。

モデルは、以前お渡しした、学生のモデルです。
それで、そのモデルの右手のフレームを取得して、
武器のpmdのモデルを取り付けようとしたのですが、武器自体が、
描画されていなく、戻り値も成功になってます。

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

Re: 3Dゲーム モデルに武器を持たせる方法

#6

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

マトリクスの方を確認してみてください。
マトリクス使って(0,0,0)座標を変換してDrawFormatStringなどで表示すれば銃が移動した座標が分かるはずです。
※ 確認方法を自分であみ出さないと何時まで経っても自分でデバッグできませんよ。

【補足】
3D関係の回答をしてくれる人はもともと少ないのと、長いコードを追いかけるのは至難の業なので、結局一人でやらないといけなくなります。
今のうちに準備しましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 12年前

Re: 3Dゲーム モデルに武器を持たせる方法

#7

投稿記事 by ptolemy » 11年前

マトリクスについてよく理解していないんですが、少し教えてもらえませんか?

過去トピック
http://dixq.net/forum/viewtopic.php?f=3&t=10136

を少し見たのですが
マトリクスとは、座標や拡大率等の多くの情報を扱えるint,float同様の型ですか?

また、上のプログラムは、

アクセサリの装備
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=2064

こちらのサイトを参考にしながら書いたので、マトリクス自体は理解していません。

また、高校ではないので、行列についてさっぱりです。

マトリクスとは、なんなのかということと
行列からXYZ座標に変換する方法が理解出来ないです。

かなり、分からないことばかりで申し訳ありません。

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

Re: 3Dゲーム モデルに武器を持たせる方法

#8

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

行列計算を覚えなくても、行列(マトリクス)の計算関数は利用できます。
ようは3Dゲームに限定した使い方を覚えれば良いだけです。

[超基本] 座標 * マトリクス = 移動・回転・拡縮した後の座標
ベクトル=座標として扱えますので、 
ベクトル=座標をVTransformすれば、変換後の座標が得られます。
http://homepage2.nifty.com/natupaji/DxL ... tml#R11N12

マトリクスの掛け算とか、ローカル座標系、ワールド座標系の話はまた別の機会に。

実際には高校数学なので原理まで知ると難しいでしょう。なので飛ばします。
まぁ、高校でも普通科の進学クラスにならないとやらないみたいですけどね。高専などはまた別。
高校でもやらなかったら自力でやるしか無いわけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 12年前

Re: 3Dゲーム モデルに武器を持たせる方法

#9

投稿記事 by ptolemy » 11年前

すみません。僕の理解力が足りないだけなのですが、
ベクトル=座標をVTransformについて、
この関数は、 座標 * マトリクス = 移動・回転・拡縮した後の座標 の処理を行ってくれる関数なのですか?

引数は、サンプルをみると、
VECTOR Vect ;に座標をいれ、
Vect = VTransform( Vect, Matrix ) ;
とあるんですが、この座標は、なんの座標ですか?
僕は、
RightHandMatrix = MV1GetFrameLocalWorldMatrix(PLAYER, RightHandFrameNo ) ;
として、Setで右手のフレームの座標にセットとしているのでサンプルにVectになんの座標
を入れればいいのかさっぱりです。

また、変換前の座標と変換後の座標の違いがわかりません。


意味がわかりずらい質問もありますがよろしくお願いします。

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

Re: 3Dゲーム モデルに武器を持たせる方法

#10

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

はじめから分かる人はいません。色々試せばよいのです。
知らないなら片っ端から試して、よく分からければ質問すべきです。
数学を知らずに感覚で理解するのは、それが一番だと私は思います。
あと、DXライブラリ置き場にある3Dサンプルでの使い方とかリファレンスの使い方を参考にするのは基本です。
3D関数の機能の殆ど知らずにゲームを実装するのは無理がありますよ。
「補足」 大事なのは理科・科学の実験と同じで、実験前の予測・実験結果の検証・予測とズレた場合の原因の追求です。そして再び実験。

ちなみに、座標がどう変換されるか知りたいわけですから原点を使います。
VGet( 0.0f, 0.0f, 0.0f ) ;
って事です。
銃が何処に消えたか調べたいんですよね? これは、銃が何処の座標に移動したかを調べる行為です。

>この関数は、 座標 * マトリクス = 移動・回転・拡縮した後の座標 の処理を行ってくれる関数なのですか?
はい。

>とあるんですが、この座標は、なんの座標ですか?
引数にマトリクスで変換したい座標かベクトルを入れます。それ以上の意味は無いですよ。返り値はマトリクスで計算(トランスフォーム)された座標かベクトルです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 12年前

Re: 3Dゲーム モデルに武器を持たせる方法

#11

投稿記事 by ptolemy » 11年前

すみませんでした。これからは、わからないものが出たらまずは、
試して、それでもわからなかったら質問したいと思います。

一応、座標をだしました。
(0.0f,0.0f,0.0f)からの移動したあとの座標を調べました。

武器の移動後の座標(-136,2109,-521)
プレイヤー座標(20,0,200)
でした。

手は、プレイヤーの座標に近いと思うのですが、座標が離れていますね。
でも、回転してみると、座標が近くなったりする時があったりしますね。

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

Re: 3Dゲーム モデルに武器を持たせる方法

#12

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

拡大していませんでしたっけ? それが原因かもしれませんが、それにしてもYの高さが高いですね。こんなに拡大してましたか?

「追記」
表示実験するので、コードを合わせたいと思います。
シンプルな表示のコードをお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 12年前

Re: 3Dゲーム モデルに武器を持たせる方法

#13

投稿記事 by ptolemy » 11年前

了解しました。

拡大は、プレイヤーのモデルですか?それとも武器のモデルですか?
一応、どちらも1.0倍にしていたと思います。

アバター
ptolemy
記事: 258
登録日時: 12年前

Re: 3Dゲーム モデルに武器を持たせる方法

#14

投稿記事 by ptolemy » 11年前

整理してみました。
前回に比べてインデントをしっかりしたつもりですが、また変でしたらすみません。

こちらがプログラムです。

コード:

#include"DXLib.h"
#include"keybord.h"キーボードのヘッダ
#include<math.h>

	struct	STAGE{
			float	X,Z;
	}stage={20,0};

	struct	Player{
		float	X,Y,Z,angleY;
	}player={20,0.0f,200,0};

	struct	Camera{
		float	X,Y,Z,High;
	}camera={0,0,0,150.0f};


	static	float	cursor_x,cursor_y,cursor_z=150.0f;
	static	int	STAGE,PLAYER,Light,M92F;//3Dモデルの読み込み
	static	int	RightHandFrameNo;

	MATRIX	RightHandMatrix;
	VECTOR	Vect;

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){

	ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);

	
	STAGE=MV1LoadModel("GAME/ネオUKシティ/model/ネオUKシティ.x");
	PLAYER=MV1LoadModel("GAME/高校生.x");//プレイヤー
	M92F=MV1LoadModel("GAME/Beretta/M92F.pmd");//M92F ピストル読み込み
	Light=CreatePointLightHandle(VGet(stage.X,1000.0f,stage.Z),5000.0f,0.0f,0.002f,0.0f);

	camera.X = player.X;
	camera.Y = 2600;
	camera.Z = player.Z - 2394;
	cursor_x = player.X;
	cursor_z = player.Z - 568;
	cursor_y = 2420;
 
    //カメラの範囲
    	SetCameraNearFar( 2.0f, 1000000.0f );

//メインループ
while(ScreenFlip()==0&&ProcessMessage()==0&&ClearDrawScreen()==0){


///////////////
//武器の装備//
/////////////

	//フレーム検索
		RightHandFrameNo=MV1SearchFrame(PLAYER,"NewJoint24_Joint");

	// キャラクターモデルの右手フレームの行列を取得
		RightHandMatrix=MV1GetFrameLocalWorldMatrix(PLAYER,RightHandFrameNo);

	// キャラクターモデルの右手フレームの行列をアクセサリモデルの行列としてセットしてから描画
		MV1SetMatrix(M92F,RightHandMatrix);
	
	//移動前の座標
		Vect=VGet(0.0f,0.0f,0.0f);

		Vect=VTransform(Vect,RightHandMatrix);

		SetCameraPositionAndTarget_UpVecY(VGet(camera.X,camera.Y,camera.Z),VGet(cursor_x,cursor_y,cursor_z));//カメラが向く座標を指定

		MV1SetPosition(STAGE,VGet(stage.X,400.0f,stage.Z));//ステージの位置
		MV1SetPosition(PLAYER,VGet(player.X,player.Y,player.Z));//プレイヤーの位置

		MV1SetRotationXYZ(PLAYER,VGet(0.0f,player.angleY,0.0f));//プレイヤーの方向

		MV1SetScale(STAGE,VGet(1000.0f,1000.0f,1000.0f));//ステージの倍率
		MV1SetScale(PLAYER,VGet(1.0f,1.0f,1.0f));//プレイヤーの倍率

		SetLightPositionHandle(Light,VGet(stage.X,1000.0f,stage.Z));//ライトの位置

	//3Dモデルの描画
		MV1DrawModel(STAGE);//ステージ
		MV1DrawModel(PLAYER);//プレイヤー
		MV1DrawModel(M92F);//武器
	
	// Vect の値を画面に表示
		DrawFormatString(0,360,GetColor(255,255,255),"Vect x=%f y=%f z=%f",Vect.x,Vect.y,Vect.z);
		DrawFormatString(0,380,GetColor(255,255,255),"Player x=%f y=%f z=%f",player.X,player.Y,player.Z);


	//ESCキーで終了
	if(keybord_Get(KEY_INPUT_ESCAPE)>0){
		break;
	}
}

	ClearDrawScreen();
	DxLib_End();
	return	0;
}

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

Re: 3Dゲーム モデルに武器を持たせる方法

#15

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

銃のデータが見当たらなかったので、主人公を手の位置にくっつけてみました。
ちゃんと手の位置に出現します。なので、元々の銃の座標が原点にないなどの問題があるか、手の方向と合っていないかなど別の原因だと思います。
あと主人公の座標を設定しないうちに、MV1GetFrameLocalWorldMatrix()すると座標が正しくないので注意して下さい。
インデントも、こんな感じを希望します。

コード:

#include"DXLib.h"
#include"keybord.h"キーボードのヘッダ
#include<math.h>

struct  STAGE {
	float   X, Z;
} stage = {20, 0};

struct  Player {
	float   X, Y, Z, angleY;
} player = {20, 0.0f, 200, 0};

struct  Camera {
	float   X, Y, Z, High;
} camera = {0, 0, 0, 150.0f};


static  float   cursor_x, cursor_y, cursor_z = 150.0f;
static  int STAGE, PLAYER, PLAYER2, Light, M92F; //3Dモデルの読み込み
static  int RightHandFrameNo;

MATRIX  RightHandMatrix;
VECTOR  Vect;

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) {

	ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );


	STAGE = MV1LoadModel( "GAME/ネオUKシティ/model/ネオUKシティ.x" );
	PLAYER = MV1LoadModel( "GAME/高校生.x" ); //プレイヤー
	PLAYER2 = MV1LoadModel( "GAME/高校生.x" ); //プレイヤー
	M92F = MV1LoadModel( "GAME/Beretta/M92F.pmd" ); //M92F ピストル読み込み
	Light = CreatePointLightHandle( VGet( stage.X, 1000.0f, stage.Z ), 5000.0f, 0.0f, 0.002f, 0.0f );

	camera.X = player.X;
	camera.Y = 2600;
	camera.Z = player.Z - 2394;
	cursor_x = player.X;
	cursor_z = player.Z - 568;
	cursor_y = 2420;

	//カメラの範囲
	SetCameraNearFar( 2.0f, 1000000.0f );

	//メインループ
	while( ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 ) {


		///////////////
		//武器の装備//
		/////////////

		//フレーム検索
		RightHandFrameNo = MV1SearchFrame( PLAYER, "NewJoint24_Joint" );

		//移動前の座標

		SetCameraPositionAndTarget_UpVecY( VGet( camera.X, camera.Y, camera.Z ), VGet( cursor_x, cursor_y, cursor_z ) ); //カメラが向く座標を指定

		MV1SetPosition( STAGE, VGet( stage.X, 400.0f, stage.Z ) ); //ステージの位置
		MV1SetPosition( PLAYER, VGet( player.X, player.Y, player.Z ) ); //プレイヤーの位置

		MV1SetRotationXYZ( PLAYER, VGet( 0.0f, player.angleY, 0.0f ) ); //プレイヤーの方向

		MV1SetScale( STAGE, VGet( 1000.0f, 1000.0f, 1000.0f ) ); //ステージの倍率
		MV1SetScale( PLAYER, VGet( 1.0f, 1.0f, 1.0f ) ); //プレイヤーの倍率

		SetLightPositionHandle( Light, VGet( stage.X, 1000.0f, stage.Z ) ); //ライトの位置

		// キャラクターモデルの右手フレームの行列を取得
		RightHandMatrix = MV1GetFrameLocalWorldMatrix( PLAYER, RightHandFrameNo );

		// キャラクターモデルの右手フレームの行列をアクセサリモデルの行列としてセットしてから描画
		MV1SetMatrix( M92F, RightHandMatrix );
		MV1SetMatrix( PLAYER2, RightHandMatrix );

		Vect = VGet( 0.0f, 0.0f, 0.0f );
		Vect = VTransform( Vect, RightHandMatrix );
		DrawSphere3D( Vect, 80.0f, 32, GetColor( 255,0,0 ), GetColor( 255, 255, 255 ), TRUE ) ;


		//3Dモデルの描画
		MV1DrawModel( STAGE ); //ステージ
		MV1DrawModel( PLAYER ); //プレイヤー
		MV1DrawModel( M92F ); //武器
		MV1DrawModel( PLAYER2 ); //武器

		// Vect の値を画面に表示
		DrawFormatString( 0, 360, GetColor( 255, 255, 255 ), "Vect x=%f y=%f z=%f", Vect.x, Vect.y, Vect.z );
		DrawFormatString( 0, 380, GetColor( 255, 255, 255 ), "Player x=%f y=%f z=%f", player.X, player.Y, player.Z );


		//ESCキーで終了
		if( keybord_Get( KEY_INPUT_ESCAPE ) > 0 ) {
			break;
		}
	}

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

アバター
ptolemy
記事: 258
登録日時: 12年前

Re: 3Dゲーム モデルに武器を持たせる方法

#16

投稿記事 by ptolemy » 11年前

改良版ありがとうございます。

武器をくっつける前にプレイヤーの座標をセットしなければいけなかったんですね。

プログラムを見て、PLAYER2の役割って何でしょうか?
いまいち役割が理解出来ません。

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

Re: 3Dゲーム モデルに武器を持たせる方法

#17

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

武器(M92F.pmd)が手元に無かったので代わりにもう一つのPLAYER2(高校生.x)を手のところにくっつけているだけす。
デカイから付いているのが分かりやすいでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 12年前

Re: 3Dゲーム モデルに武器を持たせる方法

#18

投稿記事 by ptolemy » 11年前

そういうためのものでしたか。そんな深い意味はないんですね。

このプログラムを参考にテストしてみます。

アバター
ptolemy
記事: 258
登録日時: 12年前

Re: 3Dゲーム モデルに武器を持たせる方法

#19

投稿記事 by ptolemy » 11年前

テストしてみたら、やはり、銃がくっついていませんでした。
モデルデータのせいかなと思って銃のかわりに高校生.xをくっつけたら、くっついていました。
これは、pmdだと読み込めないのでしょうか?

yの高さは、まだ2000だいです。
他に考えられる原因が大きさかもしれないのでそこも試してみます。

一応、モデルデータのURLを載せます。
落として使い倒せ!3DCGモデル & MikuMikuDanceフリー素材集

値と、描画の状態は、こちらです。

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

Re: 3Dゲーム モデルに武器を持たせる方法

#20

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

ベレッタが小さすぎて見えないようです。
MV1SetMatrix()を使うとMV1SetScale()が使えなくなるので、次のようにします。

コード:

 		float scale = 25.0f;
		MV1SetMatrix( M92F, MMult( MGetScale( VGet( scale, scale, scale ) ),  RightHandMatrix  ) );
ローカル拡大して、右手のマトリクスを適用する書き方です。

ココらへんを読んでみてください。
http://i-libro.net/wpmu/blog/archives/618

拡大しないようにモデル時にスケールを合わせてあるのが面倒がなくて良いんですけどね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 12年前

Re: 3Dゲーム モデルに武器を持たせる方法

#21

投稿記事 by ptolemy » 11年前

URLの文章を全て読みました。

行列とは、モデルの変形についての情報を持っているもので、
MATRIX型構造体に記憶する。
softyaさんのサンプルは、
MMult関数で[拡大行列][右手フレームの行列]を掛け合わせてMV1SetMatrix関数で設定する。
そして、そのときに拡大を先に行う。

と、理解しました。

これから、テストしてみます。

アバター
ptolemy
記事: 258
登録日時: 12年前

Re: 3Dゲーム モデルに武器を持たせる方法

#22

投稿記事 by ptolemy » 11年前

テストしてみたところまたバグが発生しました。

拡大したところ、黒いモヤモヤがくっついている感じになりました。
試しにM8000のモデルでも試しましたが、モヤモヤです。
画像も載せます。
いちおう、モデルハンドルの戻り値を確認しましたが、エラーではありませんでした。


質問ばっかりですみません。
じょじょに自分でなにが悪いのか確認する方法を身に着けたいと思います。

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

Re: 3Dゲーム モデルに武器を持たせる方法

#23

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

これがですね。私のところでも起きます。
そちらでも起きるかと思いましたが、やはりダメですか。
想像している原因は、pmdを拡大しているのが悪いのかしれません。
直すならDXライブラリの作者さんに調べてもらうしか無さそうです。

ただ、スケール的には主人公が例外的すぎる大きさなので主人公を適度なサイズに縮小した方が良いかも知れません。
このスケールだと、カメラ的にもライト的にも変なバグを引きそうです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 12年前

Re: 3Dゲーム モデルに武器を持たせる方法

#24

投稿記事 by ptolemy » 11年前

銃を拡大するのではなく、主人公とステージを縮小するということですね。
今のステージも1000倍にしてるので、前から主人公の大きさには気になっていました。

縮小してみてもモヤモヤでしたら、またご報告いたします。

アバター
ptolemy
記事: 258
登録日時: 12年前

Re: 3Dゲーム モデルに武器を持たせる方法

#25

投稿記事 by ptolemy » 11年前

縮小してみたところモヤモヤしてました。(もしかしたらどこか、間違ってるのかもしれません。)
そこで、モヤモヤを気にせず、銃を1000倍にして試してみました。
ただ、武器の倍率を1000.0fにしただけです。そうしたら、モヤモヤの中に銃がしっかり描画されていました。
なんか、銃がモヤモヤで包まれているようです。
一応、武器のモデルを違うサイトから落としてみます。
こんな感じでした。画像を載せておきます。

アバター
ptolemy
記事: 258
登録日時: 12年前

Re: 3Dゲーム モデルに武器を持たせる方法

#26

投稿記事 by ptolemy » 11年前

成功しました。
http://gubigubinamachu.blog54.fc2.com/b ... y-910.html
のモデルを使ったら、黒いモヤモヤは、出ませんでした。

武器の向きは、

コード:

static	float	GunScale=1200.0f;
static	float	X=1.5f,Y=5.0f,Z=3.0f;//まだ正確に向きを修正してないので、大体で設定
MATRIX	Scale=MGetScale(VGet(GunScale,GunScale,GunScale));//1000倍にすると見える	
MATRIX	ry=MGetRotY(Y);
MATRIX	rz=MGetRotZ(Z);  
MATRIX	rx=MGetRotX(X); 
MATRIX	r1=MMult(ry,rz);
MATRIX	r2=MMult(r1,rx);
MATRIX	size=MMult(Scale,r2);
MV1SetMatrix(M92F,MMult(size,RightHandMatrix));

ちなみに、この銃の中心は、持ち手の部分ではないので、画像だと、手に埋まっています。
いろいろ教えていただき、ありがとうございました。
今回で、バグの確認方法をだいたいわかったので、これからは、
バグがあったらすぐ掲示板に書くのではなく、自分でできる限り確認してみて、
それでもだめだったら質問します。
今回は、本当にありがとうございました。

ISLe()

Re: 3Dゲーム モデルに武器を持たせる方法

#27

投稿記事 by ISLe() » 11年前

No.2でリンクされているトピックに「パーツのローカル座標系を合わせておいて」としっかり書いてあるんですけどね。
気付かなかったということでしょうね。

しばしば日本語で書いた前提を読み飛ばされるので対策が必要ですかね。

アバター
ptolemy
記事: 258
登録日時: 12年前

Re: 3Dゲーム モデルに武器を持たせる方法

#28

投稿記事 by ptolemy » 11年前

画像では銃が手に埋まってます。についてでしょうか?(間違っていたらすみません。)
これは、まだ、とりあえず手の位置に描画されたらというテストで、解決した後にボーンの位置を変えて、武器をしっかり持たせました。

閉鎖

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