あなたが今、抱えてる悩み カンドウコーポレーションが解決します お悩み一掃!!
STAFF INFORMATION

フラッシュ・ラボ 3次元座標処理 [柳谷 武]

スタッフ紹介 >> 柳谷 武 >> フラッシュ・ラボ >> 3次元座標処理 仕組み
<< フラッシュ・ラボに戻る
レポート >>
[3次元座標処理 仕組み]three dimensions
X,Y,Zの数値から、点で遠近感のある座標空間を表現するための方法です。
上面図
側面図
制作した
投影透視図
3次元座標処理 仕組み


3次元の処理をするために必要な技法に、投影透視というものがあります。

どういうものかというと・・・・。
ガラスを透して風景を見ながら、ペンでガラスに映る風景をなぞっていくと・・・ガラスに立体的に風景を模写できます。こんなかんじで3次元(上下軸・左右軸・奥行き)の座標情報を平面(ディスプレイなど)にトレースして映し出す表現です。

もう少し、仕組み寄りにいうと・・・・・。
ペンでをいくつか印した紙を地面に置き、なにか透明な板を透して紙を見たとします。透明な板に映ったの位置にペンで印していくと・・・・結果、遠近感のついたパースでが描かれています。
この現象を用いて、いくつかの視点透明な板を使って平面上にに遠近感のついた画像表現をすることが投影透視です。


数学っぽくいうと・・・・原点と視点があって、その間を結ぶ線に交わるようにスクリーンという線を引きます。(右下図参照↓)
X,Y,Zの3つの位置座標から → スクリーン線上に映し出される位置座標を計算する方法です。

左の図をみてもらうと、上面図と側面図と投影透視図があるとおもいます。
投影透視図は奥にある点ほど中心に寄っていく特徴があります。
上面図と側面図から投影透視図を作ってみましょー。

上面図と側面図にあるX,Y,Zの座標から、投影透視の原理を用いて数学の式を作ってプログラムで動作する方法を考えてみます。


まず、平面で考えます。
投影透視をするには、カメラ(視点)の位置座標を決めてあげる必要があります。カメラの位置から遠いほど奥に見える点ということになります。

そして、投影するためのスクリーン位置を決めてあげます。
カメラの位置座標と、の位置座標とを線で結び、線とスクリーンが交わる座標が、投影透視図での座標になります。

右図は、線とスクリーンが交わる座標VIEW_X)を計算する方法の表です。




[ 計算式 - ツクリカタ ]
右上の図を元に公式にすると・・・・

X : VIEW_X = (CAMERA - Y) : (CAMERA - SCREEN)

なので

X / VIEW_X = (CAMERA - Y) / (CAMERA - SCREEN)

なので

VIEW_X = ((CAMERA - SCREEN) / (CAMERA - Y)) * X
    ※CAMERAとSCREENの値は、原点からの距離になります。

・・・となります。

今行った、の座標のX,Yを使ってスクリーン上のX座標をわり出す計算を・・・こんどは、の座標のZ,Yを使って同じように行えば、投影透視の計算の出来上がりです。

※計算の途中途中違うやり方でもできると思いますし、まだまだ方法が甘い部分もあると思いますが、参考になる部分があれば幸いです。

上面図
投影透視図
上面図から見て
Z軸回転
回転


X,Y,Zの位置座標を回転させます。
アニメーションの回転や_rotationを使うのではなく、原点を中心に三角関数を使って、"オブジェクトは回転していないけど位置座標は回転している"状態にします。

[1] まずは、今のの位置座標と原点を結ぶ三角形から、今の原点からの角度半径を計算します。

[2] 次に、原点からの角度回転したい分の角度たした角度を計算します。

[3] そして、新しく変更された角度たした角度)と半径から、(X,Y)の座標を計算します。



[ 計算式 - ツクリカタ ]
座標回転の計算をの公式にすると、以下のとおりです。

[1] 半径の計算
rd = sqr(X^2 + Y^2)
 rd・・・半径
 sqr・・・?
 ^2・・・2乗

原点からの角度の計算
r = atan(Y / X) * rad
 r・・・角度
 atan()・・・アークタンジェント
        tanの()の中には角度を入れてY/Xを
        導きますが、atanの場合は、Y/Xを入れて、
        角度を導きます。
 rad・・・ラジアン
        180/πのこと。ラジアン表示を角度表示に
        変換するために掛けます。

[2] 角度を変更
r = r + add_r
 add_r・・・追加する角度

[3] 角度半径から、X,Y座標を計算
X = cos(r / rad) * rd
Y = sin(r / rad) * rd
 sin()・・・サイン
 cos()・・・コサイン

・・・となります。

この計算を。Z,Y座標、Z,X座標でも行えば、全ての方向に回転できるようになります。

<< フラッシュ・ラボに戻る
レポート >>