3Dゲーム モデルに武器を持たせる方法
3Dゲーム モデルに武器を持たせる方法
僕は、DXライブラリを使って3Dゲームを作っているんですがモデルに武器を持たせる方法についてなやんでいます。
それはなにかというと、普通、3Dモデルに武器を持たせる場合は、
モデリングソフトで武器のモデルとプレイヤーのモデルを武器を持った状態にして、一つのモデルとしてうごかす。
それか、
あらかじめ、プレイヤーのモデルを武器を持つ手の形にしておいて、プログラミングでプレイヤーの手の位置に合うように武器を設置する。
のかまたは、他なのかわかりません。
普通どういった方法で武器をもたせますか?
また、武器を入れ替えるときは、武器をもったモデル自体を入れ替えるのか武器だけを入れ替えるのかわかりません。
説明が下手なのでしっかり伝わっていないかもしれないですが、ご回答
それはなにかというと、普通、3Dモデルに武器を持たせる場合は、
モデリングソフトで武器のモデルとプレイヤーのモデルを武器を持った状態にして、一つのモデルとしてうごかす。
それか、
あらかじめ、プレイヤーのモデルを武器を持つ手の形にしておいて、プログラミングでプレイヤーの手の位置に合うように武器を設置する。
のかまたは、他なのかわかりません。
普通どういった方法で武器をもたせますか?
また、武器を入れ替えるときは、武器をもったモデル自体を入れ替えるのか武器だけを入れ替えるのかわかりません。
説明が下手なのでしっかり伝わっていないかもしれないですが、ご回答
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dゲーム モデルに武器を持たせる方法
手のボーンのマトリックスを毎フレーム得て、そこに武器をくっ付けるのが多いパターンじゃないでしょうか。
そうすれば腕のアニメーションに勝手にくっ付いて動きます。
持つ手の形は、はじめからアニメで用意しておくしか無いでしょうね。
過去ログ参考。
「ボーン(DXLibでいうフレーム)に武器を取り付ける方法 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=9331
そうすれば腕のアニメーションに勝手にくっ付いて動きます。
持つ手の形は、はじめからアニメで用意しておくしか無いでしょうね。
過去ログ参考。
「ボーン(DXLibでいうフレーム)に武器を取り付ける方法 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=9331
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 3Dゲーム モデルに武器を持たせる方法
参考に作ってみました。
このようにしてみたんですが、何の変化もありません。
関数の戻り値を確認しましたがすべて成功と出ました。
なにか間違いは、ありますか?
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ゲーム モデルに武器を持たせる方法
> このようにしてみたんですが、何の変化もありません。
変化がないとは? 元の状態がわからないので変化がないという結果の意味が分かりません。
得られているマトリクスがどういう代物なのか確認をお願いします。
変化がないとは? 元の状態がわからないので変化がないという結果の意味が分かりません。
得られているマトリクスがどういう代物なのか確認をお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 3Dゲーム モデルに武器を持たせる方法
すみません。
元の状態というか現状をお伝えします。
モデルは、以前お渡しした、学生のモデルです。
それで、そのモデルの右手のフレームを取得して、
武器のpmdのモデルを取り付けようとしたのですが、武器自体が、
描画されていなく、戻り値も成功になってます。
元の状態というか現状をお伝えします。
モデルは、以前お渡しした、学生のモデルです。
それで、そのモデルの右手のフレームを取得して、
武器のpmdのモデルを取り付けようとしたのですが、武器自体が、
描画されていなく、戻り値も成功になってます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dゲーム モデルに武器を持たせる方法
マトリクスの方を確認してみてください。
マトリクス使って(0,0,0)座標を変換してDrawFormatStringなどで表示すれば銃が移動した座標が分かるはずです。
※ 確認方法を自分であみ出さないと何時まで経っても自分でデバッグできませんよ。
【補足】
3D関係の回答をしてくれる人はもともと少ないのと、長いコードを追いかけるのは至難の業なので、結局一人でやらないといけなくなります。
今のうちに準備しましょう。
マトリクス使って(0,0,0)座標を変換してDrawFormatStringなどで表示すれば銃が移動した座標が分かるはずです。
※ 確認方法を自分であみ出さないと何時まで経っても自分でデバッグできませんよ。
【補足】
3D関係の回答をしてくれる人はもともと少ないのと、長いコードを追いかけるのは至難の業なので、結局一人でやらないといけなくなります。
今のうちに準備しましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 3Dゲーム モデルに武器を持たせる方法
マトリクスについてよく理解していないんですが、少し教えてもらえませんか?
過去トピック
http://dixq.net/forum/viewtopic.php?f=3&t=10136
を少し見たのですが
マトリクスとは、座標や拡大率等の多くの情報を扱えるint,float同様の型ですか?
また、上のプログラムは、
アクセサリの装備
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=2064
こちらのサイトを参考にしながら書いたので、マトリクス自体は理解していません。
また、高校ではないので、行列についてさっぱりです。
マトリクスとは、なんなのかということと
行列からXYZ座標に変換する方法が理解出来ないです。
かなり、分からないことばかりで申し訳ありません。
過去トピック
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ゲーム モデルに武器を持たせる方法
行列計算を覚えなくても、行列(マトリクス)の計算関数は利用できます。
ようは3Dゲームに限定した使い方を覚えれば良いだけです。
[超基本] 座標 * マトリクス = 移動・回転・拡縮した後の座標
ベクトル=座標として扱えますので、
ベクトル=座標をVTransformすれば、変換後の座標が得られます。
http://homepage2.nifty.com/natupaji/DxL ... tml#R11N12
マトリクスの掛け算とか、ローカル座標系、ワールド座標系の話はまた別の機会に。
実際には高校数学なので原理まで知ると難しいでしょう。なので飛ばします。
まぁ、高校でも普通科の進学クラスにならないとやらないみたいですけどね。高専などはまた別。
高校でもやらなかったら自力でやるしか無いわけです。
ようは3Dゲームに限定した使い方を覚えれば良いだけです。
[超基本] 座標 * マトリクス = 移動・回転・拡縮した後の座標
ベクトル=座標として扱えますので、
ベクトル=座標をVTransformすれば、変換後の座標が得られます。
http://homepage2.nifty.com/natupaji/DxL ... tml#R11N12
マトリクスの掛け算とか、ローカル座標系、ワールド座標系の話はまた別の機会に。
実際には高校数学なので原理まで知ると難しいでしょう。なので飛ばします。
まぁ、高校でも普通科の進学クラスにならないとやらないみたいですけどね。高専などはまた別。
高校でもやらなかったら自力でやるしか無いわけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 3Dゲーム モデルに武器を持たせる方法
すみません。僕の理解力が足りないだけなのですが、
ベクトル=座標をVTransformについて、
この関数は、 座標 * マトリクス = 移動・回転・拡縮した後の座標 の処理を行ってくれる関数なのですか?
引数は、サンプルをみると、
VECTOR Vect ;に座標をいれ、
Vect = VTransform( Vect, Matrix ) ;
とあるんですが、この座標は、なんの座標ですか?
僕は、
RightHandMatrix = MV1GetFrameLocalWorldMatrix(PLAYER, RightHandFrameNo ) ;
として、Setで右手のフレームの座標にセットとしているのでサンプルにVectになんの座標
を入れればいいのかさっぱりです。
また、変換前の座標と変換後の座標の違いがわかりません。
意味がわかりずらい質問もありますがよろしくお願いします。
ベクトル=座標をVTransformについて、
この関数は、 座標 * マトリクス = 移動・回転・拡縮した後の座標 の処理を行ってくれる関数なのですか?
引数は、サンプルをみると、
VECTOR Vect ;に座標をいれ、
Vect = VTransform( Vect, Matrix ) ;
とあるんですが、この座標は、なんの座標ですか?
僕は、
RightHandMatrix = MV1GetFrameLocalWorldMatrix(PLAYER, RightHandFrameNo ) ;
として、Setで右手のフレームの座標にセットとしているのでサンプルにVectになんの座標
を入れればいいのかさっぱりです。
また、変換前の座標と変換後の座標の違いがわかりません。
意味がわかりずらい質問もありますがよろしくお願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dゲーム モデルに武器を持たせる方法
はじめから分かる人はいません。色々試せばよいのです。
知らないなら片っ端から試して、よく分からければ質問すべきです。
数学を知らずに感覚で理解するのは、それが一番だと私は思います。
あと、DXライブラリ置き場にある3Dサンプルでの使い方とかリファレンスの使い方を参考にするのは基本です。
3D関数の機能の殆ど知らずにゲームを実装するのは無理がありますよ。
「補足」 大事なのは理科・科学の実験と同じで、実験前の予測・実験結果の検証・予測とズレた場合の原因の追求です。そして再び実験。
ちなみに、座標がどう変換されるか知りたいわけですから原点を使います。
VGet( 0.0f, 0.0f, 0.0f ) ;
って事です。
銃が何処に消えたか調べたいんですよね? これは、銃が何処の座標に移動したかを調べる行為です。
>この関数は、 座標 * マトリクス = 移動・回転・拡縮した後の座標 の処理を行ってくれる関数なのですか?
はい。
>とあるんですが、この座標は、なんの座標ですか?
引数にマトリクスで変換したい座標かベクトルを入れます。それ以上の意味は無いですよ。返り値はマトリクスで計算(トランスフォーム)された座標かベクトルです。
知らないなら片っ端から試して、よく分からければ質問すべきです。
数学を知らずに感覚で理解するのは、それが一番だと私は思います。
あと、DXライブラリ置き場にある3Dサンプルでの使い方とかリファレンスの使い方を参考にするのは基本です。
3D関数の機能の殆ど知らずにゲームを実装するのは無理がありますよ。
「補足」 大事なのは理科・科学の実験と同じで、実験前の予測・実験結果の検証・予測とズレた場合の原因の追求です。そして再び実験。
ちなみに、座標がどう変換されるか知りたいわけですから原点を使います。
VGet( 0.0f, 0.0f, 0.0f ) ;
って事です。
銃が何処に消えたか調べたいんですよね? これは、銃が何処の座標に移動したかを調べる行為です。
>この関数は、 座標 * マトリクス = 移動・回転・拡縮した後の座標 の処理を行ってくれる関数なのですか?
はい。
>とあるんですが、この座標は、なんの座標ですか?
引数にマトリクスで変換したい座標かベクトルを入れます。それ以上の意味は無いですよ。返り値はマトリクスで計算(トランスフォーム)された座標かベクトルです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 3Dゲーム モデルに武器を持たせる方法
すみませんでした。これからは、わからないものが出たらまずは、
試して、それでもわからなかったら質問したいと思います。
一応、座標をだしました。
(0.0f,0.0f,0.0f)からの移動したあとの座標を調べました。
武器の移動後の座標(-136,2109,-521)
プレイヤー座標(20,0,200)
でした。
手は、プレイヤーの座標に近いと思うのですが、座標が離れていますね。
でも、回転してみると、座標が近くなったりする時があったりしますね。
試して、それでもわからなかったら質問したいと思います。
一応、座標をだしました。
(0.0f,0.0f,0.0f)からの移動したあとの座標を調べました。
武器の移動後の座標(-136,2109,-521)
プレイヤー座標(20,0,200)
でした。
手は、プレイヤーの座標に近いと思うのですが、座標が離れていますね。
でも、回転してみると、座標が近くなったりする時があったりしますね。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dゲーム モデルに武器を持たせる方法
拡大していませんでしたっけ? それが原因かもしれませんが、それにしてもYの高さが高いですね。こんなに拡大してましたか?
「追記」
表示実験するので、コードを合わせたいと思います。
シンプルな表示のコードをお願いします。
「追記」
表示実験するので、コードを合わせたいと思います。
シンプルな表示のコードをお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 3Dゲーム モデルに武器を持たせる方法
了解しました。
拡大は、プレイヤーのモデルですか?それとも武器のモデルですか?
一応、どちらも1.0倍にしていたと思います。
拡大は、プレイヤーのモデルですか?それとも武器のモデルですか?
一応、どちらも1.0倍にしていたと思います。
Re: 3Dゲーム モデルに武器を持たせる方法
整理してみました。
前回に比べてインデントをしっかりしたつもりですが、また変でしたらすみません。
こちらがプログラムです。
前回に比べてインデントをしっかりしたつもりですが、また変でしたらすみません。
こちらがプログラムです。
#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ゲーム モデルに武器を持たせる方法
銃のデータが見当たらなかったので、主人公を手の位置にくっつけてみました。
ちゃんと手の位置に出現します。なので、元々の銃の座標が原点にないなどの問題があるか、手の方向と合っていないかなど別の原因だと思います。
あと主人公の座標を設定しないうちに、MV1GetFrameLocalWorldMatrix()すると座標が正しくないので注意して下さい。
インデントも、こんな感じを希望します。
ちゃんと手の位置に出現します。なので、元々の銃の座標が原点にないなどの問題があるか、手の方向と合っていないかなど別の原因だと思います。
あと主人公の座標を設定しないうちに、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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 3Dゲーム モデルに武器を持たせる方法
改良版ありがとうございます。
武器をくっつける前にプレイヤーの座標をセットしなければいけなかったんですね。
プログラムを見て、PLAYER2の役割って何でしょうか?
いまいち役割が理解出来ません。
武器をくっつける前にプレイヤーの座標をセットしなければいけなかったんですね。
プログラムを見て、PLAYER2の役割って何でしょうか?
いまいち役割が理解出来ません。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dゲーム モデルに武器を持たせる方法
武器(M92F.pmd)が手元に無かったので代わりにもう一つのPLAYER2(高校生.x)を手のところにくっつけているだけす。
デカイから付いているのが分かりやすいでしょう。
デカイから付いているのが分かりやすいでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 3Dゲーム モデルに武器を持たせる方法
そういうためのものでしたか。そんな深い意味はないんですね。
このプログラムを参考にテストしてみます。
このプログラムを参考にテストしてみます。
Re: 3Dゲーム モデルに武器を持たせる方法
テストしてみたら、やはり、銃がくっついていませんでした。
モデルデータのせいかなと思って銃のかわりに高校生.xをくっつけたら、くっついていました。
これは、pmdだと読み込めないのでしょうか?
yの高さは、まだ2000だいです。
他に考えられる原因が大きさかもしれないのでそこも試してみます。
一応、モデルデータのURLを載せます。
落として使い倒せ!3DCGモデル & MikuMikuDanceフリー素材集
値と、描画の状態は、こちらです。
モデルデータのせいかなと思って銃のかわりに高校生.xをくっつけたら、くっついていました。
これは、pmdだと読み込めないのでしょうか?
yの高さは、まだ2000だいです。
他に考えられる原因が大きさかもしれないのでそこも試してみます。
一応、モデルデータのURLを載せます。
落として使い倒せ!3DCGモデル & MikuMikuDanceフリー素材集
値と、描画の状態は、こちらです。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dゲーム モデルに武器を持たせる方法
ベレッタが小さすぎて見えないようです。
MV1SetMatrix()を使うとMV1SetScale()が使えなくなるので、次のようにします。
ローカル拡大して、右手のマトリクスを適用する書き方です。
ココらへんを読んでみてください。
http://i-libro.net/wpmu/blog/archives/618
拡大しないようにモデル時にスケールを合わせてあるのが面倒がなくて良いんですけどね。
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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 3Dゲーム モデルに武器を持たせる方法
URLの文章を全て読みました。
行列とは、モデルの変形についての情報を持っているもので、
MATRIX型構造体に記憶する。
softyaさんのサンプルは、
MMult関数で[拡大行列][右手フレームの行列]を掛け合わせてMV1SetMatrix関数で設定する。
そして、そのときに拡大を先に行う。
と、理解しました。
これから、テストしてみます。
行列とは、モデルの変形についての情報を持っているもので、
MATRIX型構造体に記憶する。
softyaさんのサンプルは、
MMult関数で[拡大行列][右手フレームの行列]を掛け合わせてMV1SetMatrix関数で設定する。
そして、そのときに拡大を先に行う。
と、理解しました。
これから、テストしてみます。
Re: 3Dゲーム モデルに武器を持たせる方法
テストしてみたところまたバグが発生しました。
拡大したところ、黒いモヤモヤがくっついている感じになりました。
試しにM8000のモデルでも試しましたが、モヤモヤです。
画像も載せます。
いちおう、モデルハンドルの戻り値を確認しましたが、エラーではありませんでした。
質問ばっかりですみません。
じょじょに自分でなにが悪いのか確認する方法を身に着けたいと思います。
拡大したところ、黒いモヤモヤがくっついている感じになりました。
試しにM8000のモデルでも試しましたが、モヤモヤです。
画像も載せます。
いちおう、モデルハンドルの戻り値を確認しましたが、エラーではありませんでした。
質問ばっかりですみません。
じょじょに自分でなにが悪いのか確認する方法を身に着けたいと思います。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dゲーム モデルに武器を持たせる方法
これがですね。私のところでも起きます。
そちらでも起きるかと思いましたが、やはりダメですか。
想像している原因は、pmdを拡大しているのが悪いのかしれません。
直すならDXライブラリの作者さんに調べてもらうしか無さそうです。
ただ、スケール的には主人公が例外的すぎる大きさなので主人公を適度なサイズに縮小した方が良いかも知れません。
このスケールだと、カメラ的にもライト的にも変なバグを引きそうです。
そちらでも起きるかと思いましたが、やはりダメですか。
想像している原因は、pmdを拡大しているのが悪いのかしれません。
直すならDXライブラリの作者さんに調べてもらうしか無さそうです。
ただ、スケール的には主人公が例外的すぎる大きさなので主人公を適度なサイズに縮小した方が良いかも知れません。
このスケールだと、カメラ的にもライト的にも変なバグを引きそうです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 3Dゲーム モデルに武器を持たせる方法
銃を拡大するのではなく、主人公とステージを縮小するということですね。
今のステージも1000倍にしてるので、前から主人公の大きさには気になっていました。
縮小してみてもモヤモヤでしたら、またご報告いたします。
今のステージも1000倍にしてるので、前から主人公の大きさには気になっていました。
縮小してみてもモヤモヤでしたら、またご報告いたします。
Re: 3Dゲーム モデルに武器を持たせる方法
縮小してみたところモヤモヤしてました。(もしかしたらどこか、間違ってるのかもしれません。)
そこで、モヤモヤを気にせず、銃を1000倍にして試してみました。
ただ、武器の倍率を1000.0fにしただけです。そうしたら、モヤモヤの中に銃がしっかり描画されていました。
なんか、銃がモヤモヤで包まれているようです。
一応、武器のモデルを違うサイトから落としてみます。
こんな感じでした。画像を載せておきます。
そこで、モヤモヤを気にせず、銃を1000倍にして試してみました。
ただ、武器の倍率を1000.0fにしただけです。そうしたら、モヤモヤの中に銃がしっかり描画されていました。
なんか、銃がモヤモヤで包まれているようです。
一応、武器のモデルを違うサイトから落としてみます。
こんな感じでした。画像を載せておきます。
Re: 3Dゲーム モデルに武器を持たせる方法
成功しました。
http://gubigubinamachu.blog54.fc2.com/b ... y-910.html
のモデルを使ったら、黒いモヤモヤは、出ませんでした。
武器の向きは、
ちなみに、この銃の中心は、持ち手の部分ではないので、画像だと、手に埋まっています。
いろいろ教えていただき、ありがとうございました。
今回で、バグの確認方法をだいたいわかったので、これからは、
バグがあったらすぐ掲示板に書くのではなく、自分でできる限り確認してみて、
それでもだめだったら質問します。
今回は、本当にありがとうございました。
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));
ちなみに、この銃の中心は、持ち手の部分ではないので、画像だと、手に埋まっています。
いろいろ教えていただき、ありがとうございました。
今回で、バグの確認方法をだいたいわかったので、これからは、
バグがあったらすぐ掲示板に書くのではなく、自分でできる限り確認してみて、
それでもだめだったら質問します。
今回は、本当にありがとうございました。
Re: 3Dゲーム モデルに武器を持たせる方法
No.2でリンクされているトピックに「パーツのローカル座標系を合わせておいて」としっかり書いてあるんですけどね。
気付かなかったということでしょうね。
しばしば日本語で書いた前提を読み飛ばされるので対策が必要ですかね。
気付かなかったということでしょうね。
しばしば日本語で書いた前提を読み飛ばされるので対策が必要ですかね。
Re: 3Dゲーム モデルに武器を持たせる方法
画像では銃が手に埋まってます。についてでしょうか?(間違っていたらすみません。)
これは、まだ、とりあえず手の位置に描画されたらというテストで、解決した後にボーンの位置を変えて、武器をしっかり持たせました。
これは、まだ、とりあえず手の位置に描画されたらというテストで、解決した後にボーンの位置を変えて、武器をしっかり持たせました。