2Dカメラの実装について

DirectX SDK を使ってゲーム・アプリ開発してる方、気軽に参加してください!

※DXライブラリではなく、DirectXを直接いじってる方を対象にしています。

※興味を持った方は誰でも参加していただいて構いません。

※私(Ciel)は、DirectXに関してまだ初心者ですので、色々ご迷惑をおかけすると思いますがご了承ください。

【利用規約】
・一つの質問につき、一つのスレッドを作成して下さい。

・個人の判断でスレ立てるまでもないなーと思った質問に関しては、「スレ立てるまでもない質問」のスレッドに投稿をお願い致します。

・常識の範囲であれば、何でもしていただいて構いませんが、
何か迷ったら私の方まで気兼ねなくメッセージをお送り下さい。

皆で色んな問題を解決しあって、技術を向上させていきましょう!
返信
ああ
記事: 49
登録日時: 13年前
住所: 東京都

2Dカメラの実装について

#1

投稿記事 by ああ » 13年前

2Dカメラの実装について。

詳細はNNKさんの最初の投稿をご確認ください。

※10/26 20:15
管理人がタイトルと文章を変更しました。
今後は基本は一つの質問につき1スレ作成していただくようお願い致します。
最後に編集したユーザー ああ on 2010年10月26日(火) 20:16 [ 編集 1 回目 ]

ああ
記事: 49
登録日時: 13年前
住所: 東京都

Re: 2Dカメラの実装について

#2

投稿記事 by ああ » 13年前

では早速日記でも書いてるのですが。

現在DirectXを使用して自作のゲームを制作しておりまして、2Dの横スクロールなのでメッシュなど3Dの機能は省いて、2Dのみでプログラミングしていきたいと思っております。
DirectXを使用してる理由は派手なエフェクトとカメラを使って画面にスピード感などの演出をしたいからです。

一応やりたい事を記述すると
1.左右上下の移動とズームも自由にしたいので出来る、3D空間でのカメラ操作を可能にする。
2・ゲーム自体は2Dなので、キャラなどオブジェクトをスクリーン座標での値で操作する。
3・尚且つ、回転や拡大もキャラなどオブジェクトが出来るようにする。


で現在FVFをD3DFVF_XYZに設定して行列を計算した結果をSetTransformでワールド空間に描画してます。
カメラも自由に操作出来、キャラやオブジェクトも自由に回転や拡大出来るようになっているが、スクリーン座標での値で操作出来ない。
ですが正射影変換にすればスクリーン座標で指定出来るが、カメラが固定されるので自由が利かない。

逆にFVFをD3DFVF_XYZRHWにした場合スクリーン座標で指定出来るけど、SetTransformが使えないので回転や拡大は別に計算しなければならない上に、カメラの制御もできないので、何とかD3DFVF_XYZでスクリーン座標の値で自由に操作したいんです。


やりたい事が成立するならばD3DFVF_XYZでもD3DFVF_XYZRHWでも構わないんですが、分かる方がいれば是非ご教授お願い致します。

大熊猫
記事: 16
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 2Dカメラの実装について

#3

投稿記事 by 大熊猫 » 13年前

これは私も興味あったので試してみました。

こういう感じのでよかったでしょうか?(間違っていたらすいません)
[BBvideo 425,350]http://www.nicovideo.jp/watch/sm12541374[/BBvideo]
上の動画ではID3DXSpriteインターファイスを使用したのでそれ以外ではあんまり参考にならないかもしれませんが、私はまずカメラのクラスを作りそこにカメラの現在地、ズーム(拡大)、回転を合わせたマトリックスを出す関数を用意しました(位置はスクリーン座標で)。

そしてID3DXSpriteのBegin()を呼ぶ時にカメラのマトリックスを保存し、End()が呼ばれるまでの間に描画される全てのスプライトにこのマトリックスを適用しました。

言葉だけだと分かりずらい思うので描画の関数を載せときます:

コード:

// カメラのマトリックスを保存する
D3DXMATRIX _transform = camera.TransformMatrix;

