Questions tagged «collision-resolution»

碰撞后调整游戏对象位置的过程。

6
快速移动物体的六角形碰撞检测?
对象具有位置和速度矢量。通常仅使用该位置来检查两个物体是否发生碰撞,这对于移动速度非常快的物体是有问题的,因为可能发生物体移动得如此之快,以至于在第一次碰撞检查中它位于第一个物体的前面,而在第二个碰撞检查中位于它的后面第二次碰撞检查。 现在,还有基于行的碰撞检查,其中您仅检查每个对象的运动矢量是否与另一个对象的边界框相交。这可以看作是一点的扩展。这仅在快速移动的物体很小的情况下才有效。 所以我的想法是,为什么不扩展矩形而不是扩展点?这将产生一个六边形。 现在,到目前为止一切顺利。但是我实际上如何检查两个这种六角形是否相交?请注意,这些是非常特殊的六角形。 奖励问题:是否可以计算出碰撞发生的确切位置(或确切地说,经过多少时间)?这对于检测实际发生的情况(例如在何处以及具有多少功率)以及模拟它们在碰撞到帧结束之间的时间中如何移动非常有用。

3
团队如何防止覆盖源文件中的工作?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为Game Development Stack Exchange 的主题。 4年前关闭。 在我看来,有一种可能性,例如由多个人同时处理游戏引擎时,如何防止覆盖? 假设开发者一在工作,Audio.cpp而开发者二也在工作Audio.cpp,这在大型团队中通常如何进行管理以应对覆盖?(换句话说,要阻止开发人员2打开文件,直到开发人员1完成)
26 project-management  version-control  teamwork  java  2d  collision-detection  vector  collision-resolution  unity  directx  directx11  directx10  xna  ios  monogame  windows-phone-8  xamarin  design-patterns  oop  xna  collision-detection  collision-resolution  bounding-boxes  rotation  collision-detection  mathematics  javascript  algorithm  separating-axis-theorem  xna  2d  monogame  image  xna  directx  graphics  performance  opengl  2d  3d  c++  directx11  unity  c#  scale  c#  xna  collision-detection  collision-resolution  leaderboards  scoring  glsl  srgb  tilemap  three.js  tiled  unity  physics  xml  dialog-tree  xna  c#  .net  opengl  lwjgl  vbo  physics  graphics  procedural-generation  simulations  water  opengl  java  textures  lwjgl  frame-buffer  unity  unity  2d  collision-detection  collision-resolution  trigonometry  java  android  libgdx  xna  c#  frame-rate  c++  unreal-4  procedural-generation  java  graphics  lwjgl  slick  c++  software-engineering 

4
如何处理2D中的角碰撞?
我正在写一个自上而下的2D XNA游戏。自从我第一次上学以来,我一直在尝试自己编写物理学和碰撞学知识。 每当我的玩家精灵角色试图移动到其边界与墙的边缘相交的位置时,我都会计算出反弹角(入射角=反射角),并让玩家反弹出墙并避免碰撞。 我很难弄清楚如何处理我的精灵同时与两个墙边相交的情况,尽管它碰到了一个角落。 我的代码当前告诉我,两个墙的边缘已经相交,但是没有碰到哪个边缘,因此没有反弹。 选择哪个边缘反弹的数学测试是什么?看到它的时候很简单,但是我正在努力寻找它的数学测试。

7
如何检测2D平台游戏中被压扁的玩家?
我正在检查碰撞中是否有平台角色,如#1所示。红点是被检查的像素,灰线指示它们所属的轴。我喜欢以这种方式检查碰撞(相对于边界框)得到的结果。除了一个问题:挤压检测,其他所有功能都按我的意愿运行。 在以下图像中,浅蓝色框表示地面,橙色框表示对象,箭头表示移动方向。 检测玩家何时被压倒的简单解决方案是查看相对两侧的碰撞点是否都在触发。如果是这样,则说明玩家被压碎了。在#2中,您可以看到正常的暗恋场景。播放器已接地,顶部碰撞点与下落的物体相交。这触发了暗恋。 #3、4和5存在有问题的场景。在#3中,玩家正在朝向上移动的物体移动。右侧碰撞点撞击物体,导致碰撞并使玩家停止。 现在,如果对象继续向上移动并且玩家继续向右移动(如#4所示),则该对象清除玩家右侧碰撞点,然后玩家向右移动。但是现在,这样做的目的是使对象与顶部碰撞点相交,从而导致不必要的垂直挤压。 #5中显示了类似的情况。两个物体相距足够远,可以清除底部碰撞点,从而允许玩家跌倒,但不能超过允许侧面碰撞点清除的程度,从而导致不必要的水平挤压。 我一直在努力寻找解决方案,但是我提出的任何方案都没有特别有效,所以我想知道是否有人对解决这些问题有想法或见识。 为了消除一些混淆,红色碰撞点将位于精灵内,而灰线仅用于表示每个碰撞点的相关轴。例如,如果角色的精灵是一个简单的绿色方块,则拐点将如下所示:

