2017-05-09 4 views
1

나는 임의의 포인트와 Delaunay 삼각 측량을 사용하여 삼각형을 생성하는 다음 메쉬를 가지고 있습니다. 그런 다음 각 정점에 삼각형 당 스프링 힘을 적용합니다. 그러나 어떤 이유로 평형은 항상 왼쪽으로 이동합니다. https://youtu.be/gb5aj05zkIc스프링 물리학 평형 항상 왼쪽으로 이동

왜 이런 일이 : 여기

은 행동의 비디오인가? 여기

은 물리학에 대한 코드입니다 :

for (let i=0; i < mesh.geometry.faces.length; i++) { 

    let face = mesh.geometry.faces[i]; 

    let a = mesh.geometry.vertices[face.a]; 
    let b = mesh.geometry.vertices[face.b]; 
    let c = mesh.geometry.vertices[face.c]; 

    let p1 = Vertcies[face.a]; 
    let p2 = Vertcies[face.b]; 
    let p3 = Vertcies[face.c]; 

    update_force_points(p1, p2, a, b); 
    update_force_points(p1, p3, a, c); 
    update_force_points(p2, p3, b, c); 
    } 

function update_force_points(p1, p2, p1p, p2p) { 

    // get all the verticies 
    var dx = (p1.x - p2.x); 
    var dy = (p1.y - p2.y); 

    var len = Math.sqrt(dx*dx + dy*dy); 
    let fx = (ks * (len - r) * (dx/len)) + ((kd * p2.vx - p1.vx)); 
    let fy = (ks * (len - r) * (dy/len)) + ((kd * p2.vy - p1.vy)); 

    if (! p1.fixed) { 
    p1.fx = (ks * (len - r) * (dx/len)) + ((kd * p2.vx - p1.vx)); 
    p1.fy = (ks * (len - r) * (dy/len)) + ((kd * p2.vy - p1.vy)); 
    } 
    if (! p2.fixed) { 
    p2.fx = -1 * p1.fx; 
    p2.fy = -1 * p1.fy; 
    } 

    p1.vx += p1.fx/mass; 
    p1.vy += p1.fy/mass; 

    p2.vx += p2.fx/mass; 
    p2.vy += p2.fy/mass; 

    p1.x += p1.vx; 
    p1.y += p1.vy; 
    p2.x += p2.vx; 
    p2.y += p2.vy; 

    p1p.x = p1.x; 
    p1p.y = p1.y; 
    p2p.x = p2.x; 
    p2p.y = p2.y; 

    p2p.z = 0.0; 
    p1p.z = 0.0; 
} 
+0

당신은 KS 및 KD를 정의 할 수 있습니다? 고정 된 점은 어디에 정의되어 있습니까? 모든 정점에 대해 질량이 고정되어 있습니까? 버텍스 포지션을 랜덤 화하면 같은 결과가 나타 납니까? (왼쪽 아래로 모두 표류합니까?) 그렇지 않다면 이상하지 않습니다. 밀접하게 간격을 둔 세그먼트는 고정 된 양 (r)을 빼기 때문에 다른 세그먼트보다 더 강하게 수축하므로 거기에는 더 많은 힘이 있습니다. 비대칭 성이 있어야합니다. – OtterFamily

답변

2

당신이 속도 계산을 수행하고 동시에 새로운 위치를 지정하고있는 순간에, 그래서 균형은 순서에 따라 변경됩니다 것을 통해주기 point in. 왼쪽 하단의 점은 꼭지점 목록의 시작 부분이나 끝 부분에 있다고 추측 할 수 있습니다.

모든 페이지 번호는 계산이 선형, 다음

당신의 스냅 샷을 기반으로 모든 필요한 속도를 계산하는 방법 .vx 그냥 페이지 번호 .x를 + = P는 #을 두 번째 패스를 할 .vx하고 시도 포인트가 이전 프레임이었던 경우, 모든 포인트가 새로운 속도를 가진 후에 위치를 업데이트합니다.

그렇게 :

for(var i = 0; i < #; i++){ 
    updateforces(bla,bla,bla) //don't assign position in here, just add forces to the velocity 
} 

for(var i =0; i < #; i++){ 
    updateposition(bla,bla,bla) 
} 
+0

의견을 보내 주시면 아이디어를 얻으 실 수 있습니다. update_force_points에 대한 호출은 동등한 방식으로 병력을 업데이트하지 않았습니다. 나는 서로에 작용하는 힘이 삼각형 모양이되도록 p1, p2, p2, p3, 그리고 마지막으로 p3, p1로 업데이트했습니다. – ArmenB

+0

오, 나는 또한 당신이 한 일이 더 큰 문제에 대한 수정 일 뿐이라는 것을 깨달았습니다. -'''p1p.x = p1.x; p1p.y = p1.y; p2p.x = p2.x; p2p.y = p2.y; ''' 이 줄은 꼭지점 데이터를 덮어 쓰며, 수정하지 않습니다. 이는 호출 된 마지막 함수가 꼭지점 데이터를 설정한다는 것을 의미합니다. 따라서 해당 꼭지점 데이터 점을 포함하는 이전의 모든 함수가 마지막으로 호출 된 함수에 의해 덮어 쓰여집니다. 즉, 원래 코드에서 :'''update_force_points (p2, p3, b, c);'''''a''를 제외하고 정점에서 수행 된 모든 이전 작업을 덮어 씁니다 .''' 그래서 적어도 이제는 특정 더 큰 문제에 대한 픽스 일뿐입니다. – OtterFamily

+0

모델 (p1, p2 등)이 고정되면 버텍스 할당 (a = #, b = # 등)을 수행해야하며, 모델을 수정하려면 별도의 강제 할당 및 위치 할당. 그래서 당신이 필요합니다 : '''calculateforces(); calculatemodelPositions(); assignVertexpositions();'''을 별도의 단계로 사용합니다. – OtterFamily