void Sprite::Draw(Texture *texture, Vector2 &position, Colour &colour, Vector2 &origin, float scale, float angle, float depth)
{
	// set origin and position
	D3DXMATRIX m1, m2; 
	D3DXVECTOR3 ori( origin.X, origin.Y, 1.0f );
	D3DXVECTOR3 pos( position.X, position.Y, 0 );

	//scalling
	D3DXMatrixScaling( &m1, scale, scale, 0.0f );

	//rotation
	D3DXMatrixRotationZ( &m2, angle );
	D3DXMatrixMultiply( &m1, &m1, &m2 ); 

	//translate
	D3DXMatrixTranslation( &m2, position.X, position.Y, depth );  
	D3DXMatrixMultiply( &m1, &m1, &m2); 

	// パラメータで送られてきた位置や角度とカメラのマトリックスを合わせる
	D3DXMatrixMultiply( &m1, &m1, &_transform); 

	//set matrix to the sprite  interface
	HR( _sprite->SetTransform( &m1 ) );

	//draw
	_sprite->Draw( texture, NULL, &ori, NULL, colour );

	//reset matrix 
	D3DXMatrixIdentity( &m1 );
	_sprite->SetTransform( &m1 );
}
かなり長く、しかも分かりにくくなりましたが、もし欲しい情報と違かった場合は申してください。あと、最近日本語が壊滅的なのでどこか変だったら指摘してください。 m_ _m
“Good code is its own best documentation.” (Steve McConnell)

ああ
記事: 49
登録日時: 13年前
住所: 東京都

Re: 2Dカメラの実装について

#4

投稿記事 by ああ » 13年前

お返事ありがとう御座います。
動画拝見させて頂きましたが、まさに私がしたい事です!
上手く実装してみます!!

にしても本当に素晴らしいコミュニティですね^^
ずっとお互いの技術を交換して、高め合う場があれば良いなぁ~と思ってたのですが、ゲームプログラミングがより一層楽しめそうです。

これからは、簡単な事でも自分が躓いたところや工夫したところを載せて、皆のゲームクリエイトライフが充実するようになると良いなぁって思います。

アバター
Ciel
記事: 252
登録日時: 13年前

Re: 2Dカメラの実装について

#5

投稿記事 by Ciel » 13年前

>>大熊猫さん。
回答ありがとうございます
私も非常に助かりましたし、参考になりました^^

>>NNKさん。
今回の質問は私も勉強になりました。
これからお互いどんどん技術を向上させていきたいですね^^
oui C'est la Vie♪

ああ
記事: 49
登録日時: 13年前
住所: 東京都

Re: 2Dカメラの実装について

#6

投稿記事 by ああ » 13年前

