ページ 11

空間に画像を描画

Posted: 2012年7月28日(土) 10:15
by ヒューガ
画像を分割して読み込み、それを空間に表示させようと思っています。
DrawBillboard3D関数がありますがこれはずっとカメラのほうを向きます。
そうではなくてずっと一定の方向を向かせたいのです。
どうすればいいでしょうか?
あらかじめ分割してそれをポリゴンに貼りつけて読み込むしかないのでしょうか?

Re: 空間に画像を描画

Posted: 2012年7月28日(土) 10:47
by softya(ソフト屋)
カメラのビュー行列を行列演算して好きな方向に回転させる必要があります。
その行列で絵を貼ったポリゴン板を表示させることで可能です。

Re: 空間に画像を描画

Posted: 2012年7月28日(土) 11:12
by ヒューガ
えーと画像データだけで壁作ったり地面作ったりということなのですが・・・

Re: 空間に画像を描画

Posted: 2012年7月28日(土) 11:25
by softya(ソフト屋)
ヒューガ さんが書きました:えーと画像データだけで壁作ったり地面作ったりということなのですが・・・
最初にそういって貰えれば・・・。
地面や壁の生成は、DrawPolygon3D()やDrawPolygonIndexed3D()で出来ますが、画像分割というか画像の貼り付けの位置調整はUVマッピングで行います。

「DXライブラリ置き場 3D関係関数リファレンスページ」
http://homepage2.nifty.com/natupaji/DxL ... html#R14N7
「DXライブラリ置き場 3D関係関数リファレンスページ」
http://homepage2.nifty.com/natupaji/DxL ... html#R14N8

まぁ勉強になるんでやってみてください。
私はモデラーで作ったほうが楽だと思いますが地形を自動生成する場合はこの方法は避けて通れません。

Re: 空間に画像を描画

Posted: 2012年7月28日(土) 11:36
by ヒューガ
y座標0.0のところに平面的にひろげるだけです。
画像も元の大きさが縦横数千ピクセルなので分割しないとまずいです。
これ以外の方法はないのですか?

Re: 空間に画像を描画

Posted: 2012年7月28日(土) 11:44
by softya(ソフト屋)
ヒューガ さんが書きました:y座標0.0のところに平面的にひろげるだけです。
画像も元の大きさが縦横数千ピクセルなので分割しないとまずいです。
これ以外の方法はないのですか?
私は3Dでは無いと思います。
GPUの仕様上は数千ピクセルは辛いでしょうし、2の累乗数でないのもマズイです。

Re: 空間に画像を描画

Posted: 2012年7月28日(土) 13:34
by ヒューガ
メタセコで板を作って複製して並べてそれのテクスチャを書き換えるという方法をとります。
そこであらかじめ画像を分割したのですが読み込むときに

コード:

for(int i=0;i<100;i++){
	img[i]=LoadGraph("img_[i].png");
}
みたいな感じで連番画像を読み込む方法はないのでしょうか?

Re: 空間に画像を描画

Posted: 2012年7月28日(土) 13:45
by softya(ソフト屋)
ヒューガ さんが書きました:メタセコで板を作って複製して並べてそれのテクスチャを書き換えるという方法をとります。
そこであらかじめ画像を分割したのですが読み込むときに

コード:

for(int i=0;i<100;i++){
	img[i]=LoadGraph("img_[i].png");
}
みたいな感じで連番画像を読み込む方法はないのでしょうか?
spinrtfでファイル名文字列を作れば良いのではないでしょうか。
C++だとsstreamのstd::ostringstreamも使えます。

Re: 空間に画像を描画

Posted: 2012年7月28日(土) 16:40
by ヒューガ

コード:

