我想学习如何在游戏开发中为两个对象之间的碰撞创建良好的面向对象(OO)设计实践.
假设我有一个SpaceShip类和一个Meteor类.当Meteor与SpaceShip发生碰撞时,SpaceShip将被摧毁.
问题是:我应该用哪种方法来检查流星和宇宙飞船之间是否存在碰撞以及碰撞解决方法(摧毁宇宙飞船)?是在SpaceShip类还是Meteor类?或者也许我应该放在另一个班级,即.GameArea或GameController类?
注意:为简单起见,假设Meteor和SpaceShip是图像资源的形式.我习惯使用Java语言,但其他语言也可以.
我想知道处理大量移动物体(球体,三角形,盒子,点等)的最佳数据结构是什么?我正在尝试回答两个问题,即最近邻和Collsion检测.
我确实意识到传统上,像R树这样的数据结构用于最近邻居查询,而Oct/Kd/BSP用于处理静态对象或极少数移动对象的碰撞检测问题.
我只是希望那里有更好的东西.
我感谢所有的帮助.
geometry collision-detection spatial neighbours data-structures
我的问题很简单.我有两个四面体,每个四面体都有一个当前位置,一个空间线速度,一个角速度和一个质心(实际上是旋转中心).
有了这些数据,我试图找到一个(快速)算法,它将精确地确定(1)它们是否会在某个时间点发生碰撞,如果是这种情况,(2)在它们碰撞了多长时间之后(3) )碰撞点.
大多数人会通过三角形 - 三角形碰撞检测来解决这个问题,但这会浪费一些冗余操作的CPU周期,例如在检查不同的三角形时检查一个四面体的相同边缘与另一个四面体的相同边缘.这只意味着我会稍微优化一下.没什么好担心的.
问题是我不知道任何公共CCD(连续碰撞检测)三角形 - 三角形算法,它考虑了自转.
因此,我需要一个输入以下数据的算法:
并输出以下内容:
在此先感谢您的帮助.
长时间听众,第一次来电.我正在XNA做一个小爱好游戏,它关于太空中的运输船,类似于海上的集装箱船.我需要能够在受限制的2D环境中预测船舶与行星/卫星重力影响范围之间的相遇.船舶和行星/月球身体的位置,简称身体,是由开普勒轨道元素决定的.船体和船体都在同一个吸引中心轨道运行.
我到目前为止设计的方法是首先对apoapsis和periapsis(距离吸引中心最远和最近的点)做一些初步检查,看看是否有可能遇到.在诸如此类的检查之间以及如果船舶的轨道是开放的(双曲线,我将抛物线情形近似为双曲线),它可以排除许多无法遇到的情况.
如果这些检查确定可能遇到相遇,我确定该船舶有资格进行遭遇的距离中心的最小和最大距离.然后我得到船舶轨道的交点与由该最小值和最大值定义的两个圆圈.这导致船舶轨道上的零点,两点或四点,定义零点,一点或两点,它可能遇到车身的球体.此时,如果交叉点为零,则整个船舶轨道可能位于遭遇区域,这可能是一种不常见的极端情况,但需要进行覆盖.
我可以得到船舶在其轨道上通过这些点的时间,给出一个或两个窗口的时间来检查遭遇,但从那里我最好的解决方案是通过将其分成步骤来搜索时间跨度,计算身体在那些时候,然后测试遭遇.
这种方法的问题在于知道大小以便有效地找到遭遇的步骤.及时获取Body的位置有点贵,所以我宁愿尽可能少地做,但步数太大可能会错过相遇.
是否有共焦圆锥形状的特性可以帮助减少搜索空间?或者是否有其他方法来预测有效地沿着圆锥路径移动的点和沿着共享焦点的椭圆移动的圆之间的相遇/碰撞.
这是我的问题.我正在创建一个游戏,我想知道如何进行碰撞.我有几个案例要分析并找到最佳解决方案.
我事先说的是,我没有使用任何第三方物理库,但我会在家里做.(因为这是一个教育项目,我没有时间表,我想学习)
我有2种类型的网格,我必须为其进行冲突:
1)静态网格物体(在屏幕上移动,但没有任何动画)
2)皮肤/粘合网格(动画)
其实我有这个解决方案(非常hacky:|)
首先,我对一些包围整个网格(我的情况下是胶囊)的边界体积进行了测试,之后:
1)对于静态网格,我在块中(在建模器上)手动划分它们,对于每个块,我使用球体/ AABB测试.(工作正常,但切片每个网格有点乱:P)(我尝试了一个自动系统将网格划分为平面,但它给出了不好的结果:()
2)对于动画网格ATM我在运行时将网格划分为x个块(其中x是骨骼的数量).每个块包含该骨骼作为主要影响者的顶点.(有时工作,有时会产生非常糟糕的结果.:|)
请注意,网格的划分是在加载时完成的,而不是每次都完成(否则它会像幻灯片一样运行:D)
这是问题所在:
对于这两种情况,最明智的想法是什么?我有什么材料可以研究这些方法吗?(有一些源代码和解释会更好(语言并不重要,当我理解算法时,实现很容易))你能说出为什么这个解决方案比其他解决方案更好吗?我听说过很多关于kd-tree,octree等的讨论.虽然我理解他们的结构但我错过了他们在碰撞检测场景中的实用性.
非常感谢你的答案!!!
编辑:试图在网上找到一个K-Dop示例和一些解释.仍然没有找到任何东西.:(任何线索?我对如何使用其他类型的边界卷等有效测试K-Dop感兴趣...但网上的文档似乎非常缺乏.:(
嘿,我目前正在寻找在2D视频游戏中实现碰撞响应的各种方法,类似于本教程Metanet:N教程我想在XNA中实现一些东西,但任何语言都没问题.我对编程实现 比实际理论更感兴趣.我更喜欢更适合初学者的材料,但我确实欢迎更多高级主题.
那么有人可以提出一些很好的二维碰撞响应文章/书籍吗?
(PS:我对响应比检测更感兴趣)
优选地,不使用任何类型的循环,因为这将在游戏中使用.
我希望将一条线与一个任意大小的矩形相交.但我也希望返回交叉点[s].
这是可能的,我做了一些谷歌搜索,但仍然没有解决.
该线使用(x1,y1,x2,y2)定义.矩形也有这两点.
我目前正在研究2D射击类型的游戏,我正在使用四叉树进行碰撞检测.我写了一个工作四元树,正确地将我的演员推入他们属于树的节点/叶子.但是,我遇到了一些问题.
首先,我如何实际使用我的四叉树来选择一个对象应该测试碰撞的其他对象?我不确定如何做到这一点.
这提出了第二个问题.假设我在节点中有一个不是另一个节点的邻居的对象,但是该对象足够大以至于跨越几个节点,我如何检查实际的冲突,因为我猜测树可能认为它不是足够接近与"远方"节点中的物体碰撞?是否应将完全适合节点的对象保留在父节点中?
在我的游戏中,大多数物体都有不同的尺寸和移动.
我已经阅读了大量关于四叉树的博客/文章,但大多数只是解释如何构建一棵不是我正在寻找的树.
欢迎任何帮助/信息.
我主要专注于Graphics方面来创建一个2DGame.我看过/看过几个教程,但没有一个是令人高兴的.我已经有一个玩家(一个正方形)移动并与屏幕上的其他方块相撞.重力等也完成了.
如果屏幕上只有那么多的物体(30*20),一切都很好.但是,如果我将它增加到300*300,那么程序开始运行非常慢,因为它必须检查这么多对象.
我真的不知道像Minecraft这样的游戏如何与所有这些块一起工作,我的程序已经放弃了300*300块.
我已经尝试仅在对象可见时检查碰撞,但这导致程序检查每个对象的可见性,从而导致同样的问题.我究竟做错了什么?帮助赞赏.
我将发布一些关于如何处理冲突的代码.
player.collision(player, wall);
public void collision(Tile object1, Tile[] object2){
collisionCheckUp(object1, object2);
collisionCheckDown(object1, object2);
collisionCheckLeft(object1, object2);
collisionCheckRight(object1, object2);
}
public void collisionCheckDown(Tile object1, Tile[] object2){
for (int i = 0; i < Map.tileAmount; i++){
if(object2[i] != null && object2[i].visible)
{
if(object1.isCollidingDown(object2[i])){
object1.collisionDown = true;
return;
}
}
}
object1.collisionDown = false;
}
public void compileHullDown(){
collisionHull = new Rectangle((int)x+3, (int)y+3, width-6, height);
}
int wallCount = 0;
for (int x=0;x<Map.WIDTH;x++) {
for (int y=0;y<Map.HEIGHT;y++) {
if (Map.data[x][y] …Run Code Online (Sandbox Code Playgroud) 从一开始,碰撞检测感觉就像是O(n ^ 2)问题.
你有一堆对象,你需要检查每个对象是否与任何其他对象发生碰撞.但是,我知道将每个对象与所有其他对象进行对比检查是非常无效的.为什么两个球之间的相对昂贵的碰撞检查,如果它们彼此不相近?
这是我正在处理的简单程序的示例:

如果你有1000个球,那么如果你进行了天真的碰撞检测,你将获得1000 ^ 2次收集检查(一百万)!这种冲突检查很快成为我的应用程序的瓶颈.我需要实施一些广泛的阶段修剪.
在处理2d - 圆形物体时,应该使用哪些技术来修剪碰撞检查?我已经阅读过关于QuadTrees,BSP,空间散列等的内容,但很难理解哪种方法最适合这个用例.
有没有人知道什么可能最好?
c# ×3
c++ ×2
spatial ×2
algorithm ×1
broad-phase ×1
directx ×1
game-engine ×1
game-physics ×1
geometry ×1
intersection ×1
java ×1
line ×1
math ×1
neighbours ×1
oop ×1
physics ×1
quadtree ×1