どうも日記にも書いたんですが、せっかく大熊猫さんに教わったのですが正射影変換にする事にしました(^^;

とりあえずソースコード

コード:

	//	ローカル変数の宣言
	D3DVIEWPORT9 d3dvVp;
	D3DXMATRIX matProj, matView;
	//	ビューポートの取得
	if( FAILED(in_dev9->GetViewport(&d3dvVp)) )
	{
	return;
	}
	//	単位行列で初期化を行う
	D3DXMatrixIdentity( &matProj );
	D3DXMatrixIdentity( &matView );
	//	カメラの設定
	D3DXMatrixOrthoOffCenterLH( &matProj, 0.0f, (float)(d3dvVp.Width), (float)(d3dvVp.Height), fOffset, 0.0f, 100.0f );
	in_dev9->SetTransform( D3DTS_PROJECTION, &matProj );
	update();
	D3DXMatrixLookAtLH( &matView, &getLoc(), &viewPoint, &d3dv3Up );
	in_dev9->SetTransform( D3DTS_VIEW, &matView );
上記のソースをコピペすればスクリーン座標で値を操作可能です(はず)。
一部の引数などは各々のプログラムに合わせる必要ですが、下記に一応説明しますね。

in_dev9 LPDIRECT3DDEVICE9
update カメラの座標とviewPointを更新する関数
getLoc カメラの現在座標を取得する関数
viewPoint 写す先の座標(自分のプログラムでは操作するキャラクター)
d3dv3Up ワールド空間でのカメラの上方向を示す座標

まぁこんな感じですかね?
ただD3DXMatrixScalingを使うと変な風に拡大するので、誰か行列変換に詳しい人いたらご指導お願い致します><

ああ
記事: 49
登録日時: 13年前
住所: 東京都

Re: 2Dカメラの実装について

#7

投稿記事 by ああ » 13年前

すいません、上記の問題簡単に解決しましたw
後ほどまとめたのを書きますね!
今日中にやるか分かりませんがw

3Dカメラで2Dゲーム作りたい人には凄く助かると思うんだけど、この問題で悩んでるのって俺ぐらいなのかな?w

アバター
Ciel
記事: 252
登録日時: 13年前

Re: 2Dカメラの実装について

#8

投稿記事 by Ciel » 13年前

いえ、私も悩んでますw
oui C'est la Vie♪

ああ
記事: 49
登録日時: 13年前
住所: 東京都

Re: 2Dカメラの実装について

#9

投稿記事 by ああ » 13年前

では寝る前に決め打ちですが、前回のソースの
D3DXMatrixLookAtLH( &matView, &getLoc(), &viewPoint, &d3dv3Up );

in_dev9->SetTransform( D3DTS_VIEW, &matView );
の間に下記のソースを追加して、マトリックスを
d3dmMatrixPos, d3dmMatrixScale, d3dmMatrixZ
このみっつ追加して下さい。

コード:

 
	D3DXMatrixTranslation( &d3dmMatrixPos, -320.0f, -240.0f, 0.0f );
	D3DXMatrixMultiply( &d3dmMatrixView, &d3dmMatrixView, &d3dmMatrixPos );
	D3DXMatrixScaling( &d3dmMatrixScale, 0.25f, 0.25f, 1.0f );
	D3DXMatrixMultiply( &d3dmMatrixView, &d3dmMatrixView, &d3dmMatrixScale );
	D3DXMatrixRotationZ( &d3dmMatrixZ, 0.0f * 3.14f * 180.f);
	D3DXMatrixMultiply( &d3dmMatrixView, &d3dmMatrixView, &d3dmMatrixZ );
	D3DXMatrixTranslation( &d3dmMatrixPos, 320.0f, 240.0f, 0.0f );
	D3DXMatrixMultiply( &d3dmMatrixView, &d3dmMatrixView, &d3dmMatrixPos );

決め打ちされてる値のうち、D3DXMatrixScalingとD3DXMatrixRotationZの関数の数値を弄れば回転や拡大が出来ます!
わーい、やったねw

あと自分はキャラクターの回転や拡大も変更する事になりました。
明日はそちらも合わせても綺麗に纏めて書き込もうと思います。

ああ
記事: 49
登録日時: 13年前
住所: 東京都

Re: 2Dカメラの実装について

#10

投稿記事 by ああ » 13年前

何か整理してたら、キャラクターの回転や拡大が出来なくなっちゃいました。
中心からずれてるんで、上手く行列を操作すれば良いと思うんだけど、もう4日も同じとこやっててモチベーションが下がりつつあるし、一応正射影変換は実装出来たので一旦他の作業しようと思います。

前の書き込みのソースでD3DXMatrixScalingの値が0.25fになってますが、1.0fが正しい倍率です。
テストして決め打ちしてたのがそのままになってました。

とりあえず、5と8に書いてあるソースコードを組み合わせれば、FVFの設定をD3DFVF_XYZの状態でスクリーン座標の値で操作出来るので、是非2D(空間)のゲームを作ろうと思ってる方は試してみて下さい。

このカメラを応用すれば、自分のプログラムは現在キャラの中心をカメラの中心にしてますが、イベント用の座標を用意して、そこまで距離を求めて速度を入れてあげれば、カメラを新しく登場にしたキャラに向けるなどの機能も簡単に作れるかなと、あと仲間など複数のキャラが画面内に納める事も出来ると思うで、是非活用してみて下さい。

また何かあれば書き込もうと思います。

返信

“DirectX SDK” へ戻る