メタセコイアで作成した3DモデルをDXライブラリで表示したのですが、
テクスチャが正しく反映されてくれません。
一部の色のみが映る形になってしまっています。(たとえば茶色と緑の床のテクスチャを貼ったモデルを表示させると茶色のみが床一面に広がります)
メタセコ上では正しく表示されています。
試しに画像のサイズ、種類等変えてみましたが結果は変わりませんでした。
また、一応一部の色は反映されているので、画像データの場所の置き間違いではなさそうです。
ちなみに、DXライブラリのホームページで紹介されているKabeTex.bmpを床のモデルに貼り付けてみたところ、
端のほうだけ赤くて中心にいくにつれて白くなっていく模様になってしまいました。
どなたか解決方法が分かる方はいますでしょうか?
モデルのテクスチャ
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: モデルのテクスチャ
とりあえず、DXLIBに付属しているDxLibModelViewer.exeだと表示はどうなりますか?
それで異常がないのなら、DXLIBの使い方の問題となります。
それで異常がないのなら、DXLIBの使い方の問題となります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
リア
Re: モデルのテクスチャ
stage.xとstage.mqoの二種類で試してみたところ、softya(ソフト屋) さんが書きました:とりあえず、DXLIBに付属しているDxLibModelViewer.exeだと表示はどうなりますか?
それで異常がないのなら、DXLIBの使い方の問題となります。
stage.x・・・全モデルは表示されるがテクスチャが反映されません。自分で組んだプログラム内でも同様でした。
stage.mqo・・・DxLibModelViewer.exe内ではモデル、テクスチャ表示ともに正常でしたが、自分で組んだプログラム内ではテクスチャが反映されない&一部のモデルが表示されませんでした。
やはり私のプログラムの組み方の問題ですかね?
もう少し自分でいじってみて、それでもうまくいかないようであればコード載せます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: モデルのテクスチャ
stage.xに関してはテクスチャの貼り方の問題だと思います。
stage.mqoは確実にリア さんのコードに3D関係の設定周りに問題あるんだと思います。
stage.mqoは確実にリア さんのコードに3D関係の設定周りに問題あるんだと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
リア
Re: モデルのテクスチャ
サンプルプログラム 3Dアクション基本のステージモデル(ColTestStage.mqo)をお借りしても同じような結果になってしまいました。softya(ソフト屋) さんが書きました:stage.xに関してはテクスチャの貼り方の問題だと思います。
stage.mqoは確実にリア さんのコードに3D関係の設定周りに問題あるんだと思います。
//-----------------------------------------------------
// クラス名 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: モデルのテクスチャ
とりあえず、このMGetScale(VGet(5000,5000,5000));//スケールって何のためでしょうか?ステージを5000倍も拡大する必要性が無いと思いますよ。
現状のコードだと、この5000倍もの拡大で電子顕微鏡で見たみたいに超拡大されていますが、これが問題なのではないですか?
現状のコードだと、この5000倍もの拡大で電子顕微鏡で見たみたいに超拡大されていますが、これが問題なのではないですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
リア
Re: モデルのテクスチャ
スケールを変更したらきちんと表示されました!softya(ソフト屋) さんが書きました:とりあえず、このMGetScale(VGet(5000,5000,5000));//スケールって何のためでしょうか?ステージを5000倍も拡大する必要性が無いと思いますよ。
現状のコードだと、この5000倍もの拡大で電子顕微鏡で見たみたいに超拡大されていますが、これが問題なのではないですか?
stage.xとstage.mqoのスケールが違うのが原因だったみたいです・・・
ご指摘ありがとうございました!