2016-07-04 4 views
0

간단한 입자 시뮬레이션을 만들려고합니다. 정적 및 이동의 두 가지 유형의 입자가 있습니다. 정적 입자는 움직이는 입자를 중심으로 끌어 당깁니다. 정적 입자들이 이동하는 입자를 당기는 방법 하드입자가 오버 슛하는 것을 막을 수 없습니다.

var angle:Number = Math.atan2(moving.y - static.y , moving.x - static.x); 
var dist = Point.distance(new Point(moving.x,moving.y) , new Point(static.x,static.y)); 

moving.velX += Math.cos(angle + Math.PI) * static.strength/dist; 
moving.velY += Math.sin(angle + Math.PI) * static.strength/dist; 

문제는 입자 단지 중심을 통과 할 때의 거리가 매우 작이다 지시 강도 특성을 갖도록 매우 큰 속도 값을 초래한다.

속도를 계산하기 전에 거리에 대한 추가 검사를 추가했습니다.

if (dist < 1) 
    dist = 1; 

그러나 문제는 여전히 지속됩니다. 나는 문제를 파악할 수 없다.

다음은 오버 슛이 발생하고 있음을 보여주는 스냅 샷입니다.

enter image description here

답변

1

정상 포스 필드는 수정 같은 거리의 제곱을 사용하여, 당신은 여기에 거리의 단일 전원을 사용, 물론 힘 필드는 다르게 수행한다. 다음에 var dist 줄을 변경해야합니다

var dist:Number = (moving.x-static.x)*(moving.x-static.x) + (moving.y-static.y)*(moving.y-static.y); 

이 방법 dist 그렇게 dist로 나누어 것은 당신에게 적절한 역장 구성을 줄 것이다, 실제 거리의 제곱을 개최한다.

그리고 AS3에서 예약어이므로 static의 이름을 변경하십시오.

+0

원본 코드에서 변수 이름으로 '정적'을 사용하지 않았습니다. –

+0

@SayamQazi, 코드를 확인하면'static.x' 및'static.y'가 있습니다. 그것을'force'라고 부르거나'atttractor' 또는 변수가 아닌 클래스 나 예약어와 같은 색으로 변경되는 클래스 이름으로 부르십시오. –

+0

예 알아요. 나는 원래 코드에 대해 이야기하고 있었다. 나는 여기에 원래 코드를 붙여 넣지 않았다. –

2

dist 계산을 실행하기 전에 또는 vel 계산을 실행 한 후에는 아마도 dist 값을 선언하고있을 것입니다. 대신 계산중인 012 수표가 dist 계산과 vel 계산 사이에 있는지 확인하십시오. Vesper는 올바른 힘 효과를 얻으려면 거리의 제곱을 사용해야합니다. 그러나 그렇게해도 여전히 바람직하지는 않지만 (결과는 완전히 정확하지만 수학적으로) 결과를 얻을 수 있습니다.

var angle:Number = Math.atan2(moving.y - static.y , moving.x - static.x); 
var dist = Point.distance(new Point(moving.x,moving.y) , new Point(static.x,static.y)); 

if (dist < 1) dist = 1; // just make sure your constraint goes here. 

moving.velX += Math.cos(angle + Math.PI) * static.strength/dist/dist; // this uses dist squared 
moving.velY += Math.sin(angle + Math.PI) * static.strength/dist/dist; // but don't use this method in addition to Vesper's or you'll have dist to the power of 4. 
+0

예 거리 계산과 속도 부분 업데이트 사이에 거리 확인이 있습니다. 당신은 여전히 ​​원하지 않는 결과를 얻을 수 있다고 말하고 있습니다. 그래서 제게 해결책을 제안 해주십시오. –

+0

분명히 베스퍼가 문제를 해결했습니다. 너는 내 조언을 무시할 수있다. 아니면 그의 해결책이 효과가 없었습니까? –