DXライブラリ:テクスチャの入れ替え

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

DXライブラリ:テクスチャの入れ替え

#1

投稿記事 by Ma » 15年前

DXライブラリVC++で、3D空間にアニメエフェクトを作ろうとしているものです、
強力な静電気を表現しようと思ってはじめました。

そこで、3Dで表示するのは面倒そうなので3D空間に2Dアニメーションを表示にすることにしました。
2Dアニメーションの経験はある程度あります。(2Dゲームでアニメーション作るぐらいなら楽勝)

が、3Dにきてつまずきました。

方法1:テクスチャをいれかえる。
 MV1SetTextureGraphHandle(charge_light, textIndex, lightning[index%16], FALSE) ;
を使おうとしたのですが、どうも変わらない。
戻り値は0。
以下、引数説明
 int MHandle : モデルのハンドル
  には、int charge_light = MV1LoadModel("materials/lightning.mqo");
  こんな感じでロードした charge_lightを指定。
 int GrHandle : テクスチャとして使用するグラフィックハンドル
  には、ちゃんと、64×64の画像。LoadDivGraph でpngを、ロードしたハンドル。
  lightning[index%16]
  こんな感じで指定。indexは毎フレーム増加
 int TexIndex : テクスチャの番号
  には
  int textIndex = MV1GetMaterialDifMapTexture(charge_light, 0);
  こんな感じで取得した番号を指定。

方法2:フレームの利用。
 UV操作でメタセコがうまく使えないorz
 これ、未経験者には操作がかなり難しいです。


方法3:画像をファイル単位で分割、mqoをアニメのこま数だけ容易。
 確実にできるけど、一番よくない方法だと思う。

こんな状況です。解決策教えてください。

Justy

Re:DXライブラリ:テクスチャの入れ替え

#2

投稿記事 by Justy » 15年前

 何かが間違っているのだと思いますが、それだけでは検討もつきません。
 状況を再現可能な素材込みの小規模なプロジェクト一式をアップしてみてはどうでしょうか。

Ma

無題

#3

投稿記事 by Ma » 15年前

Justy さん、返信ありがとうございます。
ちょっと遅れてすみません。

新しいプロジェクトでやってみたら、なぜか成功しました。
何が違うのか比べて、もう少しがんばってみます。

それでも分からなかったらもう一度よろしくお願いします。

Ma

おそらくバグ

#4

投稿記事 by Ma » 15年前

おそらく、LoadDivGraphでロードした画像をテクスチャに指定すると、画像全体が指定されてしまうようです。
どうやら、DXライブラリのバグのようなので本家のほうで報告してみます。

以下テストコードです。
#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    int ModelHandle ;
    int GrHandle ;
    int divGrHandle[4];
    int TexIndex ;

    ChangeWindowMode(TRUE);

    // DXライブラリの初期化
    if( DxLib_Init() < 0 )
    {
        // エラーが発生したら直ちに終了
        return -1 ;
    }
    

    // 画像の読みこみ
    GrHandle = LoadGraph( "materials/25.JPG" ) ;
    LoadDivGraph("materials/coin.jpg",4,2,2,128,128,divGrHandle);


    // 3Dモデルの読み込み
    ModelHandle = MV1LoadModel( "materials/sky_test3.mqo" ) ;

    // モデルを画面に映る位置に移動
    MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 400.0f ) ) ;

    // テクスチャの番号を取得
    TexIndex = MV1GetMaterialDifMapTexture( ModelHandle, 0 ) ;

    // モデルを描画する
    MV1DrawModel( ModelHandle ) ;
    ScreenFlip();
    WaitKey();

    for(int i = 0;i < 10; i++){
        // テクスチャで使用するグラフィックハンドルを変更する
        MV1SetTextureGraphHandle( ModelHandle, TexIndex, divGrHandle[i%4], FALSE ) ;

        // モデルを描画する
        MV1DrawModel( ModelHandle ) ;
        ScreenFlip();
        printfDx("LoadDivGraphでロードしたものをテクスチャに指定。\n");
        WaitKey();

    }

    
    // テクスチャで使用するグラフィックハンドルを変更する
    MV1SetTextureGraphHandle( ModelHandle, TexIndex, GrHandle, FALSE ) ;

    // モデルを描画する
    MV1DrawModel( ModelHandle ) ;
    ScreenFlip();
    printfDx("LoadGraphでロードしたものをテクスチャに指定。\n");

    // キー入力待ち
    WaitKey() ;
    

    // DXライブラリの後始末
    DxLib_End() ;

    // ソフトの終了
    return 0 ;
}

Justy

Re:おそらくバグ

#5

投稿記事 by Justy » 15年前

 あー、分割テクスチャは非対応なのかも。

 テクスチャも2Dの時にはなかった2のべき乗制限とかありますから、
2Dの時ほど柔軟にテクスチャ扱えるようになるにはもうしばし時が必要かもしれません。

閉鎖

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