#include "DxLib.h"
#include <stdio.h>
#define GROUND_MAX 100
int map[100];
int groundimg[100];
void map_sys(){
	for(int i=0;i<GROUND_MAX;i++){
		MV1SetPosition(map[i],VGet(200*(i%10),0.0f,200*(9-i/10)));
	}
}
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ){
    ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );
	char FileName[10];
	map[0]=MV1LoadModel("./ground/ground.mqo");
	for(int i=1;i<GROUND_MAX;i++){
		map[i]=MV1DuplicateModel(map[0]);
	}
	for(int i=0;i<GROUND_MAX;i++){
		sprintf(FileName,"./ground/mapimg_%03d",i+1);
		groundimg[i]=LoadGraph(FileName);
	}
    while( ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 ) {
		map_sys();
		for(int i=0;i<GROUND_MAX;i++){
			MV1SetTextureGraphHandle(map[i],0,groundimg[i],FALSE);
			MV1DrawModel(map[i]);
		}
		SetCameraPositionAndTarget_UpVecY(VGet(0.0f,100.0f,-300.0f),VGet(0.0f,0.0f,0.0f));
    }
 
    DxLib_End();
    return 0;
}
板は並ぶんですがテクスチャが変わらないです・・・
あと終了時に警告がでるのですがどうしてでしょう?

Re: 空間に画像を描画

Posted: 2012年7月28日(土) 17:00
by softya(ソフト屋)
とりあえず、文字列配列ですが理解されているか心配になりました。
char FileName[10]; ナル文字を合わせて10文字までしか格納できません。
sprintf(FileName,"./ground/mapimg_%03d",i+1); ファイル名はパスを合わせて10文字以上有ると思います。

【追記】
MV1DuplicateModelするとテクスチャは変更できない気がします。

Re: 空間に画像を描画

Posted: 2012年7月28日(土) 17:04
by ヒューガ
1桁ずれてました。
これで警告は出ないようになりましたがテクスチャはいまだに変わりません・・・

Re: 空間に画像を描画

Posted: 2012年7月28日(土) 17:08
by softya(ソフト屋)
ヒューガ さんが書きました:1桁ずれてました。
これで警告は出ないようになりましたがテクスチャはいまだに変わりません・・・
1つの場合だけでどうなるか確認して下さい。
問題があれば要素を減らして確認することはデバッグの基礎テクニックです。

Re: 空間に画像を描画

Posted: 2012年7月28日(土) 17:18
by ヒューガ
1つの場合だけでとは板1枚のみでどうなるかということでしょうか?

Re: 空間に画像を描画

Posted: 2012年7月28日(土) 17:20
by softya(ソフト屋)
ヒューガ さんが書きました:1つの場合だけでとは板1枚のみでどうなるかということでしょうか?
デバッグのために物事を単純化するのですのですから、そういう事です。
うまく言ったら2つにしてみます。

Re: 空間に画像を描画

Posted: 2012年7月28日(土) 17:29
by ヒューガ
テクスチャが変わっていません・・・

Re: 空間に画像を描画

Posted: 2012年7月28日(土) 17:40
by softya(ソフト屋)
ヒューガ さんが書きました:テクスチャが変わっていません・・・
Log.txtにエラーが出ていないか確認して下さい。

Re: 空間に画像を描画

Posted: 2012年7月28日(土) 17:51
by ヒューガ
拡張子が抜けてました。

コード:

#include "DxLib.h"
#include <stdio.h>
#define GROUND_MAX 100
int map[GROUND_MAX];
int groundimg[GROUND_MAX];
void map_sys(){
	for(int i=0;i<GROUND_MAX;i++){
		MV1SetPosition(map[i],VGet(200*(i%10),0.0f,200*(9-i/10)));
	}
}
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ){
    ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );
	char FileName[100];
	map[0]=MV1LoadModel("./ground/ground.mqo");
	for(int i=1;i<GROUND_MAX;i++){
		map[i]=MV1DuplicateModel(map[0]);
	}
	for(int i=0;i<GROUND_MAX;i++){
		sprintf(FileName,"./ground/mapimg_%03d.png",i+1);
		groundimg[i]=LoadGraph(FileName);
	}
    while( ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 ) {
		map_sys();
		for(int i=0;i<GROUND_MAX;i++){
			MV1SetTextureGraphHandle(map[i],0,groundimg[i],FALSE);
			MV1DrawModel(map[i]);
		}
		SetCameraPositionAndTarget_UpVecY(VGet(1000.0f,100.0f,-300.0f),VGet(1000.0f,0.0f,0.0f));
    }
 
    DxLib_End();
    return 0;
}
ありがとうございました。

Re: 空間に画像を描画

Posted: 2012年7月28日(土) 17:51
by ヒューガ
忘れてました。解決です。