ページ 11

DXライブラリで2画面

Posted: 2012年7月25日(水) 20:38
by ヒューガ
http://www.nicovideo.jp/watch/sm14325468
上の動画のように2画面または4画面で3D空間を撮影するにはどうしたらいいでしょうか?

Re: DXライブラリで2画面

Posted: 2012年7月25日(水) 21:27
by h2so5
SetCameraScreenCenter関数で視点をずらして2回描画すれば実現できます。

Re: DXライブラリで2画面

Posted: 2012年7月25日(水) 21:49
by softya(ソフト屋)
描画領域の制限にSetDrawArea()も必要かと思います。
「3Dで画面分割表示」
http://hpcgi2.nifty.com/natupaji/bbs/pa ... st&no=1417

※ 前のトピックが解決になっていませんのでお願いします。

Re: DXライブラリで2画面

Posted: 2012年7月26日(木) 05:04
by ヒューガ

コード:

#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画面

Posted: 2012年7月26日(木) 06:37
by h2so5
ヒューガ さんが書きました: これだと右半分にしか映りません・・・
1回しか描画していないですからね
ヒューガ さんが書きました: あと4画面の時はそのままだと自分が全て映らないのでカメラを離すというのではなく、
カメラとの距離はそのままで元の画面の1/4の大きさにしたいのですがどうすればいいでしょうか?
ぱっと思いつくのは、MakeScreenで作った画像に対して描画してDrawExtendGraphで1/4のサイズで描画する方法ですね。

Re: DXライブラリで2画面

Posted: 2012年7月26日(木) 10:25
by ヒューガ

コード:

#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;
}
映りましたがちらつきがひどいです

Re: DXライブラリで2画面

Posted: 2012年7月26日(木) 11:02
by softya(ソフト屋)
SetDrawArea毎の描画が必要です。
SetDrawAreaしたら、その画面に対して描画しないとダメですよ。

(1)SetDrawAreaとSetCameraScreenCenterで切り替える。
(2)カメラを設定する。
(3)モデルを描画する
でワンセットです。

Re: DXライブラリで2画面

Posted: 2012年7月26日(木) 12:16
by ヒューガ

コード:

#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;
}
2画面分割はできました。
4画面ですがMakeScreen関数のリファレンスを見るとSetDrawScreenどうこうっていうのがありますがこれを使うとややこしいことになりそうな気がするのと
ずっと書き出さなければならないので負荷がすごいことになるのではないかと思います。

Re: DXライブラリで2画面

Posted: 2012年7月26日(木) 12:19
by softya(ソフト屋)
普通にやるには、2画面と同じ考えで4画面をやれば良いのですが、それではダメですか?

ちなみに、毎回MV1SetPositionは必要ないと思います。whileループ内に1回だけです。
あくまで描画の処理だけの問題ですので、描画と移動や回転、アニメーションとは別に考えて下さい。

Re: DXライブラリで2画面

Posted: 2012年7月26日(木) 12:39
by ヒューガ
そのまま4分割するとカメラとの距離がそのままでは自機が元と同じようには映らないので、
そしてカメラとの距離はあまり動かしたくないというのもあります。

Re: DXライブラリで2画面

Posted: 2012年7月26日(木) 12:45
by softya(ソフト屋)
ヒューガ さんが書きました:そのまま4分割するとカメラとの距離がそのままでは自機が元と同じようには映らないので、
そしてカメラとの距離はあまり動かしたくないというのもあります。
それは無い物ねだりだと思います。
大きくするには何かを犠牲にして下さい。
・カメラをズームアップする → 画角が変わる、カメラ画角の変更。
・別スクリーンに描画して拡大描画 → 上下左右が切り取られる。遅くなる。
・カメラを寄せる。  → カメラ座標パラメータの変更。
どれかしか方法はありません。

それにカメラとの距離を動かしたくない理由が不明なのですが・・・。
3Dゲームというは、カメラを制御してこそなんですけどね。

【補足】
それと4分割とかで自機を大きく表示すると全体的な画面に表示される情報は相対的に少なく。
4画面時に1画面時と自機の大きさが同じなら、画面で見える情報は1/4です。

Re: DXライブラリで2画面

Posted: 2012年7月26日(木) 13:05
by ヒューガ
じゃあちょっと戦術が変わるということで割り切っちゃいましょう。

コード:

#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;
}
ありがとうございました。