アイテム表示

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

アイテム表示

#1

投稿記事 by わからんこ » 13年前

コード:

void Camera_Process(void){

	////SetMouseDispFlag(FALSE);

	float h,v;
 
	MATRIX z;
	MATRIX y;
 
	float Camera_model_Length ;
 
	Camera_model_Length =4000.0f;//CAMERA_PLAYER_LENGTH;
 
 
	// マウスの位置を取得
	int mouse_x, mouse_y;
	GetMousePoint( &mouse_x , &mouse_y ) ;
	set.MouseX += mouse_x - 320;
	set.MouseY += mouse_y - 240;
 

	if(set.MouseY>=80)set.MouseY=80;
	if(set.MouseY<=-70)set.MouseY=-70;
 
	h=(set.MouseX/120.0f);
	v=(set.MouseY/120.0f);
 
	y=MGetRotY(h);
	z=MGetRotZ(v);
	cam.pos=VAdd(mod.pos,VGet(0.0f,PLAYER_HIT_HEIGHT+25.0f,0));
	cam.target_pos = VAdd( VTransform( VTransform( VGet( -Camera_model_Length, 0.0f, 0.0f ), z ), y ), cam.pos) ;

	mod.aitem_pos= VAdd( VTransform( VTransform( VGet( -70.0f, -50.0f, 0.0f ), z ), y ), cam.pos) ;
	// カメラの情報をライブラリのカメラに反映させる
	SetCameraPositionAndTarget_UpVecY( cam.pos,cam.target_pos ) ;
	SetMousePoint(320,240); 
}

コード:

void aitem_model(void){	
		MV1SetMatrix(mod.aitem_Handle, MGetIdent());
		MV1SetScale(mod.aitem_Handle, VGet(20.0f, 20.0f, 20.0f) );

		MV1SetRotationXYZ( mod.aitem_Handle, VNorm(VSub( cam.target_pos,cam.pos ))) ;
		MV1SetPosition(mod.aitem_Handle,mod.aitem_pos);
	}
今、見えている視野の目の前にアイテムを表示させたいのですが、うまくいきません。

アイテムはカメラの注視点を使いモデルの手前に表示しています。

しかし、カメラを動かすとアイテムが回転してしまいます。

3Dシューティングゲームのように視点を動かし、それに銃の動きがついてくるようにしたいのです。

MV1SetRotationXYZ( mod.aitem_Handle, VNorm(VSub( cam.target_pos,cam.pos ))) ;

カメラの注視点ーカメラ座標、この値を正規化したものでは向きが出せないのでしょうか?

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

Re: アイテム表示

#2

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

カメラのビュー行列を得て、それを平行移動したものをアイテムに反映させれば目の前に出現できるはずですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

わからんこ

Re: アイテム表示

#3

投稿記事 by わからんこ » 13年前

ビュー行列、ちょっと勉強してきます

わからんこ

Re: アイテム表示

#4

投稿記事 by わからんこ » 13年前

コード:

void Aitem_Process(void){
	MATRIX byu;
	MATRIX In1;
	VECTOR vect1;

	//単位行列渡してるだけとサイズ変更
	MV1SetMatrix(mod.aitem_Handle, MGetIdent());
	MV1SetScale(mod.aitem_Handle, VGet(20.0f, 20.0f, 20.0f) );

	//カメラのビュー行列を得る
	byu=GetCameraProjectionMatrix();
	In1=MGetTranslate(VGet(0.0f,0.0f,50.0f)) ;
	In1=MAdd( In1, byu ) ;

	VTransform(mod.aitem_pos, In1) ;
	MV1SetPosition(mod.Gun_Handle,mod.aitem_pos);	
} 
ビュー行列というのは、カメラの座標で、

そこを基準に平行移動させることで、表示画面につねに描写する。

こういうことを実現させようとしましたが、これではうまくいきませんでした。

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

Re: アイテム表示

#5

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

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

わからんこ

Re: アイテム表示

#6

投稿記事 by わからんこ » 13年前

自分では上の関数でビュー行列を平行移動させているつもりなのですが、

あれでは平行移動になってないですか?

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

