- ベストアンサー
DirectX テクスチャの拡大
こんばんは。最近DirectXを始めたばかりの初心者です。 開発環境はWindows XP + Visual Studio 2005です。 テクスチャを読み込んでスプライトで表示しているのですが、 拡大・縮小をする場合に指定した位置に行かずずれて表示されてしまいます。 色々なサンプルを見てもよくわかりません。 方法をご回答頂けると嬉しいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
また、遅くなりました。 そうですね、簡単な例を使えば、 >D3DXMatrixScaling(&Mat1, 1.5, 1, 1); つい先日返答してくれたソースのこれの第二引数と第三引数が それにあたります。 つまり、スプライト描画するテクスチャのサイズを拡大して (この場合横1.5倍、縦1.0倍)表示してくれるのです。 まあ、微妙な回答で申し訳ない。 後、俺の記述したソースの D3DXMatrixTransformation2D( &Mat, NULL, 0, &vec2, NULL,//この部分(D3DXVECTOR2 型)回転の中心座標 0,//この部分(float 型)回転角度(ラジアン) NULL ); 「この部分」って記述してあるところの数値を変更してみると 回転(角度の変更も可能でした。) 最後ですが俺もいい勉強になりました。 ありがとうございます。
その他の回答 (2)
- koedame
- ベストアンサー率33% (10/30)
ずいぶんお待たせしました。 ってもう自分で処理したよって・・・ orz そうでしたか。 まあ俺の研究を少し書き示します。 エーとこちらはあなたが返信いただいたものですが変更部分を まず書き示します。 LPDIRECT3DTEXTURE9 pTexture; // テクスチャ D3DXVECTOR3 Vec3Pos; // 表示位置 D3DXVECTOR2 Vec2Scale; // 拡大 D3DXMATRIX Mat; D3DXMatrixTransformation2D(&Mat, NULL, 0, &Vec2Scale, NULL, 0, NULL); pSprite->SetTransform(&Mat); pSprite->Draw(pTexture, NULL, NULL, &Vec3Pos, 0xFFFFFFFF); 私の研究では変更部分は D3DXMatrixTransformation2D() の第4引数Vec2Scale の値を変えてみてください。 Vec2Scale.x = 1.0;//1.0 は現尺2.5なら2.5倍の横幅に変化 Vec2Scale.y = 1.0;//1.0 は現尺2.5なら2.5倍の縦幅に変化 のようにやってみてください。 ちなみに私のソースみたいなものをコピペしときます。 それでも駄目ならもう一度返信してください。 LPD3DXSPRITE pSprite;//スプライトインターフェイス LPDIRECT3DTEXTURE9 pTexture;//スプライトに使うテクスチャー D3DXMATRIX Mat; D3DXVECTOR2 vec2; //拡大率 vec2.x = 1.5; vec2.y = 1; D3DXMatrixTransformation2D( &Mat, NULL, 0, &vec2, NULL, 0, NULL ); pSprite->SetTransform(&Mat); pSprite->Draw( pTexture, NULL, NULL, &Position, D3DCOLOR_ARGB(255,255,255,255) ); 出来る限りNULL とかで関係ない部分を削除しましたので わかると思います。
補足
ご回答ありがとうございます。 なんだか適当にやっていたら出来てしまいました(^ ^;) まるで異なる方法ですが・・・。 一応ソースコードを載せておきます。 LPD3DXSPRITE pSprite; // スプライト D3DXMATRIX Mat, Mat1, Mat2; D3DXMatrixScaling(&Mat1, 1.5, 1, 1); D3DXMatrixTranslation(&Mat2, 320, 16, 0); Mat = Mat1 * Mat2; pSprite->SetTransform(&Mat); pSprite->Draw(pTexture, NULL, NULL, NULL, 0xFFFFFFFF); こんな方法でいいんでしょうかねぇ・・・。 以前見たサンプルで掛け算があった気がしたので・・・。 自分でも何をしているのかよくわかっていません。 まず行列がわかりませんので(^ ^;) ところで Vec2Scale.x = 1.0;//1.0 は現尺2.5なら2.5倍の横幅に変化 Vec2Scale.y = 1.0;//1.0 は現尺2.5なら2.5倍の縦幅に変化 の部分が余り良くわからなかったのですが・・・。 お暇でしたらご回答いただけたら幸いです。
- koedame
- ベストアンサー率33% (10/30)
とりあえずどのようにソースを組んでいるのかを 教えてください。下の容量で簡潔でいいので。 まあ、俺も出来なかったもの・・ですが、 協力しますよ。 LPD3DXSPRITE pSprite;//スプライトインターフェイス LPDIRECT3DTEXTURE9 pTexture;//スプライトに使うテクスチャー pSprite->Draw( pTexture, //テクスチャー NULL, //描画範囲 NULL, //拡大率 NULL, //回転の中心座標 0.0f //回転角 NULL, //平行移動の大きさ D3DCOLOR_ARGB(255,255,255,255) ); //色
補足
ご回答ありがとうございます。 ちなみに書き忘れていましたが、言語はC++です。 Vec3Pos, Vec2Scale には値が入っていると考えてください。 LPDIRECT3DTEXTURE9 pTexture; // テクスチャ D3DXVECTOR3 Vec3Pos; // 表示位置 D3DXVECTOR2 Vec2Scale; // 拡大 D3DXMATRIX Mat; D3DXMatrixTransformation2D(&Mat, NULL, 0, &Vec2Scale, NULL, 0, NULL); pSprite->SetTransform(&Mat); pSprite->Draw(pTexture, NULL, NULL, &Vec3Pos, 0xFFFFFFFF); ・・・といった感じで行っています。 Vec3Posで指定した座標に表示されず困っております。 恐らく拡大の中心が(0,0)になっているからだと思いますが、テクスチャの中心を拡大の中心にしても指定位置にいきませんし・・・。
お礼
ご回答ありがとうございます。 いや~、それにしてもDirectXって複雑ですね・・・。 もっとバージョンが下がるとさらにやる事が多くなっている筈ですから楽だと思うべきなのでしょうが・・・。 先人の努力に感謝しっぱなしです(^ ^;) 3回にわたる丁寧な解説に厚く御礼申し上げます。 これからも努力しいつか教える立場になりたいものです。