3
与多个物体碰撞时的碰撞解决
我有静态对象和可移动对象。使用分离轴定理检测碰撞。 例如,在这种情况下,我有两个静态对象(红色): 以及介于两者之间的可移动对象: 我的算法能够计算出其中两个对象之间的碰撞,并且还为碰撞生成了一个完美的分辨率矢量(意味着最小位移矢量)。 因此,例如,当我检查绿色矩形和右红色矩形之间的碰撞时,该算法会吐出一个向量,该向量告诉我如何移动绿色矩形才能解决该碰撞: 请注意,我只是在MSPaint中快速绘制了此图像,因此在该图片中,实际上可能是最小平移矢量将绿色矩形推到顶部,但是在这里我将假定将其推到左侧/权利实际上更短。 解决此问题的一般方法是仅解决每帧一个冲突的冲突,而不是一次解决所有冲突。但就我而言,这将导致触发器: 首先,求解器检测到两个冲突,但仅解决右矩形和绿色矩形之间的冲突: 然后,在下一帧中,它仅检测到左红色矩形和绿色矩形之间的一个碰撞,并解决该碰撞: 如您所见,这实际上并不能解决冲突(例如,通过将绿色矩形推到顶部),而只是在两个状态之间无限地触发器。 我该如何解决?

4
如何计算由反弹摩擦引起的旋转?
接下来是我的上一个问题:我很实际地将球从击中的表面弹起。现在我想使它从打击的摩擦中旋转。 演示起来很简单:我在每个刻度上以球的角速度旋转球,并在渲染时应用相同的旋转。 当球撞到墙壁时,我知道旋转速度受... 击球时球的初始速度 球与表面的摩擦系数(物理常数) 的入射角(球的进向速度矢量与表面法线之间的角度)。 入射角由球的撞击速度和出口速度向量的点积近似得出。(1表示高自旋,-1表示无自旋,其他所有相对而言) 将以上所有内容相乘,并确保将它们转换为0-1,然后乘以最大旋转速度,球似乎在旋转速度方面达到了预期。除了一件事:它总是沿顺时针方向旋转(因为正值)。 这是个好方法吗?您能想到一个更简单的方法吗? 如果此方法看起来不错,我会缺少什么?我怎么知道什么时候球应该逆时针旋转?

3
解决力量冲突
在我的2D物理引擎中,我可以检测到AABB与AABB碰撞,并通过找到最短的穿透矢量并将其添加到AABB的位置来解决它们。 这样做可以将“第一” AABB“推”到第二AABB之外,但根本不处理速度/加速度变化。 如果我在仿真中添加重力加速度,则即使第一动态ABB停在第二静态ABB的顶部,它的速度也会保持增长。最终,速度将变得太大而无法检测到碰撞(动态AABB将落入静态ABB)。 我尝试将分辨率后的速度设置为零,但显然效果不佳,并创建了不切实际的模拟。 我在线阅读了通过手动处理位置或速度不正确来解决冲突的信息。我尝试过实施力量(目前,质量是“硬编码” 1): void Body::applyForce(sf::Vector2f mForce) { acceleration += mForce; } void Body::integrate(float mFrameTime) { velocity += acceleration * mFrameTime; position += velocity * mFrameTime; acceleration = {0, 0}; } 如果我在冲突解决期间将最短的穿透向量用作力,则动态AABB将从静态AABB中“弹出”,但在没有重力的情况下其速度永远不会降低,并且将永远移动。 有没有办法施加“临时”力量?一种将第一个ABB推出第二个ABB的力,然后在该AABB不再碰撞时停止作用? 完整的源代码在这里:https : //github.com/SuperV1234/SSVSCollision

2
在MMO的服务器端存储每个对象的坐标
在MMORPG中: 将每棵树,灌木丛等的坐标存储在服务器端以进行碰撞检测是典型的还是可行的? 如果是这样,什么是存储如此大量坐标(数据结构等性能问题处理)的可行方法? 如果不是,这种冲突检测是否完全在客户端完成,而服务器根本不检查? 还是有中间立场,由客户端检查冲突并由服务器验证?如果是这样,服务器又如何在不将坐标保存在服务器中的情况下进行验证?

4
使玩家平稳地上楼梯
我有一个2D平台游戏,其中玩家始终向右行驶,但是地形并不总是水平的。例: 我实现了一个边界框碰撞系统,该系统仅检查与玩家框和其他方块的交点,以防止遇到大方块时玩家无法奔跑,因此必须跳下去,但是当我上楼梯时,我希望他就像他在水平地面上一样平稳运行。使用碰撞系统,您必须跳楼梯才能通过! 我考虑过要在楼梯的边缘之间生成一条线,并在那条线上强加玩家移动……您如何看待?还有更聪明的事情吗?

