标签: collision-detection

网上是否有任何示例如何使用着色器实现碰撞检测?

Web上是否有任何OpenGL,Op​​enGL ES或WebGL代码示例如何使用着色器(最好是GLSL)实现3D碰撞检测?

谢谢.

opengl shader glsl collision-detection webgl

6
推荐指数
1
解决办法
1960
查看次数

OpenGL Vertex缓冲区对象,我可以访问顶点数据以进行其他用途,例如碰撞检测吗?

我目前正在使用与Superbible第5版一起提供的GLTools课程.我正在查看GLTriangleBatch类,它具有以下代码:

// Create the master vertex array object
glGenVertexArrays(1, &vertexArrayBufferObject);
glBindVertexArray(vertexArrayBufferObject);


// Create the buffer objects
glGenBuffers(4, bufferObjects);

#define VERTEX_DATA     0
#define NORMAL_DATA     1
#define TEXTURE_DATA    2
#define INDEX_DATA      3

// Copy data to video memory
// Vertex data
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[VERTEX_DATA]);
glEnableVertexAttribArray(GLT_ATTRIBUTE_VERTEX);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*3, pVerts, GL_STATIC_DRAW);
glVertexAttribPointer(GLT_ATTRIBUTE_VERTEX, 3, GL_FLOAT, GL_FALSE, 0, 0);

// Normal data
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[NORMAL_DATA]);
glEnableVertexAttribArray(GLT_ATTRIBUTE_NORMAL);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*3, pNorms, GL_STATIC_DRAW);
glVertexAttribPointer(GLT_ATTRIBUTE_NORMAL, 3, GL_FLOAT, GL_FALSE, 0, 0);

