- ベストアンサー
立方体を2次元で表現
立方体を画面上で表現するにはどうすればいいのでしょうか? いろいろ調べてみたところ display.x=-sinθx+cosθy display.y=-cosθcosφ-sinθcosφy+sinθz というのを見つけて、やってみたのですが、 θ=φ=60°付近ではきれいな立方体に見えるのですが 角度を変えると、ゆがんでしまいます。 式が間違っているのでしょうか? よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
たぶん、質問文の式のあるべき姿は、 display.x = -sinθ x + cosθ y display.y = -cosθ cosφ x - sinθ cosφ y + sinφ z です。第1項のx追加と、第3項のθ→φの点が違います。
その他の回答 (4)
- wolv
- ベストアンサー率37% (376/1001)
間違えました^^; No2の行列の必要部分だけ計算すると、 u = cosφ x + sinφ y v = -cosθ sinφ x + cosθ cosφ y + sinθ z となりました。 # まだ間違えてるかも...
- wolv
- ベストアンサー率37% (376/1001)
No2の行列の必要部分だけ計算すると、 u = cosφ x + sinφ y v = -cosθ sinφ x + cosθ sinφ y + sinθ z となりました。
- wolv
- ベストアンサー率37% (376/1001)
式が間違っているように思います。 回転後の座標を得るための式の求め方ですが、 たとえば、 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│ └ ┘ └ ┘└ ┘└ ┘
高校の頃にやりました(笑) それですね、俺も全く同じ現象にハマってやめちゃったんですが、要するに精度の問題みたいです。 回転させる数式を使ってダイレクトに回転させてませんか? もしそうなら、倍精度整数の制度の限界から、回転させればさせるほどゆがみます。 もそうなのであれば、円を描くプログラムで使う r/360*pi の数式を使って移動量を求め、その値を点に加減することで回転するロジックを組んでみてください。 その方法なら歪まずに回転するはずです。 また、他の可能性として、「奥行き」を深く取りすぎてる可能性もあります。 360度回転させてもオブジェクトの形状が破壊されないようなら、Z軸が深すぎて魚眼レンズを通したような見え方になっているだけなので、Zの値を2で割るなりなんなり、調節しながら2次元に変換してみてください。 他の可能性もあると思いますが、俺が思いついたのはこれくらいです。
お礼
回答ありがとうございました。 同じところで躓いた方に会えて少し嬉しい今日この頃 変数の宣言をvariant から doubleに変えてみましたところ改善された気が。 あと、式も間違ってたようで、それも直すといい感じで回転してくれました。 どうもありがとうございました。
お礼
回答ありがとうございました。 式が間違っていたとは。。 型を宣言して、式を変えたところ、うまく動くようになりました。 どうもありがとうございました。 P.S. No.4からNo5.への変換が理解できてないのですが、No5.に答えを書いていただいて多謝