gpt4 book ai didi

java - 我的刚体碰撞代码如何不一致?

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

我一直在尝试复制在此处找到的系统:http://www.myphysicslab.com/collision.html

到目前为止,这是我的代码(针对撞击无限大物体的情况,如不可移动的墙):

public static Orientation collide( float bodyMass_1, float bodyVelocityX_1, float bodyVelocityY_1, float bodyAngleMomentum_1 , float pointXFromCenterX_1, 
float pointYFromCenterY_1, float momentOfInertia_1,
float edgeNormalX, float edgeNormalY, float elasticity )
{
Orientation returning;

float outAngleMomentum_1;

float outVelocityX_1, outVelocityY_1;

float relativeNormal;
float deltaParameter;

float pointVelocityX_1, pointVelocityY_1;

pointVelocityX_1 = bodyVelocityX_1 - bodyAngleMomentum_1 * pointYFromCenterY_1;
pointVelocityY_1 = bodyVelocityY_1 + bodyAngleMomentum_1 * pointXFromCenterX_1;


System.out.println( edgeNormalX );
System.out.println( edgeNormalY );

relativeNormal = (float) Funct3D.dotProduct( pointVelocityX_1, pointVelocityY_1,edgeNormalX, edgeNormalY );


if ( relativeNormal < 0 )
{

deltaParameter = (-(1 + elasticity) *( (float) Funct3D.dotProduct( pointVelocityX_1, pointVelocityY_1, edgeNormalX, edgeNormalY ) ))/
( 1/bodyMass_1 + Funct3D.sqr( (float) Funct3D.perpDotProduct(pointXFromCenterX_1,pointYFromCenterY_1,edgeNormalX,edgeNormalY)) / momentOfInertia_1 );

outVelocityX_1 = bodyVelocityX_1 + deltaParameter * edgeNormalX / bodyMass_1;
outVelocityY_1 = bodyVelocityY_1 + deltaParameter * edgeNormalY / bodyMass_1;

outAngleMomentum_1 = bodyAngleMomentum_1 + (float) Funct3D.perpDotProduct(pointXFromCenterX_1, pointYFromCenterY_1, deltaParameter*edgeNormalX, deltaParameter*edgeNormalY ) / momentOfInertia_1;

returning = new Orientation( outVelocityX_1, outVelocityY_1, outAngleMomentum_1 );
}
else
{
System.out.println( "NO COLLISION" );
returning = new Orientation( bodyVelocityX_1, bodyVelocityY_1, bodyAngleMomentum_1 );
}
return returning;
}

我的代码的结果通常导致速度没有通过法线反射(reflect)出来,或者只是完全缺乏动量守恒。即使我有它只是让它在执行后立即输出结果,结果表明这不是多次注册碰撞的问题,它在第一次运行时也会发生。

dotProduct 返回两个 vector 的点积。

perpDotProduct 返回两个 vector 的 perp 点积

如果您需要任何解释,或者如果您想请求扩大代码范围,请随时提出。

最佳答案

对于这种任务,我建议编写一个简单的测试,将输入参数传递给 collide 方法并期望 Orientation 具有已知有效的值.

您可以使用 JUnit 框架或简单的 main 方法:

Orientation orientation = collide(a, b, c, d, ...);
assertEquals(KNOWN_X, orientation.getX());
assertEquals(KNOWN_Y, orientation.getX());
assertEquals(KNOWN_MOMENTUM, orientation.getMomentum());

使用此代码,您可以调试您的方法并检查算法的每个步骤中的值是否正确。然后您可以使用一组新的已知输入和输出值检查算法。

同时考虑清理您的代码并将重复计算移至局部变量(即 deltaParameter * edgeNormalX)

关于java - 我的刚体碰撞代码如何不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13690891/

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