2012-07-01 2 views
0

나는 물리/입자 시뮬레이터에 시작하고 나는 충돌 감지 몇 가지 문제가 오전 :중력과 충격 버그

http://mmhudson.com/physics.html

임 너무 많은 코드 솔루션을 찾고 있지,하지만 누군가를 설명하기 위해 저에게 개념적으로 이슈를 제기하십시오.

작동 방식은 다음에 입자를 이동시킬 때 입자가 내부/내부에 있는지를 확인하는 것입니다. 그럴 경우 중력 승수가 반전되어 방향이 바뀝니다.

I 사용 운동 방정식은 다음

속도

희망 사람이 같은 문제를 본 중력 배율을 옆 위치 = 현재 속도 + 중력 + 현재 위치

속도 전에 또는 내 페이지의 출처를 확인하고자합니다.

전혀 도움이되지 않습니다.

답변

2

어떤 개념 설명하지만, 임의의 관측의 무리 :

나는 캔버스 너비/높이 변수를 추가하고 입자의 위치에 그들을 비교하는 것을 권 해드립니다. 지금은 입자가 캔버스에서 떨어져도 떨어지지 않습니다. 같은 뭔가 :

if(particles[i][1] > height) 
    particles.splice(i,1); 

newPY < objects[k][2] + objects[k][3] + radius 

정말 이상해. 이게 뭐야? 물체의 너비와 높이 및 입자 반경 추가하기? 이 부분을 제거하면 파티클은 "기세"가있는 한 오브젝트에서 튀어 나옵니다.


운동량에 대해서는 입자가 입자를 통과하여 떨어지는 것을 방지하는 방법을 알아 내려한다고 가정합니다. 현재 코드를 감안할 때, 저는 이것을 할 것입니다 : 파티클에 다섯 번째 변수를 추가하고 캔버스의 높이를 기본값으로 설정하십시오. 그런 다음, 영향을 미쳤다는 것을 알게되면 입자에 충격 위치를 저장하고 루프 후에 입자가 그 지점 아래에 있는지 확인하십시오. 그렇다면 그 지점으로 재설정하십시오. 더러운 수정,하지만, 이봐, 작동합니다. 아래에 완전한 루프를 추가하여 저에게 효과적이었습니다. clearRect 메소드로 객체를 지우지 않으려면 객체를 다시 그릴 수 있습니다.


당신은 객체의 상단에 입자를 확인하고 있습니다,하지만 난 가정 측면 당신이 순간 너무 너무 중요하지,에 대해 질문 버그의 일부입니다 "를 통해 떨어지는"

particles[i][1] < objects[k][1] + objects[k][3] + radius 

그러나 주위를 놀고 중력을 줄이기로 결정한 경우 입자가 대신 운동량을 얻고 위의 개체에 대해 튀어 오를 수 있습니다. 당신의 objCheck 변수로


, 당신은 마지막 & & 부분에 Y의 폭을 혼동. 그것은해야한다 :

mY < objects[i][1] + objects[i][3] + radius 

대신 지금

mY < objects[i][2] + objects[i][3] + radius 

의, 당신의 objCheck가 작동하지 않습니다.


또한

for(var i=0; i < particles.length; i++) { 
    var clrRadius = 2*radius; 
    canvas.clearRect(particles[i][0]-radius, particles[i][1]-radius, clrRadius, clrRadius); 
} 

더 이상

for(var i=0; i < particles.length; i++){ 
    var clrRadius = radius + 4; 
    canvas.clearRect(particles[i][0]-(clrRadius/2), particles[i][1]-(clrRadius/2), clrRadius, clrRadius); 
} 

편집입니다 : 내가 마지막으로 확인하기 때문에 당신이 코드를 변경 같다, 그래서 위에서 더 이상 관련이 없을 수도 있습니다!

edit2 : 추가 입자 정지 수정. 여기에 완전한 중력 루프가 있습니다 :

for(var i=0; i<particles.length; i++){ 
var clrRadius = 2*radius; 
canvas.clearRect(particles[i][0]-radius, particles[i][1]-radius, clrRadius, clrRadius); 
} 

for(var i=0; i < particles.length; i++){ 
var newPY = particles[i][1] += particles[i][2] + particles[i][3]; 

for(var k=0; k<objects.length; k++){ 
    if(
     //particle 
     particles[i][0] > objects[k][0] - radius && 
     particles[i][0] < objects[k][0] + objects[k][2] + radius && 
     particles[i][1] > objects[k][1] - radius && 
     particles[i][1] < objects[k][1] + objects[k][3] + radius //&& 
    ){ 
      //reverse gravity 
      particles[i][2] = particles[i][2] * -1; 
      particles[i][5] = objects[k][1] - radius; 
    } 
} 


particles[i][2] += particles[i][3]*weight; 
particles[i][1] += particles[i][2]; 

if(particles[i][1] > particles[i][5]) 
    particles[i][1] = particles[i][5]; 

if(particles[i][1] > height) 
    particles.splice(i,1); 
} 

for(var i=0; i <particles.length; i++){ 
canvas.fillStyle = "#000"; 
canvas.beginPath(); 
canvas.arc(particles[i][0], particles[i][1], radius, 0, Math.PI*2, true); 
canvas.closePath(); 
canvas.fill(); 
} 
0

중력 승수를 사용하지 않겠습니다.

각 객체는 다음과 같이 보일 것이다 :

var circle = { 
    x: 0, // x position 
    y: 0, // y position 
    dx: 0, // x velocity 
    dy: 0 // y velocity 
} 

약간의 시간 간격에 의해 입자, 다중 속도 (DX, DY)를 업데이트하고 현재의 위치에 이것을 추가하려면.

매주기마다 중력의 결과로 약간의 속도 변화를 추가하십시오.

충돌을 감지하면 서클이 서로 바운스되도록 속도가 변경됩니다. 이 예는 없을 것이다 :

// In a collision, simply reverse the direction of movement 
// so the circles move away from each other. 

function onCollision(circleA, circleB) { 
    circleA.dx *= -1; 
    circleA.dy *= -1; 

    circleB.dx *= -1; 
    circleB.dy *= -1; 
} 
+0

이것은 내 문제를 해결하지 못합니다. 문제는 충돌 감지 자체에 있습니다. – maxhud