![]()
野中文雄のFlash CS4 3D講座
Flash CS4 Professionalには、3次元空間の表現力が加わりました。ActionScript 3.0にも、Flash Player 10対応のこうした機能を実現するクラスやメソッドが備わっています。本講座では、3つのクラスとひとつのメソッドをご紹介します。
- ・Matrix3Dクラス
- ・Vector3Dクラス
- ・Vectorクラス
- ・Graphics.drawTriangles()メソッド
第1のMatrix3Dクラスは、MovieClipなどのインスタンスに3次元座標変換を加えます。第2のVector3Dクラスは、3次元空間の座標を操作します。第3のVectorクラスは、直接3次元空間には関わらないものの、複数の座標などを最適化して扱います。第4のGraphics.drawTriangles()メソッドは、ビットマップを複数の三角形に分けてマッピングし、3次元を表現するために用いられます。
これらのクラスやメソッドの使い方と、その前提となる3次元座標空間の考え方について、サンプルスクリプトを示しながら解説します。また、ベクトルや行列などの数学的な基礎にも触れます。
※講座内容の応用例です。講座では、立方体1面の扱いを中心として、スクリプトの仕組みと考え方を解説し作成いたします。
数学の知識については、高校文系程度で結構です。スクリプトはActionScript 3.0を使い、Flashムービーファイルにフレームアクションで記述します。カスタムクラスの定義は行いません。イベントリスナーの扱いや条件判定を理解していることが前提となります。
講座レベル![]()
■カリキュラム概要
3次元座標空間の表現
- パースペクティブ
Graphics.drawTriangles()メソッド
- Vectorクラス
- VectorクラスがArrayクラスと異なる点
- 塗りのビットマップの指定
- Graphics.drawTriangles()メソッドの引数
- ドラッグで変形した任意の四角形にテクスチャマッピング
Matrix3Dクラス
- 変換のprependとappend
- Matrix3D.prependRotation()メソッド
- Matrix3D.appendRotation()メソッド
- 座標変換が適用される順序
- 複数の座標変換を組合わせる
Vector3Dクラス
- ベクトルの内積
- 透視投影
- Matrix3Dクラスを用いたVector3Dの座標変換
*カリキュラムの進度および内容は、受講者全員の理解度・習得度によって変更される場合があります。
- 使用アプリケーション
- Adobe Flash CS4
- 講師
- 野中文雄
- 定員
- 6名
- 対象
- ActionScript 3.0のイベントリスナーの扱いを学習された方。
「 林拓也のActionScript 3.0入門講座(後半) 」を受講された方。
本ページ下の 受講対象レベルチェック問題 を理解できる方。 - 料金
- 29,800円(税込み)
■受講対象レベルチェック問題
*全問正解が受講の必須条件ではなく、受講対象レベルの具体的な目安とお考えください。
問1:
円の面積を求める関数xGetCircleArea()を定義してください。関数xGetCircleArea()に円の半径を渡すと、円の面積が返されます。たとえば、つぎのとおりです。
trace(xGetCircleArea(10));
// 出力: 314.1592653589793
問2:
上記「問 1」で作成した関数xGetCircleArea()に、仕様を追加します。円の半径は正数でなければなりませんので、引数として負の数を渡したときは、特別な値NaNを返すようにしてください。たとえば、つぎのような結果になります。
trace(xGetCircleArea(-10));
// 出力: NaN
問3:
DisplayObject.addEventListener()メソッドを使って、MovieClipインスタンスを回転するフレームアクションを作成してください。回転は時計回りで、速度は毎フレーム10度とします。スクリプトは、MovieClipシンボルの第1フレームアクションに記述します。
答1:
ActionScript 1.0で記述していますが、2.0の型指定を加えても構いません。
function xGetCircleArea(nRadius:Number):Number {
var nCircleArea:Number = nRadius * nRadius * Math.PI;
return nCircleArea;
}function xGetCircleArea(nRadius:Number):Number {
var nCircleArea:Number = Math.pow(nRadius, 2) * Math.PI;
return nCircleArea;
}答2:
function xGetCircleArea(nRadius:Number):Number {
if (nRadius < 0) {
return NaN;
}
var nCircleArea:Number = nRadius * nRadius * Math.PI;
return nCircleArea;
}function xGetCircleArea(nRadius:Number):Number {
if (nRadius < 0) {
return NaN;
} else {
var nCircleArea:Number = Math.pow(nRadius, 2) * Math.PI;
return nCircleArea;
}
}答3:
addEventListener(Event.ENTER_FRAME, xRotate);
function xRotate(eventObject:Event):void {
rotation += 10;
}







