Flashゲーム講座 & アクションスクリプトサンプル集



3Dベクトルを作成する

 
 


 
ベクトルの型


ここでは、ベクトルをオブジェクト形式で表現しました。配列でもいいのですが、 見た目にわかりやすくしたかったのでこの方法を取っています。
ここで紹介する3Dベクトルはすべてこの形式で扱います。

ここで扱う3Dベクトルの形式

	vec = {
		x : 0,	y : 0,	z : 0
	};
 

 
ベクトルを作成


ベクトルを生成する関数です。これでオブジェクト型が返ってきます。

3Dベクトルの作成

function Vec3dCreate(x,y,z){
	return {
		x : x,
		y : y,
		z : z
	};
}
 
使用例です。

ベクトル(10,5,1)を作成する


	vec = _root.Vec3dCreate(10,5,1);
	
vec.x → 10
vec.y → 5
vec.z → 1
 

 




3Dベクトル同士を加算する

 
 


 
ベクトルとベクトルの加算

ベクトルとベクトルを加算して結果のベクトルを返します。

第01引数に1つ目のベクトル
第02引数に2つ目のベクトル
戻り値に計算後のベクトルが返ります。

ベクトル同士の加算

function Vec3dAdd( vec1, vec2 ){
	return {
		x : vec1.x + vec2.x,
		y : vec1.y + vec2.y,
		z : vec1.z + vec2.z
	};
}
 
使用例です。

ベクトル(10,5,1)とベクトル(20,-7,-3)を加算する


	vec1 = _root.Vec3dCreate(10,5,1);
	vec2 = _root.Vec3dCreate(20,-7,-8);
	
	vec3 = _root.Vec3dAdd(vec1,vec2);
	
vec3.x → 30
vec3.y → -2
vec3.z → -7
 

 




3Dベクトル同士を減算する

 
 


 
ベクトルとベクトルの減算

ベクトルとベクトルを減算して結果のベクトルを返します。

第01引数に1つ目のベクトル
第02引数に2つ目のベクトル
戻り値に計算後のベクトルが返ります。

ベクトル同士の減算

function Vec3dSub( vec1, vec2 ){
	return {
		x : vec1.x - vec2.x,
		y : vec1.y - vec2.y,
		z : vec1.z - vec2.z
	};
}
 
使用例です。

ベクトル(10,5,1)をベクトル(20,-7,-8)で減算する


	vec1 = _root.Vec3dCreate(10,5,1);
	vec2 = _root.Vec3dCreate(20,-7,-8);
	
	vec3 = _root.Vec3dSub(vec1,vec2);
	
vec3.x → -10
vec3.y → 12
vec3.z → 9
 

 




3Dベクトルを乗算する

 
 


 
ベクトルをスカラ値で乗算

ベクトルを拡大縮小して結果のベクトルを返します。

第01引数にベクトル
第02引数に拡大量の数値
戻り値に計算後のベクトルが返ります。

スカラ値で乗算

function Vec3dScale( vec, scale ){
	return {
		x : vec.x * scale,
		y : vec.y * scale,
		z : vec.z * scale
	};
}
 
使用例です。

ベクトル(10,5,1)を2倍する


	vec1 = _root.Vec3dCreate(10,5,1);
	
	vec2 = _root.Vec3dScale(vec1,2);
	
vec2.x → 20
vec2.y → 10
vec2.z → 2
 

 




3Dベクトルの長さを求める

 
 


 
ベクトルの長さを計算

ベクトルの長さを返します。

第01引数にベクトル
戻り値に長さが返ります。

ベクトルの長さを求める

function Vec3dLength( vec ){
  return Math.sqrt((vec.x * vec.x) + (vec.y * vec.y)
+ (vec.z * vec.z)); }
 
使用例です。

ベクトル(10,5,1)の長さを求める


	vec1 = _root.Vec3dCreate(10,5,1);
	
	length = _root.Vec3dLength(vec1);
	
length → 11.2249…
 

 




3Dベクトル同士の内積を求める

 
 


 
ベクトルとベクトルの内積を計算

ベクトルとベクトルの内積を計算して結果を返します。

内積とは2つのベクトルが如何に平行に近いかという事を表す数値で、

1 に近いほど平行である
0 に近いほど直角である
-1 に近いほど反対方向で平行である

ということがわかります。



第01引数に1つ目のベクトル
第02引数に2つ目のベクトル
戻り値に計算後の数値が返ります。

ベクトル同士の内積を求める

function Vec3dDotProduct( vec1, vec2 ){
  return ((vec1.x * vec2.x) + (vec1.y * vec2.y)
+ (vec1.z * vec2.z)); }
 
使用例です。

ベクトル(10,5,1)とベクトル(20,-7,-8)の内積を求める


	vec1 = _root.Vec3dCreate(10,5,1);
	vec2 = _root.Vec3dCreate(20,-7,-8);
	
	dot = _root.Vec3dDotProduct(vec1,vec2);
	
dot → 157
 

 




3Dベクトル同士の外積を求める

 
 


 
ベクトルとベクトルの外積を計算

2つのベクトルで作られる無限面に対して垂直であるベクトル(法線)を計算して結果を返します。2つのベクトルで作られる面なのでベクトルが 平行だと答えは求まらないので注意してください。

法線を使うと面に対して表か裏なのか、ベクトルの反射方向はどこか といった、新たな計算結果を求めるために役に立ちます。



第01引数にベクトル
戻り値に計算後のベクトルが返ります。

ベクトルの法線を求める

function Vec3dCrossProduct( vec1, vec2 ){
  return {
    x : (vec1.y * vec2.z) - (vec1.z * vec2.y),
    y : (vec1.z * vec2.x) - (vec1.x * vec2.z),
    z : (vec1.x * vec2.y) - (vec1.y * vec2.x)
  };
}
 
使用例です。

ベクトル(10,5,1)とベクトル(20,-7,-8)の外積を求める


	vec1 = _root.Vec3dCreate(10,5,1);
	vec2 = _root.Vec3dCreate(20,-7,-8);
	
	vec3 = _root.Vec3dCrossProduct(vec1,vec2);
	
vec3.x → -33
vec3.y → 100
vec3.y → -170
 

 




3Dベクトルを正規化する

 
 


 
正規化ベクトルを計算

ベクトルを正規化して結果を返します。

ベクトルは方向と長さを持っているので一度、方向を維持したまま長さだけを 1 にして方向だけ意味を持たせます。 この後に、拡大縮小変換をすると、好きな長さに変換できます。
 
第01引数にベクトル
戻り値に計算後のベクトルが返ります。

ベクトルを正規化する

function Vec3dNormalize ( vec ){
  var length = Math.sqrt((vec.x * vec.x) + (vec.y * vec.y)
+ (vec.z * vec.z)); if(length > 0) length = 1 / length; return { x : vec.x * length, y : vec.y * length, z : vec.z * length }; }
 
使用例です。

ベクトル(10,5,1)を正規化する


	vec1 = _root.Vec3dCreate(10,5,1);
	vec2 = _root.Vec3dNormalize(vec1);
	
vec2.x → 0.8908…
vec2.y → 0.4454…
vec2.z → 0.0890…
 

 




ソースをダウンロード

 
 





関数をまとめたソース -

vec3d.as(6kバイト)ActionScript ファイル