'ActionScript3'에 해당되는 글 2건

  1. 2010/04/28 Actionscript3 - Matrix3D 의 버그?? (5)
  2. 2009/12/21 Actionscript 3 원과 원 충돌 테스트
아래와 같이 내장 API인 Matrix3D 을 사용해서 객체를 X,Y,Z 축으로 로테이션 시켜보려하였습니다.

_mat = new Matrix3D();
_mat.identity();
_mat.appendRotation(1, Vector3D.Y_AXIS) ;

_vec = new Vector3D(100,0,0) ;

private function loop(e:Event):void
{
_vec = _mat.transformVector(_vec) ;

_obj.x = _vec.x ;
_obj.y = _vec.y ;
_obj.z = _vec.z ;
}

그런데 위와 같이 실행하면 _vec (Vector3D) 의 x,y,z 성분이 모두 0으로 수렴(?) 하게 되네요. 레퍼런스를 찾아보면 Matrix3D 의 transformVector 멤버함수는 매개변수로 넘어온 벡터에 변환을 적용한후 새로운 Vector3D 객체를 반환한다고 나오는데 해석을 잘못한건지 ..

그래서 일단 CustomMatrix3D 클레스를 만들어 보았습니다.

CustomMatrix3D 를 사용해서 위와 같은 시도를 해보았습니다.
package example.matrix {
   
    import flash.display.Shape;
    import flash.events.Event;
    import flash.geom.Vector3D;
   
    import flash.display.Sprite;

    /**
     * @author Lee
     * http://webnoon.net
     */
    public class MatrixMain extends Sprite {

       
       
       
        private var _vec : Vector3D;
        private var _ball : Shape;
        private var _mat : CustomMatrix3D;

        public function MatrixMain() {
           
           
           
           
            _vec = new Vector3D(100,0,0) ;
            _vec.w = 1 ;
            var rad : Number = Math.PI/180 ;
           
            _mat = new CustomMatrix3D() ;
            _mat.rotationY(rad) ;
            //_mat.rotationZ(rad) ;
            //_mat.rotationX(rad) ;
            //_mat.translation(0, 1, 0) ;
           
            _ball = new Shape();
            with(_ball.graphics)
            {
                beginFill(0xff0000) ;
                drawCircle(.0, .0, 10) ;
                endFill();
            }
            addChild(_ball) ;
           
            addEventListener(Event.ENTER_FRAME,loop);
        }
       
        private function loop(event : Event) : void {
           
            _mat.transformVector(_vec) ;
           
            _ball.x = _vec.x + stage.stageWidth/2;
            _ball.y = _vec.y + stage.stageHeight/2 ;
            _ball.z = _vec.z ;
           
        }
    }
}

[소스코드]

아래는 실행 결과...


rotationX,Y,Z , translation 모두 잘 적용됨을 알수 있습니다.

Flash Builder4 에서 실행결과 flash.geom.Matrix3D 사용에는 이상이 없었습니다.
오류(?) 가 발생한 환경은 FDT + Flash CS4(컴파일) 입니다.
개발 환경이 잘못된건지 제가 실수한건지 정확히 알수는 없지만 Flash Builder4 에서 실행한 코드는 같은 코드로 실행하였습니다.

저작자 표시 비영리 변경 금지
Posted by 웹눈

<-클릭


기존의 방식은 두 원간의 거리 차가 두 원의 반지름의 합보다 작으면, 충돌을 확인하는 방법이였다면, 이 방식은 두 원의 속도 벡터를 분석하여, 충돌이 일어날지의 여부를 미리 예측하고 그에 따른 적절한 대응을 해준것이다.

두 원을 각각 s0 , s1 이라고 하고, 두원의 시간(t)에 대한 위치를 p0 , p1 이라고 하자. (0<= t <= 1 )

p0(t) = C0 + V0*t
p1(t) = C1 + V1*t

로 쓸수 있다.

그럼 시간에 따른 두 원간의 거리를 d(t) 로 나타내어 보면

d(t) = p1(t) - p0(t) = (c1 - c0) + (v1 - v0)*t

즉, d의 length 가 두 원의 반지름의 합(r0 + r1) 보다 작으면 충돌이 일어나게 된다.

if (|d| <= r0 + r1 ) -> 충돌

Cost 를 절감하기 위해서(sqrt 함수 사용을 피하자, 이는 고비용을 요구한다.)

d.dot(d) = = r^2 일때의 t의 값을 구하면 충돌지점을 알아낼수 있다.

d = c + v*t 라고 하면,

c.dot(c) + 2*c.dot(v)*t + v.dot(v)*t^2 = r^2

이 방정식을 근의 공식을 사용해서 풀면 t를 구할수 있음..

즉, c0.add(v0 * t) 의 위치에서 충돌이 발생한다.



Posted by 웹눈