DXライブラリで2画面
-
ヒューガ
DXライブラリで2画面
http://www.nicovideo.jp/watch/sm14325468
上の動画のように2画面または4画面で3D空間を撮影するにはどうしたらいいでしょうか?
上の動画のように2画面または4画面で3D空間を撮影するにはどうしたらいいでしょうか?
Re: DXライブラリで2画面
SetCameraScreenCenter関数で視点をずらして2回描画すれば実現できます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリで2画面
描画領域の制限にSetDrawArea()も必要かと思います。
「3Dで画面分割表示」
http://hpcgi2.nifty.com/natupaji/bbs/pa ... st&no=1417
※ 前のトピックが解決になっていませんのでお願いします。
「3Dで画面分割表示」
http://hpcgi2.nifty.com/natupaji/bbs/pa ... st&no=1417
※ 前のトピックが解決になっていませんのでお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
ヒューガ
Re: DXライブラリで2画面
#include "DxLib.h"
int model;
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ){
ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );
model=MV1LoadModel("test.mqo");
while( ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 ) {
MV1SetPosition(model,VGet(0.0f,0.0f,0.0f));
MV1DrawModel(model);
SetCameraPositionAndTarget_UpVecY(VGet(200.0f,0.0f,0.0f),VGet(0.0f,0.0f,0.0f));
SetDrawArea(0,0,320,480) ;
SetCameraScreenCenter(160.0f,240.0f);
SetCameraPositionAndTargetAndUpVec(VGet(0.0f,200.0f,0.0f),VGet(0.0f,0.0f,0.0f),VGet(1.0f,0.0f,0.0f));
SetDrawArea(320,0,640,480) ;
SetCameraScreenCenter(480.0f,240.0f);
}
DxLib_End();
return 0;
} あと4画面の時はそのままだと自分が全て映らないのでカメラを離すというのではなく、
カメラとの距離はそのままで元の画面の1/4の大きさにしたいのですがどうすればいいでしょうか?
Re: DXライブラリで2画面
1回しか描画していないですからねヒューガ さんが書きました: これだと右半分にしか映りません・・・
ぱっと思いつくのは、MakeScreenで作った画像に対して描画してDrawExtendGraphで1/4のサイズで描画する方法ですね。ヒューガ さんが書きました: あと4画面の時はそのままだと自分が全て映らないのでカメラを離すというのではなく、
カメラとの距離はそのままで元の画面の1/4の大きさにしたいのですがどうすればいいでしょうか?
-
ヒューガ
Re: DXライブラリで2画面
#include "DxLib.h"
int model;
int count;
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ){
ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );
model=MV1LoadModel("./F-22A/F-22A.pmd");
while( ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 ) {
MV1SetPosition(model,VGet(0.0f,0.0f,0.0f));
MV1DrawModel(model);
if(count%2==0){SetCameraPositionAndTarget_UpVecY(VGet(200.0f,0.0f,0.0f),VGet(0.0f,0.0f,0.0f));
SetDrawArea(0,0,320,480) ;
SetCameraScreenCenter(160.0f,240.0f);}
if(count%2==1){SetCameraPositionAndTargetAndUpVec(VGet(0.0f,200.0f,0.0f),VGet(0.0f,0.0f,0.0f),VGet(1.0f,0.0f,0.0f));
SetDrawArea(320,0,640,480) ;
SetCameraScreenCenter(480.0f,240.0f);}
count++;
}
DxLib_End();
return 0;
}- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリで2画面
SetDrawArea毎の描画が必要です。
SetDrawAreaしたら、その画面に対して描画しないとダメですよ。
(1)SetDrawAreaとSetCameraScreenCenterで切り替える。
(2)カメラを設定する。
(3)モデルを描画する
でワンセットです。
SetDrawAreaしたら、その画面に対して描画しないとダメですよ。
(1)SetDrawAreaとSetCameraScreenCenterで切り替える。
(2)カメラを設定する。
(3)モデルを描画する
でワンセットです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
ヒューガ
Re: DXライブラリで2画面
#include "DxLib.h"
int model;
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ){
ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );
model=MV1LoadModel("./F-22A/F-22A.pmd");
while( ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 ) {
SetDrawArea(0,0,320,480) ;
SetCameraScreenCenter(160.0f,240.0f);
SetCameraPositionAndTarget_UpVecY(VGet(200.0f,0.0f,0.0f),VGet(0.0f,0.0f,0.0f));
MV1SetPosition(model,VGet(0.0f,0.0f,0.0f));
MV1DrawModel(model);
SetDrawArea(320,0,640,480) ;
SetCameraScreenCenter(480.0f,240.0f);
SetCameraPositionAndTargetAndUpVec(VGet(0.0f,200.0f,0.0f),VGet(0.0f,0.0f,0.0f),VGet(1.0f,0.0f,0.0f));
MV1SetPosition(model,VGet(0.0f,0.0f,0.0f));
MV1DrawModel(model);
}
DxLib_End();
return 0;
}4画面ですがMakeScreen関数のリファレンスを見るとSetDrawScreenどうこうっていうのがありますがこれを使うとややこしいことになりそうな気がするのと
ずっと書き出さなければならないので負荷がすごいことになるのではないかと思います。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリで2画面
普通にやるには、2画面と同じ考えで4画面をやれば良いのですが、それではダメですか?
ちなみに、毎回MV1SetPositionは必要ないと思います。whileループ内に1回だけです。
あくまで描画の処理だけの問題ですので、描画と移動や回転、アニメーションとは別に考えて下さい。
ちなみに、毎回MV1SetPositionは必要ないと思います。whileループ内に1回だけです。
あくまで描画の処理だけの問題ですので、描画と移動や回転、アニメーションとは別に考えて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
ヒューガ
Re: DXライブラリで2画面
そのまま4分割するとカメラとの距離がそのままでは自機が元と同じようには映らないので、
そしてカメラとの距離はあまり動かしたくないというのもあります。
そしてカメラとの距離はあまり動かしたくないというのもあります。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリで2画面
それは無い物ねだりだと思います。ヒューガ さんが書きました:そのまま4分割するとカメラとの距離がそのままでは自機が元と同じようには映らないので、
そしてカメラとの距離はあまり動かしたくないというのもあります。
大きくするには何かを犠牲にして下さい。
・カメラをズームアップする → 画角が変わる、カメラ画角の変更。
・別スクリーンに描画して拡大描画 → 上下左右が切り取られる。遅くなる。
・カメラを寄せる。 → カメラ座標パラメータの変更。
どれかしか方法はありません。
それにカメラとの距離を動かしたくない理由が不明なのですが・・・。
3Dゲームというは、カメラを制御してこそなんですけどね。
【補足】
それと4分割とかで自機を大きく表示すると全体的な画面に表示される情報は相対的に少なく。
4画面時に1画面時と自機の大きさが同じなら、画面で見える情報は1/4です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
ヒューガ
Re: DXライブラリで2画面
じゃあちょっと戦術が変わるということで割り切っちゃいましょう。
ありがとうございました。
#include "DxLib.h"
int model;
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ){
ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );
model=MV1LoadModel("test.mqo");
while( ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 ) {
MV1SetPosition(model,VGet(0.0f,0.0f,0.0f));
SetDrawArea(0,0,320,240) ;
SetCameraScreenCenter(160.0f,120.0f);
SetCameraPositionAndTarget_UpVecY(VGet(300.0f,0.0f,0.0f),VGet(0.0f,0.0f,0.0f));
MV1DrawModel(model);
SetDrawArea(320,0,640,240) ;
SetCameraScreenCenter(480.0f,120.0f);
SetCameraPositionAndTargetAndUpVec(VGet(0.0f,300.0f,0.0f),VGet(0.0f,0.0f,0.0f),VGet(1.0f,0.0f,0.0f));
MV1DrawModel(model);
SetDrawArea(0,240,320,480) ;
SetCameraScreenCenter(160.0f,360.0f);
SetCameraPositionAndTargetAndUpVec(VGet(0.0f,0.0f,300.0f),VGet(0.0f,0.0f,0.0f),VGet(0.0f,1.0f,0.0f));
MV1DrawModel(model);
SetDrawArea(320,240,640,480) ;
SetCameraScreenCenter(480.0f,360.0f);
SetCameraPositionAndTargetAndUpVec(VGet(0.0f,0.0f,-300.0f),VGet(0.0f,0.0f,0.0f),VGet(0.0f,1.0f,0.0f));
MV1DrawModel(model);
}
DxLib_End();
return 0;
}