• ベストアンサー

立方体を2次元で表現

立方体を画面上で表現するにはどうすればいいのでしょうか? いろいろ調べてみたところ display.x=-sinθx+cosθy display.y=-cosθcosφ-sinθcosφy+sinθz というのを見つけて、やってみたのですが、 θ=φ=60°付近ではきれいな立方体に見えるのですが 角度を変えると、ゆがんでしまいます。 式が間違っているのでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.5

たぶん、質問文の式のあるべき姿は、 display.x = -sinθ x + cosθ y display.y = -cosθ cosφ x - sinθ cosφ y + sinφ z です。第1項のx追加と、第3項のθ→φの点が違います。

icantremember
質問者

お礼

回答ありがとうございました。 式が間違っていたとは。。 型を宣言して、式を変えたところ、うまく動くようになりました。 どうもありがとうございました。 P.S. No.4からNo5.への変換が理解できてないのですが、No5.に答えを書いていただいて多謝

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

その他の回答 (4)

  • wolv
  • ベストアンサー率37% (376/1001)
回答No.4

間違えました^^; No2の行列の必要部分だけ計算すると、 u = cosφ x + sinφ y v = -cosθ sinφ x + cosθ cosφ y + sinθ z となりました。 # まだ間違えてるかも...

全文を見る
すると、全ての回答が全文表示されます。
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.3

No2の行列の必要部分だけ計算すると、 u = cosφ x + sinφ y v = -cosθ sinφ x + cosθ sinφ y + sinθ z となりました。

全文を見る
すると、全ての回答が全文表示されます。
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.2

式が間違っているように思います。 回転後の座標を得るための式の求め方ですが、 たとえば、 c = cosφ、s = sinφ C = cosθ、S = sinθ として、回転後の座標(u,v,w)の座標を行列を使って 次のように定義し、u,vのみを使えば、画面での座標として使えます。 ┌ ┐ ┌      ┐┌      ┐┌ ┐  │u│ │1  0 0││ C S 0││x│ │v│=│0  c s││-S C 0││y│ │w│ │0 -s c││ 0 0 1││z│ └ ┘ └      ┘└      ┘└ ┘ 

全文を見る
すると、全ての回答が全文表示されます。
noname#25358
noname#25358
回答No.1

 高校の頃にやりました(笑)  それですね、俺も全く同じ現象にハマってやめちゃったんですが、要するに精度の問題みたいです。  回転させる数式を使ってダイレクトに回転させてませんか?  もしそうなら、倍精度整数の制度の限界から、回転させればさせるほどゆがみます。  もそうなのであれば、円を描くプログラムで使う r/360*pi の数式を使って移動量を求め、その値を点に加減することで回転するロジックを組んでみてください。  その方法なら歪まずに回転するはずです。  また、他の可能性として、「奥行き」を深く取りすぎてる可能性もあります。  360度回転させてもオブジェクトの形状が破壊されないようなら、Z軸が深すぎて魚眼レンズを通したような見え方になっているだけなので、Zの値を2で割るなりなんなり、調節しながら2次元に変換してみてください。  他の可能性もあると思いますが、俺が思いついたのはこれくらいです。

icantremember
質問者

お礼

回答ありがとうございました。 同じところで躓いた方に会えて少し嬉しい今日この頃 変数の宣言をvariant から doubleに変えてみましたところ改善された気が。 あと、式も間違ってたようで、それも直すといい感じで回転してくれました。 どうもありがとうございました。

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

