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でやりたい事を記述する様な場合と比べれば、普通に、頭はこんがらがるかもしれない。Adsense)サービスを利用しています。使用して、ユーザーのウェブサイトでの閲覧履歴に基づく広告を配信します。パートナーは当サイトや他のサイトへのアクセス情報に基づく広告をユーザーに表示できます。収集された情報がGoogleによってどの様に使用されるか、収集される情報をユーザーが管理する方法については、以下のリンクを参照下さい。