'벡터'에 해당되는 글 1건

  1. 2009.06.11 [ 01 ] 중력 & 반중력 ?
2009.06.11 13:04
요즘 테스트 중인 중력에 대해서 설명을 해볼까 합니다..

그러면, 중력(만유인력)은 무엇일까요?


중력 (만유인력)
질량을 가진 물질들 사이에 서로 당기는 힘이다.

서로 당기는힘,,,이라는거죠. 뉴턴의 만유인력의 법칙 아시죠?

                               F = G {m_1 m_2 \over r^2}

이게 중력에 대한 식인데요, 여기서 F는 중력, G는 만유인력 상수(6.6726×10-11N·㎡/kg2), m1, m2는 질량, r 는 두 물체사이의 거리입니다.           (그림 출처 : 위키)

하지만,,,플래시 공간에서는 2차원입니다......즉, 무비클립의 위치를 x, y 로 나타내야 한다는거죠.

그러면 벡터를 분해해야 합니다. 오래전에 포스팅한 포물선에서 보시면 아시겠지만,,,다시 그려봅니다...



대각선 화살표를 x축, y축에 대해서 분해를 한건데요, x축에 해당하는 화살표(벡터)는 벡터 F의 x성분이라고 하고 y축에 해당하는 화살표는 벡터 F의 y성분 이라고 합니다.


여기서 F의 크기를 구할 수 있으니(위에 있는 만유인력의 법칙) 각 성분을 구할 수 있겠죠?

Fx = F*Math.cos(θ)
Fy = F*Math.sin(θ)

이렇게 삼각함수로 나타낼 수 있습니다.

이것을 정리하면,

Fx = (G*m1*m2*diffX)/(r*r*r)
Fy = (G*m1*m2*diffY)/(r*r*r)

이렇게 됩니다. (diffX, diffY 는 두 물체의 x, y 의 차이, 자세한건 신명용님의 플래시 mx 액션 스크립트 1 물리편을 참조해 주세요.)

액션 스크립트(~2.0) 으로 나타내면,

var K:Number = -25;
//G*m1*m2 를 하나의 상수(K)로 생각한겁니다. 이건 마음대로 질량을 할당해주셔도 됩니다^^ 그런데, 여기서 수상한 점은 '음수'란건데요, 그 이유는 끌어 당기는 힘이기에 힘은 중심으로 향합니다,,,  반대로 양수가 되면 반중력이 되겠죠?
var tempx:Number = 0;
var tempy:Number = 0;
var i:Number=0;
var j:Number=0;

function dis(target1, target2) { // 두 무비클립 사이의 거리를 계산 (피타고라스)
    var diffX:Number = target1._x - target2._x;
    var diffY:Number = target1._y - target2._y;
    return Math.sqrt(diffX * diffX + diffY * diffY);
}

function GForceX(targetM, targetG) { //X축에 해당하는 중력 벡터
    var r:Number = dis(targetM, targetG);
    var diff:Number = targetM._x - targetG._x;
    var Fx:Number = K * diff / (r * r * r);
    return Fx;
}

function GForceY(targetM, targetG) { //Y축에 해당하는 중력 벡터
    var r:Number = dis(targetM, targetG);
    var diff:Number = targetM._y - targetG._y;
    var Fy:Number = K * diff / (r * r * r);
    return Fy;
}

function MoveBall(targetM, targetG) { //중력이 작용하는 공을 움직이게
    targetM.tempx += GForceX(targetM, targetG);
// 힘은 가속도x질량 이라서 임시(위치) 변수에 담고 이걸 속도 벡터에 더한뒤 다시 속도 벡터를 무비클립의 _x, _y 에 더합니다.
    targetM.tempy += GForceY(targetM, targetG);
    targetM.vx += targetM.tempx;
    targetM.vy += targetM.tempy;
    targetM._x = targetM.ox + targetM.vx;
//ox는 오리지널 x, 즉, 이 공이 생성된 위치 입니다..
    targetM._y = targetM.oy + targetM.vy;
}

function varGen(MBname) { // 중력이 작용하는 공 무비클립에 변수를 생성해주고 변수값을 초기화
    MBname.tempx = 0.5; //초기 속도의 x성분 벡터가 0.5
    MBname.tempy = 0.5; //초기 속도의 x성분 벡터가 0.5
    MBname.vx = 0;
    MBname.vy = 0;
    MBname.ox = MBname._x;
    MBname.oy = MBname._y;
}

_root.onLoad = function() { // 무비 로드시 중력이 작용하는 공에 변수 생성및 초기화
        varGen(_root["MB"+1]);
};

_root.onEnterFrame = function() { // 매 프레임마다 중력이 작용하는 공을 움직임
            MoveBall(_root["MB"+1],_root["GB"+1]);
};



< 다음 글 내용은~? >

지금 상태는 중력이 작용하는 공 1개, 중력공 1개인데요,,,,

1개씩만 장난치면 재미가 없겠죠?

다음 글에는 여러개의 공을 가지고 노는 방법 및 중력이 작용하는 공 과 중력공과의 직선 잇기, 자취 만들기가 되겠습니다...



궁금하신건 코맨트를 달아주세요, 그러면 제가 아는 한도내에서 답변을 드립니다^^
저작자 표시 비영리 변경 금지
신고
Trackback 0 Comment 0


티스토리 툴바