'만유인력'에 해당되는 글 2건

  1. 2009.06.19 [ 00 ] 중력 & 반중력? 에서 제작할 무비 예제 [Gravity Play]
  2. 2009.06.11 [ 01 ] 중력 & 반중력 ?
2009.06.19 17:08

-6/ 19 업데잇-


무비 예제 입니다. 아직 미완성이라 글을 차차 쓰면서 업데잇할 계획입니다.



가만히 내비두면 저렇게 자취를 남깁니다.
(컴 사양을 많이 탑니다, 그래서 최적화 버튼을 만들어 봤었는데 제대로 동작하지 않아서  동작합니다..ㅋ.,)







장난 치는 방법은, 아래에 버튼을 보시면 됩니다.

컴 사양을 많이 타기에 저사양 유저분들은 플래시-우클릭-퀼리티-로우 설정을 해주시면 됩니다.

주기적으로 최적화 함수를 호출해서 어느정도 괜찮아 졌습니다...ㅎ


패치_01

화면 사이즈를 640x360 으로 크게 만들었습니다.
폭팔하는 혜성도 추가하였습니다.(add P2) 2개 이상, 27개 이하의 조각이 나옵니다.
역시 속도 벡터는 렌덤입니다.
무비 중심으로 부터의 거리가 600을 초과하면 해당 혜성은 사라집니다.
또한 중력공과 혜성의 거리가 8 미만이 되면 해당 혜성은 사라집니다.
만유인력 상수를 전버전에 비해 두배로 적용시켰습니다.




저작자 표시 비영리 변경 금지
신고
Trackback 0 Comment 0
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


티스토리 툴바