topical media & game development

talk show tell print

student-ar-org-libspark-flartoolkit-core-transmat-FLARTransMat.ax

student-ar-org-libspark-flartoolkit-core-transmat-FLARTransMat.ax [swf] flex


  /* 
   * PROJECT: FLARToolKit
   * --------------------------------------------------------------------------------
   * This work is based on the NyARToolKit developed by
   *   R.Iizuka (nyatla)
   * http://nyatla.jp/nyatoolkit/
   *
   * The FLARToolKit is ActionScript 3.0 version ARToolkit class library.
   * Copyright (C)2008 Saqoosha
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * as published by the Free Software Foundation; either version 2
   * of the License, or (at your option) any later version.
   * 
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   * 
   * You should have received a copy of the GNU General Public License
   * along with this framework; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   * 
   * For further information please contact.
   *        http://www.libspark.org/wiki/saqoosha/FLARToolKit
   *        <saq(at)saqoosha.net>
   * 
   */
  
  package org.libspark.flartoolkit.core.transmat {
          import org.libspark.flartoolkit.core.FLARSquare;
          import org.libspark.flartoolkit.core.param.FLARCameraDistortionFactor;
          import org.libspark.flartoolkit.core.param.FLARParam;
          import org.libspark.flartoolkit.core.param.FLARPerspectiveProjectionMatrix;
          import org.libspark.flartoolkit.core.transmat.fitveccalc.FLARFitVecCalculator;
          import org.libspark.flartoolkit.core.transmat.optimize.FLARRotTransOptimize;
          import org.libspark.flartoolkit.core.transmat.rotmatrix.FLARRotMatrix;
          import org.libspark.flartoolkit.core.types.FLARDoublePoint2d;
          import org.libspark.flartoolkit.core.types.FLARDoublePoint3d;        
  
          
This class calculates ARMatrix from square information and holds it. -- 変換行列を計算して、結果を保持するクラス。

  
          public class @ax-student-ar-org-libspark-flartoolkit-core-transmat-FLARTransMat implements I@ax-student-ar-org-libspark-flartoolkit-core-transmat-FLARTransMat {
  
                  private static const AR_GET_TRANS_CONT_MAT_MAX_FIT_ERROR:Number = 1.0;
  
                  private var _rotmatrix:FLARRotMatrix;
                  private const _center:FLARDoublePoint2d = new FLARDoublePoint2d(0, 0);
                  private var _calculator:FLARFitVecCalculator;
                  private const _offset:FLARTransOffset = new FLARTransOffset();
                  private var _mat_optimize:FLARRotTransOptimize;
  
                  
                  public function @ax-student-ar-org-libspark-flartoolkit-core-transmat-FLARTransMat(i_param:FLARParam) {
                          const dist:FLARCameraDistortionFactor = i_param.getDistortionFactor();
                          const pmat:FLARPerspectiveProjectionMatrix = i_param.getPerspectiveProjectionMatrix();
                          this._calculator = new FLARFitVecCalculator(pmat, dist);
                          this._rotmatrix = new FLARRotMatrix(pmat);
                          this._mat_optimize = new FLARRotTransOptimize(pmat);
                  }
  
                  public function setCenter(i_x:Number, i_y:Number):void {
                          this._center.x = i_x;
                          this._center.y = i_y;
                  }
  
                  
                  
                  
                  
頂点順序をi_directionに対応して並べ替えます。
parameter: i_square
parameter: i_direction
parameter: o_sqvertex_ref FLARDoublePoint2d[]
parameter: o_liner_ref FLARLinear[]

  
                  private function initVertexOrder(i_square:FLARSquare, i_direction:int, o_sqvertex_ref:Array, o_liner_ref:Array):void {
                          //頂点順序を考慮した矩形の頂点情報
                          o_sqvertex_ref[0] = i_square.sqvertex[(4 - i_direction) % 4];
                          o_sqvertex_ref[1] = i_square.sqvertex[(5 - i_direction) % 4];
                          o_sqvertex_ref[2] = i_square.sqvertex[(6 - i_direction) % 4];
                          o_sqvertex_ref[3] = i_square.sqvertex[(7 - i_direction) % 4];        
                          o_liner_ref[0] = i_square.line[(4 - i_direction) % 4];
                          o_liner_ref[1] = i_square.line[(5 - i_direction) % 4];
                          o_liner_ref[2] = i_square.line[(6 - i_direction) % 4];
                          o_liner_ref[3] = i_square.line[(7 - i_direction) % 4];
                          return;
                  }
  
                  
                  private const __transMat_sqvertex_ref:Array = new Array(4); // FLARDoublePoint2d[]
                  private const __transMat_linear_ref:Array = new Array(4); // FLARLinear[]
                  private const __transMat_trans:FLARDoublePoint3d = new FLARDoublePoint3d();
  
                  
double arGetTransMat( ARMarkerInfo *marker_info,double center[2], double width, double conv[3][4] )
parameter: i_square 計算対象のFLARSquareオブジェクト
parameter: i_direction
parameter: i_width @return @throws FLARException

  
                  public function transMat(i_square:FLARSquare, i_direction:int, i_width:Number, o_result_conv:@fileResult):void {
                          const sqvertex_ref:Array = __transMat_sqvertex_ref; 
                          // FLARDoublePoint2d[]
                          const linear_ref:Array = __transMat_linear_ref; 
                          // FLARLinear[]
                          const trans:FLARDoublePoint3d = this.__transMat_trans;
                  
                          //計算用に頂点情報を初期化(順番調整)
                          initVertexOrder(i_square, i_direction, sqvertex_ref, linear_ref);
                  
                          //基準矩形を設定
                          this._offset.setSquare(i_width, this._center);
  
                          // rotationを矩形情報から計算
                          this._rotmatrix.initRotBySquare(linear_ref, sqvertex_ref);
  
                          //平行移動量計算機にオフセット頂点をセット
                          this._calculator.setOffsetSquare(this._offset);
                  
                          //平行移動量計算機に適応先矩形の情報をセット
                          this._calculator.setFittedSquare(sqvertex_ref);        
  
                          //回転行列の平行移動量の計算
                          this._calculator.calculateTransfer(this._rotmatrix, trans);
                  
                          //計算結果の最適化(this._rotmatrix,trans)
                          this._mat_optimize.optimize(this._rotmatrix, trans, this._calculator);
                  
                          // マトリクスの保存
                          o_result_conv.updateMatrixValue(this._rotmatrix, this._offset.point, trans);
                          return;
                  }
  
                  
double arGetTransMatCont( ARMarkerInfo *marker_info, double prev_conv[3][4],double center[2], double width, double conv[3][4] )
parameter: i_square
parameter: i_direction マーカーの方位を指定する。
parameter: i_width
parameter: io_result_conv 計算履歴を持つ@fileResultオブジェクトを指定する。 履歴を持たない場合は、transMatと同じ処理を行う。 @return @throws FLARException

  
                  public function transMatContinue(i_square:FLARSquare, i_direction:int, i_width:Number, io_result_conv:@fileResult):void {
                          const sqvertex_ref:Array = __transMat_sqvertex_ref; 
                          // FLARDoublePoint2d[]
                          const linear_ref:Array = __transMat_linear_ref; 
                          // FLARLinear[]
                          const trans:FLARDoublePoint3d = this.__transMat_trans;
  
                          // io_result_convが初期値なら、transMatで計算する。
                          if (!io_result_conv.hasValue()) {
                                  this.transMat(i_square, i_direction, i_width, io_result_conv);
                                  return;
                          }
                  
                          //基準矩形を設定
                          this._offset.setSquare(i_width, this._center);
  
                          // rotationを矩形情報を一つ前の変換行列で初期化
                          this._rotmatrix.initRotByPrevResult(io_result_conv);
  
                          //平行移動量計算機に、オフセット頂点をセット
                          this._calculator.setOffsetSquare(this._offset);
                  
                          //平行移動量計算機に、適応先矩形の情報をセット
                          this._calculator.setFittedSquare(sqvertex_ref);        
                                  
                          //回転行列の平行移動量の計算
                          this._calculator.calculateTransfer(this._rotmatrix, trans);
                  
                          //計算結果の最適化(this._rotmatrix,trans)
                          const err:Number = this._mat_optimize.optimize(this._rotmatrix, trans, this._calculator);
                  
                          //計算結果を保存
                          io_result_conv.updateMatrixValue(this._rotmatrix, this._offset.point, trans);
  
                          // エラー値が許容範囲でなければTransMatをやり直し
                          if (err > AR_GET_TRANS_CONT_MAT_MAX_FIT_ERROR) {
                                  // rotationを矩形情報で初期化
                                  this._rotmatrix.initRotBySquare(linear_ref, sqvertex_ref);
                                  //回転行列の平行移動量の計算
                                  this._calculator.calculateTransfer(this._rotmatrix, trans);
                                  //計算結果の最適化(this._rotmatrix,trans)
                                  const err2:Number = this._mat_optimize.optimize(this._rotmatrix, trans, this._calculator);
                                  //エラー値が低かったら値を差換え
                                  if (err2 < err) {
                                          // 良い値が取れたら、差換え
                                          io_result_conv.updateMatrixValue(this._rotmatrix, this._offset.point, trans);
                                  }
                          }
                          return;
                  }
          }
  }


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.