モデルのテクスチャ

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

モデルのテクスチャ

#1

投稿記事 by リア » 14年前

メタセコイアで作成した3DモデルをDXライブラリで表示したのですが、
テクスチャが正しく反映されてくれません。
一部の色のみが映る形になってしまっています。(たとえば茶色と緑の床のテクスチャを貼ったモデルを表示させると茶色のみが床一面に広がります)
メタセコ上では正しく表示されています。
試しに画像のサイズ、種類等変えてみましたが結果は変わりませんでした。
また、一応一部の色は反映されているので、画像データの場所の置き間違いではなさそうです。

ちなみに、DXライブラリのホームページで紹介されているKabeTex.bmpを床のモデルに貼り付けてみたところ、
端のほうだけ赤くて中心にいくにつれて白くなっていく模様になってしまいました。

どなたか解決方法が分かる方はいますでしょうか?

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

Re: モデルのテクスチャ

#2

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

とりあえず、DXLIBに付属しているDxLibModelViewer.exeだと表示はどうなりますか?
それで異常がないのなら、DXLIBの使い方の問題となります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

リア

Re: モデルのテクスチャ

#3

投稿記事 by リア » 14年前

softya(ソフト屋) さんが書きました:とりあえず、DXLIBに付属しているDxLibModelViewer.exeだと表示はどうなりますか?
それで異常がないのなら、DXLIBの使い方の問題となります。
stage.xとstage.mqoの二種類で試してみたところ、

stage.x・・・全モデルは表示されるがテクスチャが反映されません。自分で組んだプログラム内でも同様でした。
stage.mqo・・・DxLibModelViewer.exe内ではモデル、テクスチャ表示ともに正常でしたが、自分で組んだプログラム内ではテクスチャが反映されない&一部のモデルが表示されませんでした。

やはり私のプログラムの組み方の問題ですかね?
もう少し自分でいじってみて、それでもうまくいかないようであればコード載せます。

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

Re: モデルのテクスチャ

#4

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

stage.xに関してはテクスチャの貼り方の問題だと思います。
stage.mqoは確実にリア さんのコードに3D関係の設定周りに問題あるんだと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

リア

Re: モデルのテクスチャ

#5

投稿記事 by リア » 14年前

softya(ソフト屋) さんが書きました:stage.xに関してはテクスチャの貼り方の問題だと思います。
stage.mqoは確実にリア さんのコードに3D関係の設定周りに問題あるんだと思います。
サンプルプログラム 3Dアクション基本のステージモデル(ColTestStage.mqo)をお借りしても同じような結果になってしまいました。

コード:

//-----------------------------------------------------
//    クラス名 c_stage
//		背景のクラス
//-----------------------------------------------------

void c_stage::ini(){

	SetBackgroundColor(150,150,255);

	SetTextureAddressMode( DX_TEXADDRESS_CLAMP ) ;

	StageHandle = MV1LoadModel( "dat/img/ColTestStage.mqo" );

	ChangeLightTypeDir( VGet( -1.0f, -1.0f, -1.0f ));//ライト設定
	// X軸にマイナス方向のディレクショナルタイプのライトの作成
	LightHandle = CreateDirLightHandle( VGet( 1.0f, 1.0f, 1.0f));

}

void c_stage::draw(){
	int i;

	MV1DrawModel( StageHandle);

	//for(i=0;i<101;i++)
		//DrawLine3D( VGet((float)i*100.0f,0.0f,0.0f), VGet((float)i*100,0.0f,10000.0f),GetColor(255,255,255));
	//for(i=0;i<101;i++)
		//DrawLine3D( VGet(0.0f,0.0f,(float)i*100.0f), VGet(10000.0f,0.0f,(float)i*100),GetColor(255,255,255));

}

void c_stage::Check(){

}

void c_stage::Move(){

	mat = MGetScale(VGet(5000,5000,5000));//スケール
	MV1SetMatrix( StageHandle, mat );//行列セット

}

コード:

#define GLOBAL_INSTANCE 
#include "../header/Vase.h"
#define PI 3.1415
 
int i,j;
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
    SetDrawScreen( DX_SCREEN_BACK );        //裏画面に設定	 

	funcstate=0;
 
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll_2( Key ) && !Key[KEY_INPUT_ESCAPE]){
              //↑メッセージ処理         ↑画面をクリア          ↑キーボード入力状態取得       ↑ESCが押されていない		
		// 画面をクリア
		ClearDrawScreen();

		switch(funcstate){
			case 0:
				funcstate=99;
				break;
  
			case 99:
				ch.ini();
				st.ini();
				funcstate=100;
				break;
	
			case 100:
				ch.Check();
				st.Check();

				ch.Move();
				st.Move();
				ca.Move(ch);

				st.draw();
				ch.draw();
				break;
		}
		
        ScreenFlip();//裏画面を表画面に反映
	}
 
    DxLib_End();
    return 0;
}
ステージ関連のコードはこんな感じです。
床以外の表示ができなくて、床のテクスチャも完全な表示ができませんでした。

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

Re: モデルのテクスチャ

#6

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

とりあえず、このMGetScale(VGet(5000,5000,5000));//スケールって何のためでしょうか?ステージを5000倍も拡大する必要性が無いと思いますよ。
現状のコードだと、この5000倍もの拡大で電子顕微鏡で見たみたいに超拡大されていますが、これが問題なのではないですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

リア

Re: モデルのテクスチャ

#7

投稿記事 by リア » 14年前

softya(ソフト屋) さんが書きました:とりあえず、このMGetScale(VGet(5000,5000,5000));//スケールって何のためでしょうか?ステージを5000倍も拡大する必要性が無いと思いますよ。
現状のコードだと、この5000倍もの拡大で電子顕微鏡で見たみたいに超拡大されていますが、これが問題なのではないですか?
スケールを変更したらきちんと表示されました!
stage.xとstage.mqoのスケールが違うのが原因だったみたいです・・・
ご指摘ありがとうございました!

閉鎖

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