2
Microsoft XNA Platformer示例,是否正确实施了碰撞检测?
Microsoft提供的示例似乎(从我所看到的)碰撞检测将有一个小错误。当用户与不可通过的图块碰撞时,将计算相交的深度。深度值X和Y中较小的一个用于固定用户的位置,因此它不再与图块碰撞。但是,如果用户沿对角线行驶,这是否可能导致用户无法准确地到达角色首先与图块发生碰撞的位置? 我可能是错的,但这只是我的看法。 private void HandleCollisions() { // Get the player's bounding rectangle and find neighboring tiles. Rectangle bounds = BoundingRectangle; int leftTile = (int)Math.Floor((float)bounds.Left / Tile.Width); int rightTile = (int)Math.Ceiling(((float)bounds.Right / Tile.Width)) - 1; int topTile = (int)Math.Floor((float)bounds.Top / Tile.Height); int bottomTile = (int)Math.Ceiling(((float)bounds.Bottom / Tile.Height)) - 1; // Reset …


4
碰撞矩形响应
我很难让一个可移动的矩形与多个矩形碰撞。 我正在使用SFML,它有一个方便的函数intersects,它需要2个矩形并返回交集。我有一个充满矩形的向量,我希望我的可移动矩形发生碰撞。我使用以下代码(p是可移动矩形)遍历此代码。 IsCollidingWith返回布尔值,但也使用SFML intersects来计算交叉点。 while(unsigned i = 0; i!= testRects.size(); i++){ if(p.IsCollidingWith(testRects[i]){ p.Collide(testRects[i]); } } 和实际的Collide()代码: void gameObj::collide( gameObj collidingObject ){ printf("%f %f\n", this->colliderResult.width, this->colliderResult.height); if (this->colliderResult.width < this->colliderResult.height) { // collided on X if (this->getCollider().left < collidingObject.getCollider().left ) { this->move( -this->colliderResult.width , 0); }else { this->move( this->colliderResult.width, 0 ); …

3
在关键时刻与人群打交道的策略
最近,我已将游戏引擎从转向行为切换为具有适当时间冲突解决方案的基于冲动的运动。这解决了很多问题(不再需要隧道化,是的),并使模拟更加稳定。但是,稳定性带来了新问题。 这三个球开始在图像底部附近的旅程,他们的目标是粉红球停下来的地方。在途中,红色和绿色的球卡在了墙的阻塞点。 在此之前,我可以依靠浮点错误和操纵行为的一般不稳定来使绿色和红色的球相互碰撞,直到它们成功通过了阻塞点。现在具有适当的碰撞分辨率,作用在球上的力会相互抵消,从而使球保持完全静止。 通常使用哪些方法来解决这种情况?某种优先级排队系统可能会起作用,尽管一旦我需要在两个以上的对象之间确定优先级,我就会发现它变得很复杂。

1
gluLookAt如何工作?
据我了解, gluLookAt( eye_x, eye_y, eye_z, center_x, center_y, center_z, up_x, up_y, up_z ); 等效于: glRotatef(B, 0.0, 0.0, 1.0); glRotatef(A, wx, wy, wz); glTranslatef(-eye_x, -eye_y, -eye_z); 但是当我打印出ModelView矩阵时,对的调用glTranslatef()似乎无法正常工作。这是代码片段: #include <stdlib.h> #include <stdio.h> #include <GL/glut.h> #include <iomanip> #include <iostream> #include <string> using namespace std; static const int Rx = 0; static const int Ry …

2
如何解决两个碰撞体的渗透
我已经实现了简单的3D游戏物理引擎。我已经有适当的碰撞检测功能,现在我正在尝试找出碰撞响应部分。我正在使用基于脉冲的方法来计算碰撞后的速度。这工作得很好,但是并不能完全阻止物体相互渗透。因此,我还有其他代码来解决渗透问题。目前,我只是沿着接触法线将实体移动了穿透深度的一半-第一个实体沿接触法线的方向移动,第二个实体沿相反的方向移动。 在大多数情况下都可以,但是有一些不良影响。例如,想象一个狭窄的走廊和一个物体在其中移动。如果对象撞到走廊的一堵墙,则穿透分辨率会将其移到相对的墙,然后在下一帧中移回第一堵墙,依此类推。效果是物体在墙壁之间确实非常快地振动,这不是很漂亮。 所以我的问题是,是否有更好的方法来解决渗透问题?也许不移动物体,只是以某种方式调整它们的速度(除了脉冲计算),以使它们停止彼此相对移动,并且穿透力在接下来的两帧中自行解决。我只是在猜。有任何想法吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.