기하학 전쟁 중력 효과를 수행하는 방법


11

저는 여기서 배경 격자에 대해 말하는 것이 아니라, 중력 우물 주위를 돌고있는 소용돌이 치는 입자에 대해 이야기하고 있습니다! 나는 항상 그 효과를 좋아하고 그것을 재현하는 재미있는 실험이라고 결정했습니다 .GW는 Hooke의 법칙을 모든 곳에서 사용한다는 것을 알고 있습니다. 거리 제곱 함수처럼 보입니다.

다음은 그 효과를 보여주는 비디오입니다. http://www.youtube.com/watch?v=YgJe0YI18Fg

일부 입자에는 스프링이나 중력 효과를 아주 잘 구현할 수 있습니다. 그러나 GW 효과와 비슷한 효과를 얻을 수없는 것 같습니다. 게임에서 효과를 볼 때 입자는 Well 자체에서 무리로 방출되어 Well 중심 주위로 바깥으로 나선형으로 빠져 나가 결국 바깥쪽으로 빠져 나와 우물쪽으로 떨어지고 반복됩니다.

스폰 될 때 파티클을 바깥쪽으로 나선형으로 만들려면 어떻게해야합니까? Well 근처에있을 때 파티클을 함께 묶어두고 바깥쪽으로 날아갈 때 서로 멀어지게하려면 어떻게해야합니까? 입자를 Well에 어떻게 강력하게 부착합니까?

편집 :
http://www.youtube.com/watch?v=1eEPl8kOXN8 <-비디오
https://dl.dropbox.com/u/49283213/gw.gif <-입자 경로의 GIF

파티클 효과를보다 쉽게 ​​볼 수 있도록 GW 내에서 무작위 화를 비활성화했습니다. 여기에 청록색 배수구가 많은 파티클을 보내는 장면을 볼 수있는 비디오가 있습니다. 붉은 입자는 일반적으로 모든 곳에서 나타나는 폭발에서 비롯됩니다. 비디오에서 관찰 한 내용 :

  • 입자는 배수구의 중심 (또는 중심 근처)에서 방출됩니다.
  • 모든 입자가 중심을 중심으로 시계 방향으로 움직이고 있기 때문에 일종의 접선 운동이 적용되고 있습니다. 빨간색 폭발 입자가 배수구에 가까워지면 쉽게 볼 수 있습니다.

답변:


7

비디오에서 그것은 단지 나에게 평범한 것처럼 보인다. 대부분의 사람들은 중력이 사물을 아래쪽으로 날린다 고 생각하지만 더 먼 곳에서 보면 중심을 따라 타원 또는 나선형으로 움직입니다. 입자는 항상 중심을 향하여 가속되지만 중력으로 인해 반복해서 다시 돌아올 때까지 그 이상으로 날아갑니다. 일부 입자는 중력이 더 이상 그다지 영향을 미치지 않고 방향이 바뀌기 전에 불타 버립니다.

각 입자는 X와 Y 속도를 가지며, 각과 중심까지의 거리에 따라 각 프레임에 중력이 추가됩니다. 중력은 항상 중심의 방향 (각도)에 속도를 추가합니다.

그래서 당신은 입자를 가지고 있습니다 : 위치, 속도
중력 우물을 위해 : 위치, 강도

위치에서 입자와 중력 사이의 각도를 계산할 수 있습니다. 각도를 계산하려면 두 좌표 사이의 델타가 필요합니다.

dx = particle.x - gravity.x; dy = particle.y - gravity.y
angle = atan2(dy, dx)

이 각도는 추가해야하는 속도 벡터의 각도입니다.

적용되는 힘의 양은 거리에 따라 다릅니다. 정확히 말하자면 거리의 제곱만큼 줄어 듭니다. 따라서 물체가 두 배 더 멀리 떨어져 있으면 1/4의 힘만 적용됩니다. 거리에는 델타도 필요합니다.

distance = sqrt(dx*dx + dy*dy)
force = gravity.strength / distance*distance

이제 힘과 각도를 적용하면됩니다.

particle.velocity.x += force * sin(angle)
particle.velocity.y += force * cos(angle)

귀하의 솔루션은 내 것과 매우 유사하지만 atan, sin, cos, sqrt 등을 사용하므로 매우 느려질 수 있습니다. atan / sin / cos 부분을 피하는 것이 좋습니다. 내 게시물을 참조하십시오 (최선이 아닐 수도 있음).
GameAlchemist

최적화되지 않았으므로 더 잘 이해할 수 있습니다.
API-Beast

