DXライブラリで2画面

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

DXライブラリで2画面

#1

投稿記事 by ヒューガ » 13年前

http://www.nicovideo.jp/watch/sm14325468
上の動画のように2画面または4画面で3D空間を撮影するにはどうしたらいいでしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

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

#2

投稿記事 by h2so5 » 13年前

SetCameraScreenCenter関数で視点をずらして2回描画すれば実現できます。

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

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

#3

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

描画領域の制限にSetDrawArea()も必要かと思います。
「3Dで画面分割表示」
http://hpcgi2.nifty.com/natupaji/bbs/pa ... st&no=1417

※ 前のトピックが解決になっていませんのでお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ヒューガ

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

#4

投稿記事 by ヒューガ » 13年前

コード:

#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の大きさにしたいのですがどうすればいいでしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

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

#5

投稿記事 by h2so5 » 13年前

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

ヒューガ

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

#6

投稿記事 by ヒューガ » 13年前

コード:

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

#7

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

SetDrawArea毎の描画が必要です。
SetDrawAreaしたら、その画面に対して描画しないとダメですよ。

(1)SetDrawAreaとSetCameraScreenCenterで切り替える。
(2)カメラを設定する。
(3)モデルを描画する
でワンセットです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ヒューガ

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

#8

投稿記事 by ヒューガ » 13年前

コード:

#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どうこうっていうのがありますがこれを使うとややこしいことになりそうな気がするのと
ずっと書き出さなければならないので負荷がすごいことになるのではないかと思います。

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

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

#9

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

普通にやるには、2画面と同じ考えで4画面をやれば良いのですが、それではダメですか?

ちなみに、毎回MV1SetPositionは必要ないと思います。whileループ内に1回だけです。
あくまで描画の処理だけの問題ですので、描画と移動や回転、アニメーションとは別に考えて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ヒューガ

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

#10

投稿記事 by ヒューガ » 13年前

そのまま4分割するとカメラとの距離がそのままでは自機が元と同じようには映らないので、
そしてカメラとの距離はあまり動かしたくないというのもあります。

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

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

#11

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

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

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

【補足】
それと4分割とかで自機を大きく表示すると全体的な画面に表示される情報は相対的に少なく。
4画面時に1画面時と自機の大きさが同じなら、画面で見える情報は1/4です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ヒューガ

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

#12

投稿記事 by ヒューガ » 13年前

じゃあちょっと戦術が変わるということで割り切っちゃいましょう。

コード:

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

閉鎖

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