// Texture coordinates
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[TEXTURE_DATA]);
glEnableVertexAttribArray(GLT_ATTRIBUTE_TEXTURE0);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*2, pTexCoords, GL_STATIC_DRAW);
glVertexAttribPointer(GLT_ATTRIBUTE_TEXTURE0, 2, …
Run Code Online (Sandbox Code Playgroud)

opengl collision-detection vertex-buffer vertex vertex-array

6
推荐指数
1
解决办法
6271
查看次数

2D平台AABB碰撞问题

http://dl.dropbox.com/u/3724424/Programming/Gifs/game6.gif

我有AABB碰撞解决方案的问题.


我通过首先解析X轴然后解析Y轴来解析AABB交叉点.这样做是为了防止这个错误:http://i.stack.imgur.com/NLg4j.png


当对象进入播放器并且必须水平推动播放器时,当前方法工作​​正常.正如你在.gif中看到的那样,水平尖峰正确地推动了玩家.


但是,当垂直尖峰移动到播放器中时,X轴仍然首先被解析.这使得"使用尖钉作为升力"是不可能的.

当玩家进入垂直尖峰(受重力影响,落入其中)时,他被推到Y轴上,因为X轴上没有重叠开始.


我试过的东西是这个链接第一个答案中描述的方法.然而,尖峰和移动物体通过改变位置而不是速度来移动,并且在调用Update()方法之前我不计算它们的下一个预测位置.不用说这个解决方案也不起作用.:(


我需要以上述两种情况都按预期工作的方式解决AABB碰撞问题.

这是我目前的碰撞源代码:http://pastebin.com/MiCi3nA1

如果有人可以调查一下,我会非常感激,因为这个错误从一开始就一直存在于引擎中,我一直在努力找到一个好的解决方案,但没有任何成功.这让我花了很多时间看着碰撞代码并阻止我进入"有趣的部分"并编写游戏逻辑:(


我尝试实现与XNA AppHub平台演示中相同的碰撞系统(通过复制粘贴大部分内容).然而,"跳跃"错误发生在我的游戏中,而在AppHub演示中却没有.[跳跃的bug:http://i.stack.imgur.com/NLg4j.png ]

要跳转我检查播放器是否为"onGround",然后将-5添加到Velocity.Y.

由于玩家的Velocity.X高于Velocity.Y(参考图中的第四个面板),onGround在不应该的时候设置为true,因此让玩家在半空中跳跃.

我相信这不会发生在AppHub演示中,因为玩家的Velocity.X永远不会高于Velocity.Y,但我可能会弄错.

我先解决了这个问题,首先解析X轴,然后解决Y轴问题.但是,正如我上面所说的那样,它会加剧与尖钉的碰撞.

c# physics 2d collision-detection

6
推荐指数
1
解决办法
1589
查看次数

SVG文本命中测试

我正在尝试使用客户端JavaScript实现SVG文本元素的冲突检测.命中测试应检查文本的任何字形是否与另一个文本元素的任何字形重叠.由于getBBox并且getExtentOfChar不是准确的,我需要一个自定义的解决方案.

我的第一种方法是获取元素的每个坐标/像素的颜色并手动进行命中测试,但这不起作用,因为无法获得坐标的颜色.它需要一个额外的画布来获得像素颜色 - >糟糕的解决方法.

现在我正在考虑将文本或字形转换为多边形以进行命中测试.可能吗?或者还有其他任何基于字形的命中测试的方法吗?

最好的祝福

javascript html5 svg collision-detection hittest

6
推荐指数
1
解决办法
2478
查看次数

Javascript碰撞检测

我正在尝试用javascript制作蛇游戏,但我正在努力进行碰撞检测.到目前为止,我已经尝试了各种方法,但是在绝望中,已经确定了每帧存储段的所有位置,然后在动画下一个之前检查是否有任何重复.不幸的是,这种方法未被证明是成功的.

也许这是由于对JS如何处理数组的误解.有一段时间我正在使用if(x in y)但是从我可以告诉它返回如果完全相同的对象在数组中.

这是现场演示:http://jsfiddle.net/AScYw/2/

以下是更容易阅读的代码:http://pastebin.com/ygj73me6

有问题的代码在snake对象中,作为函数collide.

this.collide = function(){
            for(var z=0; z<this.positions.length-1; z++){
                for(var q=z+1; q<this.positions.length-1; q++){
                    return this.positions[z][0] == this.positions[q][0] && this.positions[z][1] == this.positions[q][1];
                }
            }
Run Code Online (Sandbox Code Playgroud)

javascript collision-detection

6
推荐指数
1
解决办法
1085
查看次数

实现"三角内检查点"算法时出错

我下面的算法1 这篇文章来检查点的三角形内.这是我的代码:

//========================================================================================================================//
// Methods
//========================================================================================================================//

private float getPerpDotProduct(final PointF p1, final PointF p2) {
    return p1.x * p2.y - p1.y * p2.x;
}

private boolean isInside(final PointF pPoint) { 
    final float c1 = this.getPerpDotProduct(this.mA, pPoint);
    final float c2 = this.getPerpDotProduct(this.mB, pPoint);
    final float c3 = this.getPerpDotProduct(this.mC, pPoint);

    return ((c1 >= 0 && c2 >= 0 & c3 >= 0) || (c1 <= 0 && c2 <= 0 && c3 <= 0));
}
Run Code Online (Sandbox Code Playgroud)

这是我的考验: 在此输入图像描述

青色区域:我给出的真正三角形.

粉红色区域:"内部"三角形

蓝色区域:"外部"三角形

编辑:

这是我用向量计算的新代码: …

java algorithm collision-detection

6
推荐指数
1
解决办法
426
查看次数

如何处理同时碰撞,以便处理顺序无关紧要?

假设有3个球同时发生碰撞.我发现我解决碰撞的顺序会对最终结果产生影响,而这种结果在任何情况下都没有意义.

为了解释并保持简单,请考虑1D中的3个球,所有质量相同,弹性碰撞.顶部的数字是速度,箭头是方向.假设他们目前都在互相接触,即在碰撞中

 -->2   -->1 <---3
   O     O       O
   A     B       C
Run Code Online (Sandbox Code Playgroud)

这表示球A从后面击球B,球B和C在面上碰撞.

现在,如果我们首先用B解决碰撞A,然后用C解决碰撞B,但是使用B的新速度,如果我们改为解决B与C的碰撞,然后用B解析A,则应该给出相同的结果(使用B)的新速度.

但事实并非如此.

第一种情况:A与B,其次是B与C

A与B给出

 -->1   -->2
   O     O  
   A     B  
Run Code Online (Sandbox Code Playgroud)

和B给出C(但使用上面2的新B速度,而不是1的原始速度)

 <--3   -->2
   O     O  
   B     C  
Run Code Online (Sandbox Code Playgroud)

因此最终的结果是

 -->1   <--3  ---->2
   O     O       O
   A     B       C
Run Code Online (Sandbox Code Playgroud)

第二种情况:B与C,其次是A与B

B与C给出

 <--3   --->1
   O     O  
   B     C
Run Code Online (Sandbox Code Playgroud)

A与B(但使用上面3的B的新速度,而不是原始1)

<--3    -->2
   O     O  
   A     B  
Run Code Online (Sandbox Code Playgroud)

因此最终的结果是

 <--3  -->2   ---->1
   O     O       O
   A     B       C
Run Code Online (Sandbox Code Playgroud)

你可以看到最终状态不同.

我究竟做错了什么?更重要的是,处理这个问题的正确方法是什么?

对于具有许多球的模拟以及与墙壁的碰撞,这种情况是非常可能的.(例如,球击中墙壁并同时被另一个球击中,会产生与上述相同的问题,顺序给出不同的结果).

目前,我使用循环迭代所有对象并一次解决每个对象之间的冲突.因此我使用的顺序是任意的(顺序只是数组中球的索引).

collision-detection

6
推荐指数
1
解决办法
816
查看次数

任意大小凸多边形碰撞检测算法

我正在研究小行星克隆.一切都是2D,用C++编写.

对于小行星,我正在生成随机的N边多边形.我保证他们是Convex.然后我旋转它们,让它们旋转速度,让它们飞过太空.这一切都有效,非常漂亮.

对于碰撞,我使用的是我自己想到的算法.这可能是一个坏主意,如果推动,我可能会废弃整个事情,并在互联网上找到一个教程.

我已经编写并实现了所有内容,并且碰撞检测工作正常....大部分时间.当屏幕上明显发生碰撞时,它会随机失败,有时会在没有任何触摸时指示碰撞.我要么在某处扯下我的实现,要么我的算法很糟糕.由于我的实现的大小/范围(通过几个源文件),我不想打扰你,只是想让某人检查我的算法实际上是合理的.那时我可以继续寻找一个大虫子.

算法:

对于每个小行星,我有一个函数输出绘制小行星时每个顶点应该在哪里.对于每对相邻的顶点,我为它们所在的线生成公式, y=mx+b格式化.然后我从我的一个船顶点开始,测试该点以查看它是否在小行星内.我首先插入点的X坐标,然后将输出与实际Y值进行比较.这告诉我该点是在线之上还是之下.然后我对小行星的中心做同样的事情,以确定哪一半的线被认为是小行星的"内部".然后我重复每对顶点.如果我找到一条线,我的点与小行星的中心不在同一侧,我知道没有碰撞,并且退出检测到该点.由于我的船上有3个点,我必须测试下一个点.如果所有3个点都提前退出,那么船上的任何一点都没有碰撞,我们就完成了.如果由小行星组成的线在所有侧面上绑定任何点,则它位于小行星内部,并设置碰撞标志.

我用这种算法发现的两个问题是:

  1. 它不适用于凹多边形,并且
  2. 在Slope未定义的Edge情况下存在问题.

我已经确保所有多边形都是凸面的,并且已经编写了代码来处理未定义的斜率问题(NAN如果我们除以0,则应该双重返回,因此很容易测试它).

那么,这应该有用吗?

c++ algorithm 2d collision-detection

6
推荐指数
2
解决办法
3562
查看次数

如果physicsBody.dynamic属性为NO,则两个物理实体不联系

有两个物理机构:a AirplaneNode:

- (id)initAirplaneNode {
    self = [super initWithImageNamed:@"airplane.png"];
    if (self) {
        self.name = @"player";
        self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.frame.size];
        self.physicsBody.dynamic = NO;
        self.physicsBody.affectedByGravity = NO;
        self.physicsBody.categoryBitMask = AIRPLANE_CATEGORY;
        self.physicsBody.contactTestBitMask = BULLET_CATEGORY;
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

和a BulletNode:

- (id)initBulletNode {    
    self = [super initWithImageNamed:@"bullet.png"];
    if (self) {
        self.name = @"bullet";
        self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.frame.size];
        self.physicsBody.dynamic = NO;
        self.physicsBody.usesPreciseCollisionDetection = YES;
        self.physicsBody.categoryBitMask = BULLET_CATEGORY;
        self.physicsBody.contactTestBitMask = AIRPLANE_CATEGORY;
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

他们都有physicsBody.dynamic财产设置NO.

问题是当子弹击中飞机时,我SKScene不会打电话给 …

objective-c collision-detection game-physics ios sprite-kit

6
推荐指数
1
解决办法
4863
查看次数

检测CGPoint是否在正方形(菱形)内的麻烦

我有2个SKSpriteNode:

  • 一个简单的方块(A)
  • 相同的方形旋转(-45°)(B)

我需要随时检查另一个SKSpriteNode(一个球)的中心是否位于其中一个方格内.球和方块具有相同的父级(主场景).

override func update(_ currentTime: TimeInterval) {

    let spriteArray = self.nodes(at: ball.position)

    let arr = spriteArray.filter {$0.name == "square"}

    for square in arr {
        print(square.letter)

        if(square.contains(self.puck.position)) {
             print("INSIDE")
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

使用简单的方形(A),我的代码可以正常工作.数据是对的.我知道,在任何时候,如果CGPoint中心位于广场内部或外部.

但是对于具有旋转(B)的正方形,数据不是所希望的.CGPoint在包含钻石形状的正方形中被检测到.

演示

SKSpriteNode方块通过关卡编辑器创建.

如何才能获得钻石形状的正确结果?

编辑1

运用

view.showsPhysics = true
Run Code Online (Sandbox Code Playgroud)

我可以看到所有SKSpriteNode与physicsBody的界限.我的钻石方形的边界是菱形方形而不是灰色方形区域.

 square.frame.size -> return the grey area
 square.size -> return the diamond-square
Run Code Online (Sandbox Code Playgroud)

在Apple文档中,func节点(在p:CGPoint) - > [SKNode],该方法是关于节点而不是帧,那么为什么它不起作用?

collision-detection ios sprite-kit skspritenode swift

6
推荐指数
1
解决办法
420
查看次数