gpt4 book ai didi

javascript - Spring 物理平衡总是向左移动

转载 作者:行者123 更新时间:2023-11-30 15:20:05 25 4
gpt4 key购买 nike

我有以下网格,它由随机点生成并使用 Delaunay 三 Angular 剖分创建三 Angular 形。然后我在每个三 Angular 形的每个顶点上应用 Spring 力。但出于某种原因,平衡总是向左移动。

这是一个行为视频: 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;
}

最佳答案

此时您正在计算速度并同时分配新位置,因此平衡将根据您在点中循环的顺序而变化。我猜想左下角的点要么在顶点列表的开头,或末尾。

尝试线性地进行所有 p#.vx 计算,然后进行第二次 p#.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)
}

关于javascript - Spring 物理平衡总是向左移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43863377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com