gpt4 book ai didi

java - 角度约束不适用于某些角度

转载 作者:行者123 更新时间:2023-11-30 10:59:09 35 4
gpt4 key购买 nike

我正在为我的 2d 物理引擎编写角度关节。它有效,除非最大角度为负且最小角度为正(当角度直接向左时)。

如您所见,所有其他球都在其公差角度内移动,但直接位于左侧的球却没有。

6 angle joints connected to the center

public class AngleJoint extends Joint {

private float minAngle;
private float maxAngle;

public AngleJoint(
final GameEntity a,
final GameEntity b,
final float midAngle,
final float tolerance
) {
super(a, b);
assert tolerance >= 0;
minAngle = midAngle - tolerance;
maxAngle = midAngle + tolerance;

while (minAngle > Math.PI) {
minAngle -= 2 * Math.PI;
}
while (minAngle < -Math.PI) {
minAngle += 2 * Math.PI;
}
while (maxAngle > Math.PI) {
maxAngle -= 2 * Math.PI;
}
while (maxAngle < -Math.PI) {
maxAngle += 2 * Math.PI;
}
System.out.println(minAngle + ", " + maxAngle);
}

@Override
public void update() {
assert getA() != null && getB() != null;

final CManifold m = new CManifold();
m.a = getA();
m.b = getB();

final Vec2D aToB = getB().center().minus(getA().center());
// angle from A to B
final float angle = aToB.getTheta();

if (angle >= minAngle && angle <= maxAngle) {
// we don't need to do anything
return;
}

final float distBtoA = aToB.length();

final float closestAngleBound
= Math.abs(angle - maxAngle) < Math.abs(angle - minAngle)
? maxAngle : minAngle;

// where we should be
final Vec2D solvedLocation
= getA().center().plus(
new Vec2D((float) (
Math.cos(closestAngleBound) * distBtoA),
(float) (Math.sin(closestAngleBound) * distBtoA)
)
);
final Vec2D correction = solvedLocation.minus(getB().center());
final float d = correction.length();

m.setNormal(correction.divide(d));
m.setPenetration(d);
Collisions.fixCollision(m, false);
}

}

这是我创建这个特定场景的地方。

final Vec2D centerV = new Vec2D(500, 700);

center = createBall(centerV, 75);
center.setMass(GameEntity.INFINITE_MASS);
entities.add(center);

final float vertices = 6;
final float dist = 120;

GameEntity first = null;
GameEntity last = null;
for (int i = 0; i < vertices; i++) {
final float angle = (float) (2 * Math.PI / vertices * i);
final Vec2D newCenter
= new Vec2D(
(float) (centerV.x + Math.cos(angle) * dist),
(float) (centerV.y + Math.sin(angle) * dist)
);
final GameEntity vertex = createBall(newCenter, 10);
entities.add(vertex);
if (last != null) {
// constraints.add(new DistanceJoint(last, vertex));
} else {
first = vertex;
}
constraints.add(new DistanceJoint(center, vertex));
constraints.add(new AngleJoint(center, vertex, angle, .1f));
last = vertex;
if (i == vertices - 1 && first != null) {
// constraints.add(new DistanceJoint(first, vertex));
}
}
}

如何修改我的更新方法,使左边的球与其他球的行为相似?

最佳答案

这部分代码:

    if (angle >= minAngle && angle <= maxAngle) {
// we don't need to do anything
return;
}

永远不会导致相关角度的返回;由于 maxAngle 为负且 minAngle 为正,因此角度永远不会既大于正 minAngle 又小于负 maxAngle。

因此,即使角度介于两个限制之间,此关节的执行也会落到看起来角度被迫朝向最近限制的部分。由于它被强制到最接近的限制,因此它不能在限制之间自由弹跳。

对于 maxAngle 为负而 minAngle 为正的情况,您需要一些特殊情况代码来替换上面引用的测试。您可能还需要修复其他问题,但这只是一个开始。

关于java - 角度约束不适用于某些角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32000951/

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