Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确保圆不重叠的物理模拟-C#XNA 4.0_C#_Vector_Physics - Fatal编程技术网

确保圆不重叠的物理模拟-C#XNA 4.0

确保圆不重叠的物理模拟-C#XNA 4.0,c#,vector,physics,C#,Vector,Physics,好的,我试着在二维平面上模拟球的碰撞。我可以很容易地通过位置和半径之和的简单比较来检测碰撞,但是,有时模拟会超出自身,圆圈重叠,这会破坏模拟的其余部分 因此,我认为基本上我需要做的是找到接触点处两个圆之间的法向量,并在该方向上添加位置向量,幸运的是,我有一个类似的算法来处理碰撞引起的速度变化,因此我对其进行了调整: Vector2 normal = orgA.getCenterPosition() - orgB.getCenterPosition(); Vector2 tangent = new

好的,我试着在二维平面上模拟球的碰撞。我可以很容易地通过位置和半径之和的简单比较来检测碰撞,但是,有时模拟会超出自身,圆圈重叠,这会破坏模拟的其余部分

因此,我认为基本上我需要做的是找到接触点处两个圆之间的法向量,并在该方向上添加位置向量,幸运的是,我有一个类似的算法来处理碰撞引起的速度变化,因此我对其进行了调整:

Vector2 normal = orgA.getCenterPosition() - orgB.getCenterPosition();
Vector2 tangent = new Vector2((normal.Y * -1), normal.X);

float diff = (orgA.getRadius() + orgB.getRadius()) - normal.Length();

normal.Normalize();

float PAn = Vector2.Dot(normal, orgA.position);
float PAt = Vector2.Dot(tangent, orgA.position);

PAn += diff;

float PBn = Vector2.Dot(normal, orgB.position);
float PBt = Vector2.Dot(tangent, orgB.position);

PBn -= diff;

Vector2 PA = (PAn * normal) + (PAt * tangent);
Vector2 PB = (PBn * normal) + (PBt * tangent);

orgA.position = PA;
orgB.position = PB;
问题是,当我运行模拟时,两个球相遇,整个事情变得疯狂,它们突然遍布整个商店


有人能看到我算法中的缺陷吗?我已经查看了它的负载,但仍然找不到导致这种情况的原因。

嘿,伙计,我想你需要的是一个循环。这太疯狂了,因为一旦球碰到了,它们就会不断地用新的逻辑升级

我对此并不惊讶,但是试着把碰撞放在一个循环中。。。应该是这样的:

if ( diff < (orb radius))
{
Vector2 PA = (PAn * normal) + (PAt * tangent);
Vector2 PB = (PBn * normal) + (PBt * tangent);

orgA.position = PA;
orgB.position = PB;
}
if(差值<(球体半径))
{
向量2 PA=(平移*法线)+(平移*切线);
向量2 PB=(PBn*法线)+(PBt*切线);
orgA.position=PA;
orgB.position=PB;
}
像这样的事。。。我真的希望这有点帮助:/

据我所知,这是在你的更新方法,所以请记住更新运行不断每毫秒。。。所以,当你得到球体和大小之间的差异时,这很好,但是在它们碰撞之后,你希望它们以某种方式移动,你一遍又一遍地计算相同的方程

更好的做法是制作一个bool,比如isCollided,并确保根据该声明切换为true/false


希望它能帮助我有一个碰撞的例子项目如果你想我可以发送给你,samerhachem@hotmail.com嘿,伙计,我想你需要的是一个循环。这太疯狂了,因为一旦球碰到了,它们就会不断地用新的逻辑升级

我对此并不惊讶,但是试着把碰撞放在一个循环中。。。应该是这样的:

if ( diff < (orb radius))
{
Vector2 PA = (PAn * normal) + (PAt * tangent);
Vector2 PB = (PBn * normal) + (PBt * tangent);

orgA.position = PA;
orgB.position = PB;
}
if(差值<(球体半径))
{
向量2 PA=(平移*法线)+(平移*切线);
向量2 PB=(PBn*法线)+(PBt*切线);
orgA.position=PA;
orgB.position=PB;
}
像这样的事。。。我真的希望这有点帮助:/

据我所知,这是在你的更新方法,所以请记住更新运行不断每毫秒。。。所以,当你得到球体和大小之间的差异时,这很好,但是在它们碰撞之后,你希望它们以某种方式移动,你一遍又一遍地计算相同的方程

更好的做法是制作一个bool,比如isCollided,并确保根据该声明切换为true/false


希望它能帮助我有一个碰撞的例子项目如果你想我可以发送给你,samerhachem@hotmail.com

您的算法想要实现什么?我没有完全明白目的,因此不明白“整个事情都疯了”到底是什么意思。你发现了当球接触时的差值为0,当球重叠时的差值为负数,那是什么呢?这是物理模拟中一个非常常见的问题。如果你的时间步长足够大(或者你的物体移动得足够快),你会发现你的碰撞太晚(或者根本检测不到)。这意味着您简单的碰撞响应逻辑几乎肯定是错误的。它工作的唯一情况是当你的物体在时间步偶然接触时。这种情况的症状包括:隧道挖掘(物体相互错过)、物体相互粘着、物体接触时反应剧烈。你想用你的算法实现什么?我没有完全明白目的,因此不明白“整个事情都疯了”到底是什么意思。你发现了当球接触时的差值为0,当球重叠时的差值为负数,那是什么呢?这是物理模拟中一个非常常见的问题。如果你的时间步长足够大(或者你的物体移动得足够快),你会发现你的碰撞太晚(或者根本检测不到)。这意味着您简单的碰撞响应逻辑几乎肯定是错误的。它工作的唯一情况是当你的物体在时间步偶然接触时。这种情况的症状包括:隧道挖掘(物体相互脱靶)、物体相互粘着、物体接触后反应剧烈。