당신은 그렇게 할 권리가 있지만, 이론적 설명 뒤에 '최적화 된'의사 코드를 넣으면 대답이 훨씬 더 유용 할 것입니다.
GameAlchemist

여기 코드는 최적화되지 않았지만 sqrt () 호출을 피할 수있는 것으로 보입니다 . 스퀘어를 나중에 즉시 사용하여 즉시 사용하기 때문입니다.
Kyle Baran

2

그려진 것은 점이 아닌 선분 인 것 같습니다. 따라서 Well은 원에 접하는 고속 및 속도 벡터를 사용하여 원의 점을 방출한다고 생각합니다. 그리고 또 다른 점이 바로 발생합니다.이 점은 첫 번째 점과 연결되어 세그먼트를 그립니다. 그런 다음 물리 법칙 (Newton)이 강한 중력으로 적용되어 속도 감소를 설명합니다. 그래서 당신은 이것을하기 위해 정시에 통합해야한다고 생각합니다.

: C 웰의 중심, R의 반경.
P1 우리가
K를 보고있는 요점은 당신이 몇 번의 시행 (우물 덩어리)에서 선택하는 '큰'상수입니다.
vel0은 원에 접하는 초기 속도 벡터입니다. 시간 t0에서 vel0은 원에서 초기 위치
pos0이어야합니다 (시험도 수행)
.
: d C와 P1 사이의 거리
: Vn 표준 벡터 C P1

accx= - Vnx * K * 1 / square(d)   ; accy = - Vny * K * 1/square (d)  
velx = accx*(t-t0) + vel0x   ;   vely = accy(t-t0) + vel0y  
posx= (1/2)*accx*square(t-t0) + vel0x*(t-t0) + pos0x   ;   
posy= (1/2)*accx*square(t-t0) + vel0y*(t-t0) + pos0y   

Init : 새로운 점을 생성하는 가장 쉬운 방법은 각도 A를 선택하는 것입니다.

  pos0x= Cx +R *cos(A)  ; pos0y = Cy + R*sin(A)  
  vel0x = v0*sin(A)   vel0y =  - v0*cos(A)     v0= float constant.

업데이트 : 각 반복마다 계산해야합니다.

d= square root( square(P1x-Cx)+square(P1y-Cy) )  
Vnx= (P1x-Cx)/d   ;   Vny=(P1y-Cy)/d  
acc (accx,accy) and finally pos (posx, posy)  as described above.     

속도를 계산할 필요가 없습니다.
게임에서 어떤 종류의 마찰을 사용하면 방정식이 다를 수 있습니다.
cos (A)와 sin (A)를 여러 번 사용하므로 저장하십시오.

그래서 둘씩 연결된 많은 점을 스폰하고 동시에 초기 각도 A를 변경하여 세그먼트 소스가 우물 주위를 회전하게하면 솔루션에서 아주 가깝습니다.

편집 : 나는 당신이 마찰없이 이것을 먼저 시도해야한다고 생각합니다. 괜찮을 수도 있습니다. 마찰은 속도에 비례하지만 벡터 방향이 반대 인 힘입니다. 따라서 방정식은 다음과 같습니다.

    Acc = Gravity force + Friction Force.

마찰력 =-상수 * Vel. 이것은 통합 방법을 모르므로 단계별 통합을 수행합니다.

   Vel(t+dt) = vel(t) + acc(t)*dt,   
   pos(t+dt)= pos(t)+ vel(t)*dt.  

수치 안정성 문제가있을 것이지만, 입자의 수명이 짧기 때문에 문제가되지 않습니다.


마찰의 영향을받는 방정식에 대해 무엇이 바뀌어야합니까? 그 문제에 대한 몇 가지 해결책이 있지만 귀하의 의견을 듣고 싶습니다.
Mykel Stone

0

마지막으로 입자 거동을 만족스럽게 재현했습니다.

http://www.openprocessing.org/sketch/73624

이 효과는 입자가 특정 범위 내에있을 때 접선 법선에 힘이 가해지면 비틀기와 함께 표준 중력 효과입니다. 이로 인해 입자가 다소 불안정한 방식으로 "궤도"됩니다. 처리 스케치의 입자는 타지 않지만 궤도의 정점에서 타거나 다른 무리가 풀릴 때입니다. 도움을 주신 모든 분께 진심으로 감사드립니다. 실제로 새로운 정보를 제공하지 않았더라도 시간과 노력을 투자 해 주셔서 감사합니다. 다시 감사합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.