ホーム > 荒巻オンライン3 > 開発記録 2009/02/25

開発記録 2009/02/25

開発記録

  • マップとの当たり判定を作成中
  • こんな感じ

    package jp.sourceforge.aramaki.objects.maps {
    import __AS3__.vec.Vector;

    import jp.sourceforge.aramaki.objects.maps.CollisionResult;

    import org.papervision3d.core.geom.renderables.Triangle3D;
    import org.papervision3d.core.math.Number3D;
    import org.papervision3d.objects.DisplayObject3D;

    public class CollisionInfo {
    /**
    * 面配列
    */
    private var faces:Vector.<face>=new Vector.<face>;

    /**
    * CollisionResult
    *
    * 当たり判定を取るたびに作ると遅いので、あらかじめ作っておいて使いまわす
    */
    private var collisionResult:CollisionResult=new CollisionResult;

    /**
    * どう見てもコンストラクタ
    *
    * DisplayObject3Dから当たり判定情報を生成
    *
    * @param obj DisplayObject3D
    */
    public function CollisionInfo(obj:DisplayObject3D) {
    generateCollisionInfo(obj);
    }

    /**
    * DisplayObject3Dから当たり判定情報を生成
    *
    * @param obj DisplayObject3D
    */
    private function generateCollisionInfo(obj:DisplayObject3D):void {
    for each(var face:Triangle3D in obj.geometry.faces) {
    faces.push(new Face(face.v0.toNumber3D(),face.v1.toNumber3D(),face.v2.toNumber3D(),face.faceNormal));
    }

    //子オブジェクトも処理
    for each(var child:DisplayObject3D in obj.children) {
    generateCollisionInfo(child);
    }
    }

    /**
    * 当たり判定情報と線分で当たり判定を取る
    *
    * @param lineStart 線分の始点
    * @param lineEnd 線分の終点
    * @return 当たっていたらCollisionResult、当たっていなかったらnullを返す
    */
    private function collide(lineStart:Number3D,lineEnd:Number3D):CollisionResult {
    for each(var face:Face in faces) {
    var crossPoint:Number3D=face.collide(lineStart,lineEnd);

    if (crossPoint) {
    collisionResult.internal::crossPoint=crossPoint;
    collisionResult.internal::hitFace=face;

    return collisionResult;
    }
    }

    return null;
    }
    }
    }

    package jp.sourceforge.aramaki.objects.maps {
    import org.papervision3d.core.math.Number3D;

    public class Face {
    /**
    * 頂点
    */
    private var v0:Number3D;
    /**
    * 頂点
    */
    private var v1:Number3D;
    /**
    * 頂点
    */
    private var v2:Number3D;
    /**
    * 面法線
    */
    private var normal:Number3D;

    /**
    * コンスト☆ラクタ
    *
    * @param v0 頂点
    * @param v1 頂点
    * @param v2 頂点
    * @param normal 面法線
    */
    public function Face(v0:Number3D,v1:Number3D,v2:Number3D,normal:Number3D) {
    this.v0=v0;
    this.v1=v1;
    this.v2=v2;
    this.normal=normal;
    }

    /**
    * 面と線分で当たり判定を取る
    *
    * @param lineStart 線分の始点
    * @param lineEnd 線分の終点
    * @return 当たっていたら交点、当たっていなかったらnullを返す
    */
    public function collide(lineStart:Number3D,lineEnd:Number3D):Number3D {
    //TODO
    return null;
    }
    }
    }

    package jp.sourceforge.aramaki.objects.maps {
    import jp.sourceforge.aramaki.objects.maps.Face;

    import org.papervision3d.core.math.Number3D;

    public class CollisionResult {
    /**
    * @private
    */
    private var _hitFace:Face;
    /**
    * @private
    */
    private var _crossPoint:Number3D;

    /**
    * 当たった面
    */
    public function get hitFace():Face {
    return _hitFace;
    }

    /**
    * @private
    */
    internal function set hitFace(value:Face):void {
    _hitFace=value;
    }

    /**
    * 交点
    */
    public function get crossPoint():Number3D {
    return _crossPoint;
    }

    /**
    * @private
    */
    internal function set crossPoint(value:Number3D):void {
    _crossPoint=value;
    }
    }
    }

  1. コメントはまだありません。
  1. トラックバックはまだありません。