2Dカメラの実装について。
詳細はNNKさんの最初の投稿をご確認ください。
※10/26 20:15
管理人がタイトルと文章を変更しました。
今後は基本は一つの質問につき1スレ作成していただくようお願い致します。
2Dカメラの実装について
Re: 2Dカメラの実装について
では早速日記でも書いてるのですが。
現在DirectXを使用して自作のゲームを制作しておりまして、2Dの横スクロールなのでメッシュなど3Dの機能は省いて、2Dのみでプログラミングしていきたいと思っております。
DirectXを使用してる理由は派手なエフェクトとカメラを使って画面にスピード感などの演出をしたいからです。
一応やりたい事を記述すると
1.左右上下の移動とズームも自由にしたいので出来る、3D空間でのカメラ操作を可能にする。
2・ゲーム自体は2Dなので、キャラなどオブジェクトをスクリーン座標での値で操作する。
3・尚且つ、回転や拡大もキャラなどオブジェクトが出来るようにする。
で現在FVFをD3DFVF_XYZに設定して行列を計算した結果をSetTransformでワールド空間に描画してます。
カメラも自由に操作出来、キャラやオブジェクトも自由に回転や拡大出来るようになっているが、スクリーン座標での値で操作出来ない。
ですが正射影変換にすればスクリーン座標で指定出来るが、カメラが固定されるので自由が利かない。
逆にFVFをD3DFVF_XYZRHWにした場合スクリーン座標で指定出来るけど、SetTransformが使えないので回転や拡大は別に計算しなければならない上に、カメラの制御もできないので、何とかD3DFVF_XYZでスクリーン座標の値で自由に操作したいんです。
やりたい事が成立するならばD3DFVF_XYZでもD3DFVF_XYZRHWでも構わないんですが、分かる方がいれば是非ご教授お願い致します。
現在DirectXを使用して自作のゲームを制作しておりまして、2Dの横スクロールなのでメッシュなど3Dの機能は省いて、2Dのみでプログラミングしていきたいと思っております。
DirectXを使用してる理由は派手なエフェクトとカメラを使って画面にスピード感などの演出をしたいからです。
一応やりたい事を記述すると
1.左右上下の移動とズームも自由にしたいので出来る、3D空間でのカメラ操作を可能にする。
2・ゲーム自体は2Dなので、キャラなどオブジェクトをスクリーン座標での値で操作する。
3・尚且つ、回転や拡大もキャラなどオブジェクトが出来るようにする。
で現在FVFをD3DFVF_XYZに設定して行列を計算した結果をSetTransformでワールド空間に描画してます。
カメラも自由に操作出来、キャラやオブジェクトも自由に回転や拡大出来るようになっているが、スクリーン座標での値で操作出来ない。
ですが正射影変換にすればスクリーン座標で指定出来るが、カメラが固定されるので自由が利かない。
逆にFVFをD3DFVF_XYZRHWにした場合スクリーン座標で指定出来るけど、SetTransformが使えないので回転や拡大は別に計算しなければならない上に、カメラの制御もできないので、何とかD3DFVF_XYZでスクリーン座標の値で自由に操作したいんです。
やりたい事が成立するならばD3DFVF_XYZでもD3DFVF_XYZRHWでも構わないんですが、分かる方がいれば是非ご教授お願い致します。
Re: 2Dカメラの実装について
これは私も興味あったので試してみました。
こういう感じのでよかったでしょうか?(間違っていたらすいません)
[BBvideo 425,350]http://www.nicovideo.jp/watch/sm12541374[/BBvideo]
上の動画ではID3DXSpriteインターファイスを使用したのでそれ以外ではあんまり参考にならないかもしれませんが、私はまずカメラのクラスを作りそこにカメラの現在地、ズーム(拡大)、回転を合わせたマトリックスを出す関数を用意しました(位置はスクリーン座標で)。
そしてID3DXSpriteのBegin()を呼ぶ時にカメラのマトリックスを保存し、End()が呼ばれるまでの間に描画される全てのスプライトにこのマトリックスを適用しました。
言葉だけだと分かりずらい思うので描画の関数を載せときます:
かなり長く、しかも分かりにくくなりましたが、もし欲しい情報と違かった場合は申してください。あと、最近日本語が壊滅的なのでどこか変だったら指摘してください。 m_ _m
こういう感じのでよかったでしょうか?(間違っていたらすいません)
[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 );
}
“Good code is its own best documentation.” (Steve McConnell)
Re: 2Dカメラの実装について
お返事ありがとう御座います。
動画拝見させて頂きましたが、まさに私がしたい事です!
上手く実装してみます!!
にしても本当に素晴らしいコミュニティですね^^
ずっとお互いの技術を交換して、高め合う場があれば良いなぁ~と思ってたのですが、ゲームプログラミングがより一層楽しめそうです。
これからは、簡単な事でも自分が躓いたところや工夫したところを載せて、皆のゲームクリエイトライフが充実するようになると良いなぁって思います。
動画拝見させて頂きましたが、まさに私がしたい事です!
上手く実装してみます!!
にしても本当に素晴らしいコミュニティですね^^
ずっとお互いの技術を交換して、高め合う場があれば良いなぁ~と思ってたのですが、ゲームプログラミングがより一層楽しめそうです。
これからは、簡単な事でも自分が躓いたところや工夫したところを載せて、皆のゲームクリエイトライフが充実するようになると良いなぁって思います。
Re: 2Dカメラの実装について
>>大熊猫さん。
回答ありがとうございます
私も非常に助かりましたし、参考になりました^^
>>NNKさん。
今回の質問は私も勉強になりました。
これからお互いどんどん技術を向上させていきたいですね^^
回答ありがとうございます
私も非常に助かりましたし、参考になりました^^
>>NNKさん。
今回の質問は私も勉強になりました。
これからお互いどんどん技術を向上させていきたいですね^^
oui C'est la Vie♪
Re: 2Dカメラの実装について
どうも日記にも書いたんですが、せっかく大熊猫さんに教わったのですが正射影変換にする事にしました(^^;
とりあえずソースコード
上記のソースをコピペすればスクリーン座標で値を操作可能です(はず)。
一部の引数などは各々のプログラムに合わせる必要ですが、下記に一応説明しますね。
in_dev9 LPDIRECT3DDEVICE9
update カメラの座標とviewPointを更新する関数
getLoc カメラの現在座標を取得する関数
viewPoint 写す先の座標(自分のプログラムでは操作するキャラクター)
d3dv3Up ワールド空間でのカメラの上方向を示す座標
まぁこんな感じですかね?
ただD3DXMatrixScalingを使うと変な風に拡大するので、誰か行列変換に詳しい人いたらご指導お願い致します><
とりあえずソースコード
// ローカル変数の宣言
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を使うと変な風に拡大するので、誰か行列変換に詳しい人いたらご指導お願い致します><
Re: 2Dカメラの実装について
すいません、上記の問題簡単に解決しましたw
後ほどまとめたのを書きますね!
今日中にやるか分かりませんがw
3Dカメラで2Dゲーム作りたい人には凄く助かると思うんだけど、この問題で悩んでるのって俺ぐらいなのかな?w
後ほどまとめたのを書きますね!
今日中にやるか分かりませんがw
3Dカメラで2Dゲーム作りたい人には凄く助かると思うんだけど、この問題で悩んでるのって俺ぐらいなのかな?w
Re: 2Dカメラの実装について
では寝る前に決め打ちですが、前回のソースの
D3DXMatrixLookAtLH( &matView, &getLoc(), &viewPoint, &d3dv3Up );
と
in_dev9->SetTransform( D3DTS_VIEW, &matView );
の間に下記のソースを追加して、マトリックスを
d3dmMatrixPos, d3dmMatrixScale, d3dmMatrixZ
このみっつ追加して下さい。
決め打ちされてる値のうち、D3DXMatrixScalingとD3DXMatrixRotationZの関数の数値を弄れば回転や拡大が出来ます!
わーい、やったねw
あと自分はキャラクターの回転や拡大も変更する事になりました。
明日はそちらも合わせても綺麗に纏めて書き込もうと思います。
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
あと自分はキャラクターの回転や拡大も変更する事になりました。
明日はそちらも合わせても綺麗に纏めて書き込もうと思います。
Re: 2Dカメラの実装について
何か整理してたら、キャラクターの回転や拡大が出来なくなっちゃいました。
中心からずれてるんで、上手く行列を操作すれば良いと思うんだけど、もう4日も同じとこやっててモチベーションが下がりつつあるし、一応正射影変換は実装出来たので一旦他の作業しようと思います。
前の書き込みのソースでD3DXMatrixScalingの値が0.25fになってますが、1.0fが正しい倍率です。
テストして決め打ちしてたのがそのままになってました。
とりあえず、5と8に書いてあるソースコードを組み合わせれば、FVFの設定をD3DFVF_XYZの状態でスクリーン座標の値で操作出来るので、是非2D(空間)のゲームを作ろうと思ってる方は試してみて下さい。
このカメラを応用すれば、自分のプログラムは現在キャラの中心をカメラの中心にしてますが、イベント用の座標を用意して、そこまで距離を求めて速度を入れてあげれば、カメラを新しく登場にしたキャラに向けるなどの機能も簡単に作れるかなと、あと仲間など複数のキャラが画面内に納める事も出来ると思うで、是非活用してみて下さい。
また何かあれば書き込もうと思います。
中心からずれてるんで、上手く行列を操作すれば良いと思うんだけど、もう4日も同じとこやっててモチベーションが下がりつつあるし、一応正射影変換は実装出来たので一旦他の作業しようと思います。
前の書き込みのソースでD3DXMatrixScalingの値が0.25fになってますが、1.0fが正しい倍率です。
テストして決め打ちしてたのがそのままになってました。
とりあえず、5と8に書いてあるソースコードを組み合わせれば、FVFの設定をD3DFVF_XYZの状態でスクリーン座標の値で操作出来るので、是非2D(空間)のゲームを作ろうと思ってる方は試してみて下さい。
このカメラを応用すれば、自分のプログラムは現在キャラの中心をカメラの中心にしてますが、イベント用の座標を用意して、そこまで距離を求めて速度を入れてあげれば、カメラを新しく登場にしたキャラに向けるなどの機能も簡単に作れるかなと、あと仲間など複数のキャラが画面内に納める事も出来ると思うで、是非活用してみて下さい。
また何かあれば書き込もうと思います。