AGALで環境マッピング その2 | Photoshop CC Tutorials
今回はAS3で環境マッピングのプログラムを作成してみました。

はじめは「AGAL」で書いていたのですが可読性が悪くなりこれではエラーの箇所が分からなくなってしまうと思い
続いて「PixelBender3D」で書いてみたのですが、なぜか記述が多くなるとコンパイルされなくなりました。

「PixelBender3D」のバグなのか自分のミスなのかよく分からず先に進めない状況に陥ってしまい
これを打開するために最も使いやすい高級言語のAS3で書いてみることとなりました。(;^_^ A

//------------------------------------
// AS3版環境マッピングプログラムの使い方
//------------------------------------

反射ベクトルオブジェクトの頂点の位置を設定するとuv値が求まります。

$ピック社長のブログ

実行結果です。環境キューブマップのuv値が取得できます。

$ピック社長のブログ

今回作成したプログラムです。
床井さんのレイキャスティングのサイトを参考にして作成しました。
private function testRayCast():void
{
var p0_Arr:Array = new Array();
var e1_Arr:Array = new Array();
var e2_Arr:Array = new Array();

// left
var left_p0:Vector3D = new Vector3D( -1, 1, -1);
var left_e1:Vector3D = new Vector3D(0, 0, 2);
var left_e2:Vector3D = new Vector3D(0, -2, 0);

p0_Arr.push(left_p0);
e1_Arr.push(left_e1);
e2_Arr.push(left_e2);

// right
var right_p0:Vector3D = new Vector3D(1, 1, 1);
var right_e1:Vector3D = new Vector3D(0, 0, -2);
var right_e2:Vector3D = new Vector3D(0, -2, 0);

p0_Arr.push(right_p0);
e1_Arr.push(right_e1);
e2_Arr.push(right_e2);

// top
var top_p0:Vector3D = new Vector3D(-1, 1, -1);
var top_e1:Vector3D = new Vector3D(2, 0, 0);
var top_e2:Vector3D = new Vector3D(0, 0, 2);

p0_Arr.push(top_p0);
e1_Arr.push(top_e1);
e2_Arr.push(top_e2);

// bottom
var bottom_p0:Vector3D = new Vector3D(-1, -1, 1);
var bottom_e1:Vector3D = new Vector3D(2, 0, 0);
var bottom_e2:Vector3D = new Vector3D(0, 0, -2);

p0_Arr.push(bottom_p0);
e1_Arr.push(bottom_e1);
e2_Arr.push(bottom_e2);

// back
var back_p0:Vector3D = new Vector3D(-1, 1, 1);
var back_e1:Vector3D = new Vector3D(2, 0, 0);
var back_e2:Vector3D = new Vector3D(0, -2, 0);

p0_Arr.push(back_p0);
e1_Arr.push(back_e1);
e2_Arr.push(back_e2);

// forward
var forward_p0:Vector3D = new Vector3D(1, 1, -1);
var forward_e1:Vector3D = new Vector3D(-2, 0, 0);
var forward_e2:Vector3D = new Vector3D(0, -2, 0);

p0_Arr.push(forward_p0);
e1_Arr.push(forward_e1);
e2_Arr.push(forward_e2);

var dir:Vector3D = new Vector3D(0.5, 0.0, 0.1); // 反射ベクトル
dir.normalize();
var org:Vector3D = new Vector3D(0, 0, 0); // オブジェクトの頂点
var e1:Vector3D = new Vector3D();
var e2:Vector3D = new Vector3D();
var p0:Vector3D = new Vector3D();
var q:Vector3D = new Vector3D();
var e:Vector3D = new Vector3D();
var r:Vector3D = new Vector3D();
var s:Number, u:Number, v:Number, t:Number, w:Number;

for (var i:int = 0; i < 6; i++) {
p0 = new Vector3D();
e1 = new Vector3D();
e2 = new Vector3D();

p0 = p0_Arr[i];
e1 = e1_Arr[i];
e2 = e2_Arr[i];

q = dir.crossProduct(e2);
s = q.dotProduct(e1);

if (s != 0.0) {
e = org.subtract(p0);
r = e.crossProduct(e1);

t = r.dotProduct(e2) / s;
u = q.dotProduct(e) / s;
v = r.dotProduct(dir) / s;
}else {
u = 100;
v = 100;
}

w = 2 - u - v;

if (u >= 0 && v >= 0 && w >= 0 && t >= 0) {
if (i == 0) {
trace("■ 左面とヒットしました!");
trace("u == " + u);
trace("v == " + v);
trace("t == " + t);
}
if (i == 1) {
trace("■ 右面とヒットしました!");
trace("u == " + u);
trace("v == " + v);
trace("t == " + t);
}
if (i == 2) {
trace("■ 上面とヒットしました!");
trace("u == " + u);
trace("v == " + v);
trace("t == " + t);
}
if (i == 3) {
trace("■ 下面とヒットしました!");
trace("u == " + u);
trace("v == " + v);
trace("t == " + t);
}
if (i == 4) {
trace("■ 後面とヒットしました!");
trace("u == " + u);
trace("v == " + v);
trace("t == " + t);
}
if (i == 5) {
trace("■ 前面とヒットしました!");
trace("u == " + u);
trace("v == " + v);
trace("t == " + t);
}
}
}
}


■ 床井さんのサイト
http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20100113