- ベストアンサー
DirectX png画像でx軸回転について
D3DXCreateTextureFromFile関数でpng画像を読み込んで、LPD3DXSPRITEのスプライト機能で描画しています。 float rad += 0.005f;という感じでラジアン値を変えつつ回転の様子を調べているのですが、どうも予想通りに動いてくれません。 D3DXMatrixRotationZでz軸回転させると、一定間隔でくるくる回ってくれて、これは予想通りです。 しかしD3DXMatrixRotationXでx軸回転させようとすると、一瞬で画像が縮んでしばらく消えてから、また一瞬の内に伸びて縮んでしばらく消える、という事の繰り返しになります。 なぜx軸(y軸もですけど)の時だと、上手く回転してくれないのでしょう? そして、どのように値を与えれば、一定間隔でくるくる回ってくれるようになるのでしょうか? どうかよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>3D としてレンダリングしていない スプライトの描画時に Begin をしているはずです。 参考:DirectX SDKドキュメント日本語版 DirectX Graphics > リファレンス > D3DXリファレンス > ID3DXSprite > Begin メソッド D3DXSPRITE_OBJECTSPACE を指定してワールド座標行列を 設定してやればできた気がします。 (できなかったらごめんなさい)
その他の回答 (2)
- chie65536
- ベストアンサー率41% (2512/6032)
視点(カメラ)とポリゴンの両方が「原点」にありませんか? 原点でX、Yを回転させると、ポリゴンの半分は原点より手前に、つまり、視点(カメラ)より手前に行きます。 視点(カメラ)より手前に行ってしまった部分はクリップされ表示されません。 視点(カメラ)を、ちょいと手前に引いてやると、上手く行くかも?
お礼
回答ありがとうございます。 なるほど、カメラの位置は無頓着でした。 画像の中心で回転させているのですけど、確かに半分だけいきなり切れるという症状がありました。おそらくカメラの位置が問題だったのだと思います。 しかしこれはZ方向にD3DXMatrixTranslationする事で、改善されました。 それと見た目的に画像が傾いてなかったので、視点以外にも問題がある気がします。 うーん、何が何だかよく分からなくなってきました。 とりあえず一旦締めて、頭を整理してから改めて質問させて貰おうと思います。 改めて回答を下さいましたお二方にお礼を申し上げます。 本当にありがとうございました。
- postal0x02
- ベストアンサー率42% (24/57)
>上手く回転してくれないのでしょう? その動きは多分うまく回転しています。 一定値で足していけばそう見えるはずです。 (現実世界と同じです) Z軸と同時に、X軸も動かしてみてください。 ただ横に伸びるだけで 3Dの板のように見えなければ、 スプライトを 3D としてレンダリングしていないと思われます。
お礼
>スプライトを 3D としてレンダリングしていないと思われます。 ありがとうございます、ずばりpostal0x02さんの仰る通りでした。 rad += 0.0001f;でもっとゆっくり変化させたところ、ただ単に両端が切れているだけでした。 しかし申し訳ありませんが、3D としてレンダリングしていないというのがよく分かりませんでした。 スプライトといっても、内部ではテクスチャを貼るために板ポリゴンを作っていると思ってたのですけど、それならx軸回転も普通に出来るはずですよね。 そもそも、回転の変換で両端が切れるというのも謎です。
お礼
>D3DXSPRITE_OBJECTSPACE を指定して ありがとうございます、こんなフラグがあったとは知りませんでした。 検索してもほとんどヒットしないようで、postal0x02さんから教わらなかったら、間違いなく見逃してたと思います。 しかしこれ指定したら、画像じゃなくて単なる板ポリゴンになっちゃいました。 座標もスクリーン座標じゃなくて、ワールド座標から自分で組まないといけないみたいですね。 ワールドからスクリーンまで座標変換してテクスチャも貼って……って、もうスプライト使う意味ないような?w (しかもポリゴンは自分で用意した訳じゃないから、テクスチャの張り方も分からないですし) 昔のDirectXのスプライト機能なら3Dの回転も出来たらしいのですけど、最近のDirectXで仕様が変わったのかもしれないですね。 (Draw関数の引数が違ったので、何かおかしいなーとは思ったんですけどね)