スポンサーリンク

T.Ishii's Software Library

HTML5 レトロ風ゲーム館

無料ブログはココログ

« 内蔵する効果を追加中 | トップページ | 地道な改良も »

画像の3D回転とか

今は、AmuseGraphics Ver1.4.1の開発フェーズで、macOS版AGMPlayerに続き、macOS版AG-ムービーカッターの変更作業中なのだが、昨日書いた様に、トランジション効果に基本的な3D効果も追加してみている。

ネットを検索していると、画像の3D回転関係の記事も結構あったりするのだが、それらの殆ど全ては、OpenGLだとか、DirectXを使った場合に、どの様にしたら描画できるか、みたいな話になっている。

で、作者的には、今回、AG-ムービーカッターに内蔵するトランジション効果としては、すでに実装済の2D系の効果以外に、単純な画像の3D回転とiMovieにある様なキューブに貼り付けられた画像の回転も追加しようとしているのだが、そういった処理コード用に、GPU演算を使うつもりはない。

なので、CPUで演算する計算式を使った処理コードを書いてみているのだが、3Dを扱おうとすると、結構、色々な座標系を鑑みる必要が出てくるので、中々、上手くいかなかったりもしている。

まあ、今回の場合、処理結果を画像表示できる環境が既にあるので、色々と式を弄りながら、出力画像を確認していれば、その内、マトモに動作する様には出来るのだが。

ちなみに、今日の時点で、マトモに動作する3D画像を回転させる処理コードは、一応は、実装できている。

にも関わらず、中々、上手くいっていない、と、書いているのは、一応、実装できたコードを、より汎用的に使える処理コードにしたいかなあ、と、思って変更したりしてみているからだ。

念の為に書いておくと、3D画像の回転、といっても、普通、その回転軸はY軸にある格好にするので、鑑みる必要があるのはX座標とZ座標だけになる。このため、Y軸周りの回転の結果、X,Y座標がどうなるのか、については、2D画像の回転と同じ演算で事足りる。

つまり、3Dの回転でも、回転結果の演算は、基本的には、単純なコサインとサインを使った演算で行えるのだが、その回転済みの画像を描画しよとうすると、遠近法を考慮しなければならないので、色々と面倒になってくる訳だ。

何故なら、3D画像に慣れ親しんでいる昨今の人間的には、画像の手前部分が大きく表示され、奥行き方向にある画像が縮小されていかないと、3D画像としては認識しないからなのだが、そのためには、3D空間の物体を2D描画する時には、Z座標の値が重要になってくる。

つまり、Z座標の値が大きい場合、X,Y座標の値は小さくする必要があるのだが、画像というのは、単純な四角形なので、それらの頂点座標については、回転後の3D空間での座標は、前述の様にコサインとサインを使って簡単に計算できる。

そして、その座標を画面表示用に2D変換する場合にも、上記の通りなので、通常位置のZ座標を1とすれば、変換後のX,Y座標は、それぞれ、X/Z,Y/Zにするだけだ。

問題は、頂点以外の座標については、どうするのか、という事になるのだが、それらについても、同様の計算は可能ではある。

しかし、そんな計算をしてみても、表示される画像中に計算されていない座標の点が存在する格好になる場合がでてくるので、計算は、3D→2Dではなく、実際に描画する2D座標から3D座標を求める形にする必要がある訳だ。

具体的には、描画している点の3D空間でのY座標は、回転させても変化はないので、描画用のY座標に変化があれば、それは遠近法による影響になる。

で、そもそも、2D画面上の何処が描画対象になるのか、という話については、頂点座標を線で結んだ台形の中、という事になるので、それらのピクセルを網羅する事は簡単だ。

そして、描画位置の画像の高さの変化から、3D座標のZ座標は決定できるので、自ずと、2D座標のX座標から遠近法を取り除いた3D座標でのX値が計算でき、それが判れば、その位置に相当する画像の色の抽出も可能になる。

と、いう事なので、画像を単純に3D回転させる処理コードというのは、その理屈を鑑みて実装すれば、大して重くはならないので、何もGPUを使う必要はないのだが、OpenGLでやりたい事を記述する様な場合と比べれば、普通に、頭はこんがらがるかもしれない。

« 内蔵する効果を追加中 | トップページ | 地道な改良も »

2019年11月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

広告

プライバシーポリシー

  • 当サイトでは、第三者配信による広告(Google Adsense)サービスを利用しています。

    Google を含む第三者配信事業者は、Cookie を使用して、ユーザーのウェブサイトでの閲覧履歴に基づく広告を配信します。 Google 広告 Cookie を使用することにより、Google や Google のパートナーは当サイトや他のサイトへのアクセス情報に基づく広告をユーザーに表示できます。

    収集された情報がGoogleによってどの様に使用されるか、収集される情報をユーザーが管理する方法については、以下のリンクを参照下さい。

    ポリシーと規約 - Google