関連する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 となると思うのですが、この式からφ、ψ、θが導きだせません。 どうすれば求めることができるか教えていただけますか。

  • 三次元を二次元に・・・

    ヘッダーファイルの中にXeasyGraphic.hと言うのがあり、立方体を表示させ回転たいのです。 そして、三次元で回転させ、二次元に落とすという方法をしたかったのですが、どうしても、ゆがんでしまいます。どうしたらいいでしょうか? -------ソース------- #include<stdio.h> #include<XeasyGraphics.h> #include<math.h> int main(){ /*立方体の宣言*/ float box_x[8]={10,10,10,-10,10,-10,-10,-10};/*X軸*/ float box_y[8]={10,10,-10,10,-10,10,-10,-10};/*Y軸*/ float box_z[8]={10,-10,10,-10,-10,10,10,-10};/*Z軸*/ /*立方体のキャッシュ*/ float box_x2[360][8],box_y2[360][8],box_z2[360][8]; /*平面に落とした時のキャッシュ*/ float flat_x[360][8],flat_y[360][8]; /*回転用*/ int j,i; float th,x,y,x2,y2; /*回転プログラム*/ for(j=1;j<=360;j++){ for(i=0;i<8;i++){ x=box_x[i]; y=box_y[i]; th=(PAI/180)*j; box_x2[j-1][i]=x*cos(th)-y*sin(th); box_y2[j-1][i]=x*sin(th)+y*cos(th); box_z2[j-1][i]=box_z[i]; } } /*三次元から二次元へ*//*ここが間違えていると思われる*/ for(j=0;j<360;j++){ for(i=0;i<8;i++){ flat_x[j][i]=box_x2[j][i]-box_z2[j][i]; flat_y[j][i]=box_y2[j][i]-box_z2[j][i]; } } /*この後に表示が入る予定*/ getchar(); exit(0); }

  • 立方体の線分の距離

    (0,0,0),(1,0,0),(0,1,0),(1,1,0),(0,0,1),(1,0,1),(0,1,1),((1,1,1)を含む立方体があります。 この内部に2点(x1,y1,z1), (x2,y2,z2)があり、 その直線の立方体内部の線分の長さを求めたいと思っております。 直線が通過する面や点を求めなければなりませんが、 なかなかうまくいきません。 高校、大学数学レベルの公式でもかまいません。 どなたか、よろしくお願いいたします。

  • 正方形立方体の斜辺の求め方

    一辺が5cmの場合の正方形立方体書くとき、斜辺の角度を45度に決めます。斜辺の長さを求めるにはどうすればいいですか。 SIN、COS、TAN、で求めることができるんですか? 計算式を忘れてしまったので計算式を教えてください。

  • ラプラスの方程式球面座標表示

    あるサイトを参考に次の様な流れでラプラスの方程式の球面座標表示を導きたいのですが 途中の式が間違っているのか、最終的な式が導けません。 特に下の3の手順で私の式のやり方が間違っているのかもしれません。 正しいかどうかご指摘くださる方、よろしくお願いします。 >は自分のコメントです。 r=r(x,y,z),θ=θ(x,y,z),φ=φ(x,y,z) x=rsinθcosφ y=rsinθsinφ z=rcosθ まず,これらの式から 1.r^2,tanθ,tanφを計算. > r^2 = x^2 + y^2 + z^2 > tan^2θ = (x^2+y^2)/z^2 > tanφ = y/x 2.1を偏微分することによって∂r/∂x,∂r/∂y,∂r/∂z,∂θ/∂x,∂θ/∂y,∂θ/∂z,∂φ/∂x,∂φ/∂yをすべてx,y,zで表現.あとでこれらの2階偏微分も必要になるが. >∂r/∂x = sinθcosφ, ∂r/∂y = sinθsinφ, ∂r/∂z = cosθ >∂θ/∂x = (cosθcosφ)/r, ∂θ/∂y = (cosθsinφ)/r, ∂θ/∂z = -sinθ/r >∂φ/∂x = -sinφ/(r*sinθ), ∂φ/∂y = cosφ/(r*sinθ), ∂φ/∂z = 0 3.∂/∂x=∂/∂r・∂r/∂x+∂/∂θ・∂θ/∂x+∂/∂φ・∂φ/∂x これをさらに偏微分して∂^2/∂x^2を偏微分の記号で表現. ちょっとしんどいですがガッツ. 同様に∂^2/∂y^2,∂^2/∂z^2も計算. >この∂^2/∂x^2, ∂^2/∂y^2,∂^2/∂z^2は単純に >(∂/∂x)^2=(∂/∂r・∂r/∂x+∂/∂θ・∂θ/∂x+∂/∂φ・∂φ/∂x)^2 >(y, z同様)と計算しては間違いでしょうか? 4.∂^2/∂x^2+∂^2/∂y^2+∂^2/∂z^2を偏微分記号の表示のまままとめる. 5.2で求めたものを代入.すると意外に綺麗にまとめれるものが出てくる. >最終的に出た式 >∂^2/∂r^2+∂^2/(r^2∂θ^2)+∂^2/(r^2*sin^2θ∂φ) >求めたい式は >∂^2/∂r^2+2*∂/(r∂r)+∂^2/(r^2∂θ^2)+∂/(r^2*tanθ∂θ)+∂^2/(r^2*sin^2θ∂φ) >です。 >自分で導いた式と比べると、2*∂/(r∂r)+∂/(r^2*tanθ∂θ)が欠けています。

  • 3次元の極座標について

    x=rsinθcosφ y=rsinθsinφ z=rcosθ というのが3次元における極座標表示のようですが、なぜこのような式になるんですか? このような式にいたるまでの過程を教えてください。 できるだけ分かりやすく教えてほしいので、行列などを使っての説明はできるだけしないでください。 よろしくお願いします。

  • 3次元の座標変換と角度について。

    3次元のシミュレーションの勉強をしています。 3次元の座標変換で x,y,z:変換前の座標; x',y',z':変換後の座標; θ:回転する角度; lx,ly,lz:平行移動量; としたとき、 X軸に関する回転              |1 0   0    0|              |0 cosθ sinθ 0| [x' y' z' 1] = [x y z 1]|0 -sinθ cosθ0|              |0 0   0   1| Y軸に関する回転              |cosθ0 -sinθ0|              |0   1 0   0| [x' y' z' 1] = [x y z 1]|sinθ0 cosθ 0|              |0   0 0   1| Z軸に関する回転              |cosθ sinθ 0 0|              |-sinθcosθ0 0| [x' y' z' 1] = [x y z 1]|0   0   1 0|              |0   0   0 1| 平行移動              |1 0 0 0|              |0 1 0 0| [x' y' z' 1] = [x y z 1]|0 0 1 0|              |lx ly lz 1| 物体の姿勢を表現するときは [物体の姿勢の変換行列] = [Z軸の回転行列][X軸の回転行列][Y軸の回転行列][平行移動]  |XX XY XZ 0| XX,XY,XZ・・・X軸の単位ベクトルを変換した場合のベクトル  |YX YY YZ 0| YX,YY,YZ・・・Y軸の単位ベクトルを変換した場合のベクトル = |ZX ZY ZZ 0| ZX,ZY,ZZ・・・Z軸の単位ベクトルを変換した場合のベクトル  |LX LY LZ 1| LX,LY,LZ・・・平行移動量ベクトル というのは分かるのですが、 X軸、Y軸、Z軸の単位ベクトルを変換した後のベクトルから X軸、Y軸、Z軸にそれぞれ何度ずつ回転させたかを求めるにはどのようにすればよいのでしょうか? つまり、X軸に対して30度、Y軸に対して45度、Z軸に対して60度回転させた後の |XX XY XZ 0| |YX YY YZ 0| |ZX ZY ZZ 0| |LX LY LZ 1| の値からX軸に対して30度、Y軸に対して45度、Z軸に対して60度回転している事を導きたいのです。 分かる方教えてください。 お願いします。 (質問に関して、 http://www.ceres.dti.ne.jp/~ykuroda/oyaj/bone/basic3d.html を参考にさせていただきました。)

  • 回転行列

    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)方向です。 よろしくお願いいたします。

  • 立方倍積問題

    与えられた立方体の2倍の体積を持つ、立方体の1辺を作図する。という古い問題で、ヒッポクラテスという人物が見つけた解法がわかりません。 彼は求める立方体の1辺の長さをxとすれば、この作図題を以下のような比例式になおせることを発見した。 a:x=x:y=y:2a すなわちx^2=ay y^2=2ax この2式からyを消去すると、x^3=2a^3 最後の式から推測すると、aは与えられた立方体の1辺だと思いますが。yは何を表すのでしょうか?教えてください。2乗は面積を表すこともあるので、何か立体の1辺かとも思ったのですが、立体(立方体)を3つ用意する解法は思いつきませんでした。

  • 座標変換について

    座標系XYZの空間に点A(X1,Y1,Z1)、点B(X2,Y2,Z2)、点C(X3,Y3,Z3)があります。 この3点を通る円の中心をP(X0,Y0,Z0)とし、 円の存在する平面をx'y'平面とします。 さらに原点を点P、x'軸はPAを通る直線とします。 座標系x'y'z'から円周上の点D(X',Y',Z')を求め 座標系XYZに変換した(X4,Y4,Z4)を求めたいのですが、どうすればよいのでしょうか? 以下のようにすれば求まると思うのですが角度α、β、γの求め方が分かりません。 X'' = X' * cosα - Y' * sinα Y'' = X' * sinα + Y' * cosα Z'' = Z' X''' = X'' Y''' = Y'' * cosβ - Z'' * sinβ Z''' = Y'' * sinβ + Z'' * cosβ X4 = X''' * cosγ + Z''' * sinγ Y4 = Y''' Z4 = Z''' * cosγ - X''' * sinγ よろしくお願いします。