• ベストアンサー

DirectXを使ってテクスチャ(画像)を回転させる

画像を回転させたいのです。 中心を軸として回転させたいのです。(Z軸を軸にして) x=半径*cosθ y=半径*sinθ という式を利用してみたところ、中心を軸としてではなく 画像の外を軸として回転してしまいました 根本的に利用する式が間違っているようですが、 もしかしたら、この式でもできないですか…?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

スプライト機能(LPD3DXSPRITE)を使って描画するか、D3DFVF_XYZRHWを指定すると、座標変換をすっ飛ばしてしまうのでいろいろと不具合の原因になります。 (もしID3DXSpriteのDraw関数を使っているなら、支点を指定する引数があります) 上記が関係ないとすると、No1氏の回答が有力かと思います。 3D上で動かすキャラは、移動・回転・拡大縮小、全て座標変換によって行います。なので、変換する順番で結果が大きく変わります。 例えば移動した後に回転を施すと、この質問のような症状になります。

shima3333
質問者

お礼

知識不足でした、これからしることがいっぱいあって楽しみです。 (ポジティブに ありがとうございます。 質問することがあると思いますので、またお世話になるかもしれません

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

テクスチャを移動させてから回転させていませんか? 回転の中心はワールド座標系(イメージとしてはウィンドウの座標系→あくまでイメージであって厳密にはちがいますが)の原点になります。 ローカル座標系(テクスチャの座標系)の中心を中心として回転させたいのであれば、 1.テクスチャを移動する前に回転させるか または、 2.テクスチャの原点をワールド座標系の原点に平行移動させてから   回転させ、   再び、表示したい位置に平行移動させる となります。

shima3333
質問者

お礼

なるほど、なるほど、なるほど。 文章にしづらいのでですが、回転させないでいいようにしてみました。 それでも動きました。つまり私は余分なことをしていたということです。 全然気づきませんでした、ありがとうございます。 回転に関してですが、おかげさまで、うまく回ってくれました。 原因はまだ曖昧ですが、本当にありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 3次元の回転角度の求め方について教えてください。

    3次元の回転角度の求め方について教えてください。 3軸の加速度センサーがあります。 まず加速度センサーのZ軸を重力方向に置いたときの加速度センサーの値を(x1,y1,z1)=(0,0,1)とします。 加速度センサーのx軸、y軸、z軸をそれぞれ回転させたあとの加速度センサーの値を(x2,y2,z2)とします (このとき加速度センサーは静止しているので、センサーの値は重力の分力になります)。 (x2,y2,z2)が既知のとき(x1,y1,z1)に戻すためのそれぞれの回転角はどのように求めれば良いのか教えてください。 (x2,y2,z2)→(x1,y1,z1)へ移動するときの回転角を φ(z軸の回転角)、ψ(x軸の回転角)、θ(y軸の回転角) とします。 回転行列 (x1) = (cosφ -sinφ 0) (cosθ 0 sinθ) (1 0 0 ) (x2) (y1) = (sinφ cosφ 0) (0 1 0 ) (0 cosψ -sinψ) (y2) (z1) = (0 0 1) (-sinθ 0 cosθ) (0 sinψ cosψ ) (z2) より,3行3列の行列を計算すると 0=cosφcosθx2 + (-sinφcosψ+cosφsinθsinψ)y2+(sinφsinψ+cosφsinθcosψ)z2 0=sinφcosθx2 + (cosφcosψ+sinφsinθsinψ)y2+(-cosφsinψ+sinφsinθcosψ)z2 1=-sinθx2 + cosθsinψy2 + cosθcosψz2 となると思うのですが、この式からφ、ψ、θが導きだせません。 どうすれば求めることができるか教えていただけますか。

  • なぜ回転行列が以下のようになるのでしょうか。

    3次元の座標系があります。軸はX,Y,Zです。 Cθ=cosθ Sθ=sinθ でなぜ画像のようになるのかが分かりません。 画像の左上がX軸に関してθだけ回転させた回転行列。 同様に、右はY軸に関して、左下はZ軸に関してθだけ回転させた回転行列です。 cosθ,sinθのつく場所はだいたい分かってきたのですが、符号がどうしてそうなるのかが分かりません。 各軸を原点から見て時計回りを正とするそうです。 よろしくお願いします。

  • 回転移動した平面の方程式

    右手系座標での平面 z = 0 を 方位角 φ ( y 軸正方向から見て時計回りを正とする)、 仰角 θ ( x 軸正方向から見て反時計回りを正とする)で 回転させたときの方程式はどのようになりますか。 2つの方法で方程式が一致しないので、 混乱しています。 方位角 φ の座標変換 x' = x cos φ - z sin φ z' = x sin φ + z cos φ 仰角 θ の座標変換 y' = y cos θ + z sin θ z' = - y sin θ + z cos θ 方位角 φ, 仰角 θ の座標変換 (←この辺りから間違っている?) x' = x cos φ - z sin φ y' = x sin φ sin θ + y cos θ + z cos φ sin θ z' = x sin φ cos θ - y sin θ + z cos φ cos θ 方法1 回転後の平面は z' = 0 であるから、平面の方程式は x sin φ cos θ - y sin θ + z cos φ cos θ = 0 方法2 平面 z = 0 の単位法線ベクトル n は (0, 0, 1) である。 座標変換の式にこれを代入すると、回転後の n は ( - sin φ, cos φ sin θ, cos φ cos θ ) であるから、n に垂直で原点を通る平面の方程式は - x sin φ + y cos φ sin θ + z cos φ cos θ = 0 回転放物面 z = ( x^2 + y^2 ) / ( 4 f )についても 方程式を得たいので、よろしくお願い致します。

  • オイラー角 回転行列

    オイラー角 回転行列 オイラー角と回転行列の関係が良く理解出来ないので 質問させて下さい。 工学や物理学で使われるオイラー角の回転順序は Z-X-Zが一般的だと認識しています。 ここで、3次元空間でのX軸、Y軸、Z軸周りの回転を 表す回転行列は、   1  0  0 Rx= 0 cosθ -sinθ 0 sinθ cosθ   cosθ 0 sinθ Ry= 0  1 0 -sinθ 0 cosθ    cosθ -sinθ 0 Rz= sinθ cosθ 0 0   0  1 です。 それぞれのθが、その軸での回転だと認識しています。 ここで、回転の方向はRxはY軸をZ軸に向ける方向、 RyはZ軸をX軸に向ける方向、RzはX軸をY軸に向ける方向。 Z-X-Zとは、 Rz・Rx・Rzの積という認識で良いでしょうか? 例えば、 Rx:Y軸をZ軸に向ける方向にπ/2 Ry:Z軸をX軸に向ける方向にπ/3 Rz:X軸をY軸に向ける方向にπ/4 回転させたとします。 Rz・Rx・Rzの積でなぜ、Ryの回転 が表現できるのですか? また、オイラー角はα,β,γと表記される事もありますが、 これは、X軸回転をα、Y軸回転をβ、Z軸回転をγで表して いるという事なのでしょうか? 分からない点だらけで申し訳御座いませんが、ご回答何卒よろしくお願い致します。

  • 回転行列

    z軸(0,0,1)に関する極座標 x=r*sinΘcosφ y=r*sinΘsinφ z=r*cosΘ を、中心はそのままで、立方体の最長の対角線が軸となるようにしたい時、 どのような回転行列をを用いればよいでしょうか? イメージとしては、 地球の地軸がずれている経度と緯度のような感じです。 立方体の対角線の軸は(1,1,1),(-1,1,1),(1,-1,1),(-1,-1,1)方向です。 よろしくお願いいたします。

  • 線形代数 行列 対称 回転 

    3次元(xyz)におけるX軸に対する軸対称(回転対称)は、 3次元の回転行列を用いて、 1  0    0 0 cosθ -sinθ 0 sinθ cosθ θ=πとすると 1 0  0 0 -1 0 0 0 -1 と教えて頂きました。 前回の質問:http://okwave.jp/qa/q7596237.html その他の、y軸,z軸対称も同様に、y軸の回転行列 でθ=π,z軸の回転行列でθ=πとすれば導けるでしょうか? また、2次元(xy)における回転行列は、 cosθ -sinθ sinθ cosθ です。 これにθ=πを代入すると、 -1 0 0 -1 となります。 しかし、2次元における軸対称は 1 0 0 -1 となると思います。 どこが間違っているのでしょうか? 以上、ご回答よろしくお願い致します。

  • 透視投影図形の回転

    C言語で透視投影の図形(3次元)を作成しました。 プログラムは下のような感じになりました。 static struct {int f; double x,y,z;}a[] ...(略) for(j=0; a[j].f!=-999; j++){//-999が来るまで描画  h=-a[j].x*sin(ay)/vp+a[j].z*cos(ay)/vp+n/vp+1;  px=(a[j].x*cos(ay)+a[j].z*sin(ay)+1)/h;  py=(a[j].y+m)/h;   if(a[j].f==-1) //-1が先頭にあるなら    pDC->MoveTo(px+200,-py+200);//描画の始点   else //そうでないなら    pDC->LineTo(px+200,-py+200);//線の終点 } これに、わかっているx軸まわり・y軸まわりの回転変換マトリックスを掛け合わせた、統合変換マトリックスの式 x=x*cosθ-z*sinθ y=x*sin^2θ+y*cosθ+z*sinθcosθ z=x*sinθcosθ-y*sinθ+z*cos^2θ を使用して図形を回転させたいのですが、プログラム中にはpDC->MoveTo(px+200,-py+200);のようにxとyしか出力がなく、z=をどう出力しようかと悩んでいます。また、回転を表示させるのに、 描画→回転させたx,y座標の算出→一度画面を白く塗りつぶす→描画 ということをfor文でやっていこうと思うのですが、画面がとてもちらついてしまいます。ちらつかない方法があれば教えてください。

  • 回転体

    O-xyz座標系において、z=cos(x^2)をz軸の周りに回転させて得られる曲面の方程式がz=cos(x^2+y^2)になるらしいのですが、どういうことかよく分かりません。簡単にご教授お願いします。

  • 座標軸の回転と楕円の方程式

    原点Oを中心に回転した座標系で、元の座標系で楕円の方程式を表す方程式は、どう変わるかがわからないので質問します。 問題は、Oxy軸をOのまわりに120°回転して、Ox'y'軸が得られたとする。このときOxy系で楕円x^2/9+y^2/4=1を表す方程式は、Ox'y'系でどのような方程式になるか?です。 以下では、{}で行列を表し、(,,・・・)で一行分の要素を列挙し,左の()から1行、2行・・・とします。例えば、{(cos120°,-sin120°),(sin120°,cos120°)}の2行1列目の要素は、sin120°です。 自分は、{(x),(y)}={(cos120°,-sin120°),(sin120°,cos120°)}*{(x'),(y')}より、x=-1/2x'-√3/2y'とy=√3/2x'-1/2y'を得て、x^2/9+y^2/4=1に代入しました。そうして31x'^2-10√3x'y'+21y'^2=144を答えとしたのですが、 本の解答は、31x'^2-10√3x'y'-21y'^2=144でした。どなたか正しい答えを教えていただけませんかお願いします。

  • 回転体についてお願いします。東大実戦模試からです。

    xy平面上の楕円E:2x^2+y^2=1,z=0を、中心がyz平面上の円弧C:y^2+z^2=1,y≧0,z≧0,x=0上にあるように平行移動したもの全体がつくる曲面をFとする。さらに、曲面Fをz軸の周りに回転するときFが通過する部分をKとする。 0≦t≦1を満たす実数tに対して、平面z=tによるKの切り口の面積をS(t)とおく。 t=sinθのとき、S(t)をθで表せ。ただし、0≦θ≦π/2 とする。 という問題なのですが、解説に、 z=sinθによるKの切り口は、楕円Eを、その中心が(0,cosθ,sinθ)にくるように平行移動して、それをz軸の周りに回転したものであるから、切り口は2つの同心円で囲まれた図形となる。 とあるのですが、回転軸は楕円の内部にあるのに、なぜ内径も考えないといけないのでしょうか。 よろしくお願いします。 *東大入試実践2006年度の問題です。