embed

  1. package
  2. {
  3.     import flash.display.*;
  4.     import flash.events.*;
  5.     import flash.text.*;
  6.     import flash.ui.Keyboard;
  7.     import flash.utils.getTimer;
  8.     
  9.     [SWF(width="465", height="465",
  10.         backgroundColor="0x000000", frameRate="30")]
  11.     public class Donuts02 extends Sprite
  12.     {
  13.         private var _donuts:Donuts;
  14.         private var _matrix:Matrix3D;
  15.         private var _render:Render;
  16.         
  17.         private var _textField:TextField;
  18.         
  19.         private var _rx:Number = 0;
  20.         private var _ry:Number = 0;
  21.         private var _rz:Number = 0;
  22.         
  23.         private var _isAutoPlay:Boolean = false;
  24.         
  25.         private const STAGE_WIDTH:Number = stage.stageWidth;
  26.         private const STAGE_HEIGHT:Number = stage.stageHeight;
  27.         
  28.         public function Donuts02()
  29.         {
  30.             configure();
  31.             
  32.             var pi:Number = Math.PI;
  33.             var start:int;
  34.             var i:int;
  35.             
  36.             _donuts = new Donuts(160.7);
  37.             _matrix = new Matrix3D();
  38.             _render = new Render(graphics, _matrix);
  39.             
  40.             addTextField();
  41.             
  42.             mainLoop(null);
  43.             
  44.             stage.addEventListener(MouseEvent.CLICK, changePlayMode);
  45.             
  46.             _textField.text =
  47.                 "Partitions : " + _donuts.numPartitions + "\n" +
  48.                 "Vertices : " + _donuts.vertices.length + "\n" +
  49.                 "Stretch : " + _donuts.stretch;
  50.         }
  51.         
  52.         private function configure():void
  53.         {
  54.             stage.align = StageAlign.TOP_LEFT;
  55.             stage.scaleMode = StageScaleMode.NO_SCALE;
  56.             stage.showDefaultContextMenu = false;
  57.         }
  58.         
  59.         private function addTextField():void
  60.         {
  61.             _textField = new TextField();
  62.             _textField.defaultTextFormat = new TextFormat(
  63.                 nullnull, 0xFFFFFF, nullnullnullnullnull, TextFormatAlign.RIGHT);
  64.             _textField.autoSize = TextFieldAutoSize.RIGHT;
  65.             _textField.background = true;
  66.             _textField.backgroundColor = 0x000000;
  67.             _textField.selectable = false;
  68.             _textField.x = STAGE_WIDTH - _textField.width;
  69.             
  70.             addChild(_textField);
  71.             
  72.             var announce:TextField = new TextField();
  73.             announce.defaultTextFormat = new TextFormat(
  74.                 nullnull, 0xFFFFFF, nullnullnullnullnull, TextFormatAlign.LEFT);
  75.             announce.autoSize = TextFieldAutoSize.LEFT;
  76.             announce.background = true;
  77.             announce.backgroundColor = 0x000000;
  78.             announce.selectable = false;
  79.             announce.text =
  80.                 "\"DOWN\" : Partitions -\n" +
  81.                 "\"UP\" : Partitions +\n" +
  82.                 "\"LEFT\" : Stretch -\n" +
  83.                 "\"RIGHT\" : Stretch +\n" +
  84.                 "\"Z\" : Polygon on/off\n" +
  85.                 "\"X\" : Wireframe on/off";
  86.             announce.y = STAGE_HEIGHT - announce.height;
  87.             
  88.             addChild(announce);
  89.         }
  90.         
  91.         private function mainLoop(event:Event):void
  92.         {
  93.             _matrix.identity();
  94.             _matrix.scale(505050);
  95.             _matrix.rotateX(_rx);
  96.             _matrix.rotateY(_ry);
  97.             _matrix.rotateZ(_rz);
  98.             _matrix.translate(STAGE_WIDTH / 2, STAGE_HEIGHT / 20);
  99.             
  100.             graphics.clear();
  101.             
  102.             _render.drawIndexedPrimitive(
  103.                 Render.PRIMITIVE_POLYGON, _donuts.vertices, _donuts.indices);
  104.             
  105.             _rx += 0.04;
  106.             _ry += 0.08;
  107.             _rz += 0.02;
  108.         }
  109.         
  110.         private function changePlayMode(event:MouseEvent):void
  111.         {
  112.             if (_isAutoPlay)
  113.             {
  114.                 removeEventListener(Event.ENTER_FRAME, mainLoop);
  115.                 stage.removeEventListener(KeyboardEvent.KEY_DOWN, changeDonuts);
  116.             }
  117.             else
  118.             {
  119.                 addEventListener(Event.ENTER_FRAME, mainLoop);
  120.                 stage.addEventListener(KeyboardEvent.KEY_DOWN, changeDonuts);
  121.             }
  122.             
  123.             _isAutoPlay = !_isAutoPlay;
  124.         }
  125.         
  126.         private function changeDonuts(event:KeyboardEvent):void
  127.         {
  128.             var numPartitions:int = _donuts.numPartitions;
  129.             
  130.             switch (event.keyCode)
  131.             {
  132.                 case Keyboard.UP:
  133.                     if (numPartitions >= 0)
  134.                     {
  135.                         _donuts.numPartitions += 1;
  136.                     }
  137.                     break;
  138.                 case Keyboard.DOWN:
  139.                     if (numPartitions > 0)
  140.                     {
  141.                         _donuts.numPartitions -= 1;
  142.                     }
  143.                     break;
  144.                 case Keyboard.LEFT:
  145.                     _donuts.stretch -= 0.02;
  146.                     break;
  147.                 case Keyboard.RIGHT:
  148.                     _donuts.stretch += 0.02;
  149.                     break;
  150.                 case 88:
  151.                     //trace("X");
  152.                     _render.wireframeEnabled = !_render.wireframeEnabled;
  153.                     break;
  154.                 case 90:
  155.                     //trace("Z");
  156.                     _render.polygonEnabled = !_render.polygonEnabled;
  157.                     break;
  158.             }
  159.             
  160.             _textField.text =
  161.                 "Partitions : " + _donuts.numPartitions + "\n" +
  162.                 "Vertices : " + _donuts.vertices.length + "\n" +
  163.                 "Stretch : " + _donuts.stretch.toString().substr(04);
  164.         }
  165.     }
  166. }
  167. import flash.display.Graphics;
  168. class Render
  169. {
  170.     public static const PRIMITIVE_POLYGON:int = 1;
  171.     
  172.     private var _graphics:Graphics;
  173.     private var _matrix:Matrix3D;
  174.     private var _mode:int;
  175.     
  176.     private var _polygonEnabled:Boolean = true;
  177.     private var _wireframeEnabled:Boolean = false;
  178.     
  179.     // 光源ベクトル
  180.     private var _light:Vector3D   = new Vector3D( 0.0,  0.0, -1.0);
  181.     
  182.     // アンビエント(環境光)の色
  183.     private var _ambient:Vector3D = new Vector3D( 0.2,  0.2,  0.2);
  184.     // ディフューズ(拡散光)の色
  185.     private var _diffuse:Vector3D = new Vector3D( 0.8,  0.8,  0.8);
  186.     
  187.     /**
  188.     * 新しい Render インスタンスを作成します。
  189.     */
  190.     public function Render(
  191.         graphics:Graphics = null, matrix:Matrix3D = null, mode:int = 1):void
  192.     {
  193.         _graphics = graphics;
  194.         _matrix = matrix;
  195.         _mode = mode;
  196.     }
  197.     
  198.     public function drawIndexedPrimitive(type:int, vertices:Array, indices:Array):void
  199.     {
  200.         var i:int;
  201.         var l:int;
  202.         
  203.         var tv:Array = [];
  204.         
  205.         // 座標を一次変換
  206.         for (i = 0, l = vertices.length; i < l; ++i)
  207.         {
  208.             tv.push(_matrix.transform(vertices[i]));
  209.         }
  210.         
  211.         // ラスタライズ
  212.         switch (type)
  213.         {
  214.             case PRIMITIVE_POLYGON:
  215.                 
  216.                 var triangles:Array = [];
  217.                 
  218.                 for (i = 0, l = indices.length; i < l; i += 3)
  219.                 {
  220.                     triangles.push(new Triangle3D(
  221.                         tv[indices[i    ]],
  222.                         tv[indices[i + 1]],
  223.                         tv[indices[i + 2]]
  224.                     ));
  225.                 }
  226.                 
  227.                 // 深度ソート
  228.                 triangles.sortOn("depth"Array.DESCENDING | Array.NUMERIC);
  229.                 
  230.                 for each (var triangle:Triangle3D in triangles)
  231.                 {
  232.                     drawPolygon(triangle);
  233.                 }
  234.                 
  235.                 break;
  236.         }
  237.     }
  238.     
  239.     private function drawPolygon(triangle:Triangle3D):void
  240.     {
  241.         if (polygonEnabled)
  242.         {
  243.             // 面の法線ベクトルを求める。
  244.             var n:Vector3D = triangle.normal();
  245.             
  246.             // 光源と法線の内積を取る。
  247.             var w:Number = n.dot(_light);
  248.             
  249.             // 背面カリング処理。
  250.             // 内積が負なら背面なので描画しない。(ただしパースをつけた場合は正確な判定方法ではない。)
  251.             if (w < 0)
  252.             {
  253.                 return;
  254.             }
  255.             
  256.             var r:int = (_ambient.x + w * _diffuse.x) * 255;
  257.             var g:int = (_ambient.y + w * _diffuse.y) * 255;
  258.             var b:int = (_ambient.z + w * _diffuse.z) * 255;
  259.             
  260.             r = (r < 0) ? 0 : (r > 255) ? 255 : r;
  261.             g = (g < 0) ? 0 : (g > 255) ? 255 : g;
  262.             b = (b < 0) ? 0 : (b > 255) ? 255 : b;
  263.             
  264.             _graphics.beginFill(r << 16 | g << 8 | b);
  265.         }
  266.         
  267.         if (wireframeEnabled)
  268.         {
  269.             _graphics.lineStyle(0, 0xFF0000);
  270.         }
  271.         
  272.         _graphics.moveTo(triangle.v1.x, triangle.v1.y);
  273.         _graphics.lineTo(triangle.v2.x, triangle.v2.y);
  274.         _graphics.lineTo(triangle.v3.x, triangle.v3.y);
  275.         _graphics.lineTo(triangle.v1.x, triangle.v1.y);
  276.         
  277.         _graphics.endFill();
  278.     }
  279.     
  280.     public function get graphics():Graphics
  281.     {
  282.         return _graphics;
  283.     }
  284.     
  285.     public function set graphics(value:Graphics):void
  286.     {
  287.         _graphics = value;
  288.     }
  289.     
  290.     public function get matrix():Matrix3D
  291.     {
  292.         return _matrix;
  293.     }
  294.     
  295.     public function set matrix(value:Matrix3D):void
  296.     {
  297.         _matrix = value;
  298.     }
  299.     
  300.     public function get polygonEnabled():Boolean
  301.     {
  302.         return _polygonEnabled;
  303.     }
  304.     
  305.     public function set polygonEnabled(value:Boolean):void
  306.     {
  307.         _polygonEnabled = value;
  308.     }
  309.     
  310.     public function get wireframeEnabled():Boolean
  311.     {
  312.         return _wireframeEnabled;
  313.     }
  314.     
  315.     public function set wireframeEnabled(value:Boolean):void
  316.     {
  317.         _wireframeEnabled = value;
  318.     }
  319. }
  320. class Donuts
  321. {
  322.     private var _vertices:Array;
  323.     private var _indices:Array;
  324.     private var _numPartitions:int;
  325.     private var _stretch:Number;
  326.     
  327.     /**
  328.      * @param numPartitions 分割数
  329.      * @param stretch 拡がり
  330.      */
  331.     public function Donuts(numPartitions:int = 16, stretch:Number = 1):void
  332.     {
  333.         _numPartitions = numPartitions;
  334.         _stretch = stretch;
  335.         
  336.         setup(numPartitions, stretch);
  337.     }
  338.     
  339.     /**
  340.      * @private
  341.      */
  342.     private function setup(numPartitions:int, stretch:Number):void
  343.     {
  344.         var n:int = numPartitions;
  345.         
  346.         var i:int;
  347.         var j:int;
  348.         
  349.         var a:Number = 0;
  350.         var c:Number = 0;
  351.         var addc:Number = Math.PI * 2 / n;
  352.         
  353.         var s:Number;
  354.         var z:Number;
  355.         var x:Number;
  356.         var y:Number;
  357.         
  358.         _vertices = [];
  359.         
  360.         for (i = 0; i < n; ++i)
  361.         {
  362.             s = Math.sin(c) + 2;
  363.             z = Math.cos(c);
  364.             
  365.             for (j = 0; j < n; ++j)
  366.             {
  367.                 x = Math.cos(a);
  368.                 y = Math.sin(a);
  369.                 
  370.                 _vertices.push(new Vector3D(
  371.                     x * s * stretch,
  372.                     y * s * stretch,
  373.                     z     * stretch
  374.                 ));
  375.                 
  376.                 a += Math.PI / n * 2;
  377.             }
  378.             
  379.             c += addc;
  380.         }
  381.         
  382.         var m:int = n * n;
  383.         var off:Number;
  384.         
  385.         _indices = [];
  386.         
  387.         for (i = 0; i < n; ++i)
  388.         {
  389.             off = i * n;
  390.             
  391.             for (j = 0; j < n; ++j)
  392.             {
  393.                 _indices.push((off + n) % m + (j + 1) % n);
  394.                 _indices.push( off          + (j + 1) % n);
  395.                 _indices.push( off          +  j         );
  396.                 _indices.push((off + n) % m +  j         );
  397.                 _indices.push((off + n) % m + (j + 1) % n);
  398.                 _indices.push( off          +  j         );
  399.             }
  400.         }
  401.     }
  402.     
  403.     public function get vertices():Array
  404.     {
  405.         return _vertices.concat();
  406.     }
  407.     
  408.     public function get indices():Array
  409.     {
  410.         return _indices.concat();
  411.     }
  412.     
  413.     public function get numPartitions():int
  414.     {
  415.         return _numPartitions;
  416.     }
  417.     
  418.     public function set numPartitions(value:int):void
  419.     {
  420.         _numPartitions = value;
  421.         
  422.         setup(value, stretch);
  423.     }
  424.     
  425.     public function get stretch():Number
  426.     {
  427.         return _stretch;
  428.     }
  429.     
  430.     public function set stretch(value:Number):void
  431.     {
  432.         _stretch = value;
  433.         
  434.         setup(numPartitions, value);
  435.     }
  436. }
  437. class Triangle3D
  438. {
  439.     private var _v1:Vector3D;
  440.     private var _v2:Vector3D;
  441.     private var _v3:Vector3D;
  442.     
  443.     /**
  444.     * 新しい Triangle3D インスタンスを作成します。
  445.     */
  446.     public function Triangle3D(v1:Vector3D, v2:Vector3D, v3:Vector3D):void
  447.     {
  448.         _v1 = v1;
  449.         _v2 = v2;
  450.         _v3 = v3;
  451.     }
  452.     
  453.     public function get v1():Vector3D
  454.     {
  455.         return _v1;
  456.     }
  457.     
  458.     public function set v1(value:Vector3D):void
  459.     {
  460.         _v1 = value;
  461.     }
  462.     
  463.     public function get v2():Vector3D
  464.     {
  465.         return _v2;
  466.     }
  467.     
  468.     public function set v2(value:Vector3D):void
  469.     {
  470.         _v2 = value;
  471.     }
  472.     
  473.     public function get v3():Vector3D
  474.     {
  475.         return _v3;
  476.     }
  477.     
  478.     public function set v3(value:Vector3D):void
  479.     {
  480.         _v3 = value;
  481.     }
  482.     
  483.     /**
  484.      * 各ベクトルの z の値を比較し、最も低い数値を返します。
  485.      * 深度ソート時に Array オブジェクトの sortOn と合わせて使用します。
  486.      */
  487.     public function get depth():Number
  488.     {
  489.         var min:Number = (v1.z < v2.z) ? v1.z : v2.z;
  490.         return (min < v3.z) ? min : v3.z;
  491.     }
  492.     
  493.     /**
  494.      * このトライアングルを面とする法線ベクトルを返します。
  495.      * 
  496.      * @return このトライアングルを面とする法線ベクトル
  497.      */
  498.     public function normal():Vector3D
  499.     {
  500.         var n:Vector3D = new Vector3D();
  501.         n.cross(v1.distance(v2), v1.distance(v3));
  502.         n.normalize();
  503.         
  504.         return n;
  505.     }
  506.     
  507.     /**
  508.      * このトライアングルのストリング表現を返します。
  509.      * 
  510.      * @return このトライアングルのストリング表現
  511.      */
  512.     public function toString():String
  513.     {
  514.         var temp:String = "Triangle3D {\n" +
  515.             "\tv1 : " + v1 + "\n" +
  516.             "\tv2 : " + v2 + "\n" +
  517.             "\tv3 : " + v3 + "\n}";
  518.         
  519.         return temp;
  520.     }
  521. }
  522. class Matrix3D
  523. {
  524.     private var _matrix:Array;
  525.     
  526.     /**
  527.     * 新しい Matrix3D インスタンスを作成します。
  528.     */
  529.     public function Matrix3D():void
  530.     {
  531.         identity();
  532.     }
  533.     
  534.     public function identity():void
  535.     {
  536.         _matrix = [
  537.             1000,
  538.             0100,
  539.             0010,
  540.             0001
  541.         ];
  542.     }
  543.     
  544.     public function scale(sx:Number, sy:Number, sz:Number)
  545.     {
  546.         _matrix = _multiply(_matrix, [
  547.             sx,  0,  0,  0,
  548.              0, sy,  0,  0,
  549.              0,  0, sz,  0,
  550.              0,  0,  0,  1
  551.         ]);
  552.     }
  553.     
  554.     public function translate(dx:Number, dy:Number, dz:Number)
  555.     {
  556.         _matrix = _multiply(_matrix, [
  557.              1,  0,  0,  0,
  558.              0,  1,  0,  0,
  559.              0,  0,  1,  0,
  560.             dx, dy, dz,  1
  561.         ]);
  562.     }
  563.     
  564.     public function rotateX(angleRadians:Number)
  565.     {
  566.         var sin = Math.sin(angleRadians);
  567.         var cos = Math.cos(angleRadians);
  568.         
  569.         _matrix = _multiply(_matrix, [
  570.             1,    0,   00,
  571.             0,  cos, sin, 0,
  572.             0, -sin, cos, 0,
  573.             0,    0,   01
  574.         ]);
  575.     }
  576.     
  577.     public function rotateY(angleRadians:Number)
  578.     {
  579.         var sin = Math.sin(angleRadians);
  580.         var cos = Math.cos(angleRadians);
  581.         
  582.         _matrix = _multiply(_matrix, [
  583.             cos, 0, -sin, 0,
  584.               01,    00,
  585.             sin, 0,  cos, 0,
  586.               00,    01
  587.         ]);
  588.     }
  589.     
  590.     public function rotateZ(angleRadians:Number)
  591.     {
  592.         var sin = Math.sin(angleRadians);
  593.         var cos = Math.cos(angleRadians);
  594.         
  595.         _matrix = _multiply(_matrix, [
  596.              cos, sin, 00,
  597.             -sin, cos, 00,
  598.                0,   010,
  599.                0,   001
  600.         ]);
  601.     }
  602.     
  603.     /**
  604.      * このマトリクスで指定のベクトルを一次変換します。
  605.      * 
  606.      * @return 一次変換されたベクトル
  607.      */
  608.     public function transform(v:Vector3D):Vector3D
  609.     {
  610.         var temp:Vector3D = new Vector3D();
  611.         var m:Array = _matrix;
  612.         
  613.         temp.x = m[0] * v.x + m[4] * v.y + m[ 8] * v.z + m[12];
  614.         temp.y = m[1] * v.x + m[5] * v.y + m[ 9] * v.z + m[13];
  615.         temp.z = m[2] * v.x + m[6] * v.y + m[10] * v.z + m[14];
  616.         
  617.         return temp;
  618.     }
  619.     
  620.     /**
  621.      * このマトリクスと指定マトリクスの成分を乗算(合成)します。
  622.      * 
  623.      * @param m 対象の Matrix3D オブジェクト
  624.      */
  625.     public function multiply(m:Matrix3D):void
  626.     {
  627.         _matrix = _multiply(m.toArray(), _matrix);
  628.     }
  629.     
  630.     /**
  631.      * @private
  632.      */
  633.     private function _multiply(m1:Array, m2:Array):Array
  634.     {
  635.         var temp:Array = [];
  636.         var i:int = 0;
  637.         
  638.         for (var y:int = 0; y < 4; ++y)
  639.         {
  640.             for (var x:int = 0; x < 4; ++x)
  641.             {
  642.                 temp[x + i] =
  643.                     m1[i    ] * m2[x     ] +
  644.                     m1[i + 1] * m2[x +  4] +
  645.                     m1[i + 2] * m2[x +  8] +
  646.                     m1[i + 3] * m2[x + 12];
  647.             }
  648.             i += 4;
  649.         }
  650.         
  651.         return temp;
  652.     }
  653.     
  654.     /**
  655.      * このマトリクスの成分配列を返します。
  656.      * 
  657.      * @return このマトリクスの成分配列
  658.      */
  659.     public function toArray():Array
  660.     {
  661.         return _matrix.concat();
  662.     }
  663.     
  664.     /**
  665.      * このマトリクスのストリング表現を返します。
  666.      * 
  667.      * @return このマトリクスのストリング表現
  668.      */
  669.     public function toString():String
  670.     {
  671.         var temp:String = "Matrix3D [\n";
  672.         
  673.         for (var i:int = 0, l:int = _matrix.length; i < l; ++i)
  674.         {
  675.             if (i % 4 == 0)
  676.             {
  677.                 if (i != 0)
  678.                 {
  679.                     temp += "\n";
  680.                 }
  681.                 temp += "\t";
  682.             }
  683.             if (i != l - 1)
  684.             {
  685.                 temp += _matrix[i] + ", ";
  686.             }
  687.             else
  688.             {
  689.                 temp += _matrix[i] + "\n]";
  690.             }
  691.         }
  692.         
  693.         return temp;
  694.     }
  695. }
  696. class Vector3D
  697. {
  698.     private var _x:Number;
  699.     private var _y:Number;
  700.     private var _z:Number;
  701.     
  702.     /**
  703.     * 新しい Vector3D インスタンスを作成します。
  704.     */
  705.     public function Vector3D(x:Number = 0, y:Number = 0, z:Number = 0):void
  706.     {
  707.         _x = x;
  708.         _y = y;
  709.         _z = z;
  710.     }
  711.     
  712.     public function get x():Number
  713.     {
  714.         return _x;
  715.     }
  716.     
  717.     public function set x(value:Number):void
  718.     {
  719.         _x = value;
  720.     }
  721.     
  722.     public function get y():Number
  723.     {
  724.         return _y;
  725.     }
  726.     
  727.     public function set y(value:Number):void
  728.     {
  729.         _y = value;
  730.     }
  731.     
  732.     public function get z():Number
  733.     {
  734.         return _z;
  735.     }
  736.     
  737.     public function set z(value:Number):void
  738.     {
  739.         _z = value;
  740.     }
  741.     
  742.     /**
  743.      * このベクトルを正規化して単位ベクトルにします。
  744.      * 単位ベクトルとは大きさが 1 のベクトルのことです。
  745.      */
  746.     public function normalize():void
  747.     {
  748.         var l:Number = 1 / Math.sqrt(x * x + y * y + z * z);
  749.         
  750.         x *= l;
  751.         y *= l;
  752.         z *= l;
  753.     }
  754.     
  755.     /**
  756.      * 指定された 2 つのベクトルの外積をこのベクトルに設定します。
  757.      * 外積は主に、面に垂直な法線ベクトルを求めるために使用します。
  758.      * 
  759.      * @param v1 1 つ目のベクトル
  760.      * @param v1 2 つ目のベクトル
  761.      */
  762.     public function cross(v1:Vector3D, v2:Vector3D):void
  763.     {
  764.         x = v1.y * v2.z - v1.z * v2.y;
  765.         y = v1.z * v2.x - v1.x * v2.z;
  766.         z = v1.x * v2.y - v1.y * v2.x;
  767.     }
  768.     
  769.     /**
  770.      * このベクトルと指定ベクトルの内積を返します。
  771.      * 内積を取るとベクトルとベクトルのなす角度が求まります。
  772.      * 
  773.      * @param v ベクトル
  774.      * @return このベクトルと指定ベクトルの内積
  775.      */
  776.     public function dot(v:Vector3D):Number
  777.     {
  778.         return x * v.x + y * v.y + z * v.z;
  779.     }
  780.     
  781.     /**
  782.      * 指定された 2 つのベクトルの内積を返します。
  783.      * 内積を取るとベクトルとベクトルのなす角度が求まります。
  784.      * 
  785.      * @param v1 1 つ目のベクトル
  786.      * @param v1 2 つ目のベクトル
  787.      * @return 指定された 2 つのベクトルの内積
  788.      */
  789.     public static function dot(v1:Vector3D, v2:Vector3D):Number
  790.     {
  791.         return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
  792.     }
  793.     
  794.     /**
  795.      * ベクトルを反転します。
  796.      */
  797.     public function invert():void
  798.     {
  799.         x *= -1;
  800.         y *= -1;
  801.         z *= -1;
  802.     }
  803.     
  804.     /**
  805.      * このベクトルと指定ベクトルとの差分を表すベクトルを返します。
  806.      * 
  807.      * @return 差分を表すベクトル
  808.      */
  809.     public function distance(v:Vector3D):Vector3D
  810.     {
  811.         return new Vector3D(x - v.x, y - v.y, z - v.z);
  812.     }
  813.     
  814.     /**
  815.      * このベクトルのコピーを返します。
  816.      * 
  817.      * @return このベクトルのコピー
  818.      */
  819.     public function clone():Vector3D
  820.     {
  821.         return new Vector3D(x, y, z);
  822.     }
  823.     
  824.     /**
  825.      * このベクトルのストリング表現を返します。
  826.      * 
  827.      * @return このベクトルのストリング表現
  828.      */
  829.     public function toString():String
  830.     {
  831.         return "Vector3D {x:" + x + ", y:" + y + ", z:" + z + "}";
  832.     }
  833. }
flash swf thumbnail play
FAVORITE BY
:
:
cool!
:
3d donuts!!
:
rosca3d
:
spinning donut
Get Adobe Flash Player