Re: アイテム表示

#7

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

わからんこ さんが書きました:自分では上の関数でビュー行列を平行移動させているつもりなのですが、

あれでは平行移動になってないですか?
せっかくの回転成分が消えますが良いのですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: アイテム表示

#8

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

失礼しました。逆行列化と行列を掛けないいけないですね。

サンプルを用意しました。
数値やファイル名は実物に合わせて調整してみてください。

コード:

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
	int ModelHandle,ItemHandle ;
	VECTOR CameraPos ;

    //ウィンドウモードにする
    ChangeWindowMode(TRUE);
	// DXライブラリの初期化
	if( DxLib_Init() < 0 )
	{
		// エラーが発生したら直ちに終了
		return -1 ;
	}

	// モデルの読み込み
	ModelHandle = MV1LoadModel( "sample/SimpleModel.mqo" ) ;
	ItemHandle = MV1LoadModel( "item.mqo" ) ;

	// 描画先を裏画面にする
	SetDrawScreen( DX_SCREEN_BACK ) ;

	// カメラの座標を初期化
	CameraPos.x = 0.0f ;
	CameraPos.y = 0.0f ;
	CameraPos.z = -800.0f ;

	// ESCキーが押されるかウインドウが閉じられるまでループ
	while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
	{
		// 画面をクリア
		ClearDrawScreen() ;

		// 方向キーでカメラの座標を移動
		if( CheckHitKey( KEY_INPUT_UP ) == 1 )
		{
			CameraPos.y += 20.0f ;
		}
		if( CheckHitKey( KEY_INPUT_DOWN ) == 1 )
		{
			CameraPos.y -= 20.0f ;
		}
		if( CheckHitKey( KEY_INPUT_LEFT ) == 1 )
		{
			CameraPos.x -= 20.0f ;
		}
		if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 )
		{
			CameraPos.x += 20.0f ;
		}

		// カメラの位置と注視点をセット、注視点は原点
		SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( 0.0f, 0.0f, 0.0f ) ) ;

		// モデルの描画
		MV1DrawModel( ModelHandle ) ;

		//	カメラのビューマトリクス
		MATRIX viewMtx = GetCameraViewMatrix();
		
		//	アイテムの位置の計算
		MATRIX itemMtx = MInverse(viewMtx);
		MATRIX moveMtx = MGetTranslate( VGet(0.0f,0.0f,800.0f) );
		itemMtx = MMult( moveMtx, itemMtx ) ;
		
		//	アイテムにマトリクスを反映。
		MV1SetMatrix( ItemHandle,itemMtx );
		MV1DrawModel( ItemHandle ) ;
		

		// 裏画面の内容を表画面に反映
		ScreenFlip() ;
	}

	// DXライブラリの後始末
	DxLib_End() ;

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

わからんこ

Re: アイテム表示

#9

投稿記事 by わからんこ » 13年前

わざわざコードまで作っていただき、
ありがとうございます。

もう一度勉強してきましたが、

以前のビュー行列の解釈が間違ってました。

わからんこ

Re: アイテム表示

#10

投稿記事 by わからんこ » 13年前

すいません、ひとつだけわからないことがありました。

書いていただいた、アイテムを表示するコードは
手前フリップも変更してしまうのですか?

z軸成分を800fから40fにすると映らなくなってしまいます。

50fではうつるのですが・・・

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

Re: アイテム表示

#11

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

わからんこ さんが書きました:すいません、ひとつだけわからないことがありました。

書いていただいた、アイテムを表示するコードは
手前フリップも変更してしまうのですか?

z軸成分を800fから40fにすると映らなくなってしまいます。

50fではうつるのですが・・・
SetCameraNearFar()の事でしょうか? http://homepage2.nifty.com/natupaji/DxL ... html#R12N1
変えていませんのでクリップがうまく働かないなら、もともとの問題だと思います。
アイテムはカメラの直近に描画されますのでnearクリップ値を良く考えないとマズイでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

わからんこ

Re: アイテム表示

#12

投稿記事 by わからんこ » 13年前

これで本当に解決しました。

なんどもありがとうございました!

閉鎖

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