開発記録 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;
}
}
}


