2011-12-11 162 views
5

如何检测webgl中的碰撞,而不使用像three.js这样的库?如何检测webgl中的碰撞?

+1

这可能很难做到。无论如何,你为什么不想为他的图书馆? –

+0

我也是反库 – ajax333221

+1

@ ajax333221图书馆让我们的生活变得更加轻松。:) –

回答

13

如何检测碰撞的WebGL

你不知道。像OpenGL一样,WebGL仅用于绘制东西。它没有管理一个场景,它没有“对象”的概念或像碰撞这样的高级事物。这些都是关于点,线,三角形和着色器的。

任何与场景管理或碰撞有关的事情都不在WebGL(和OpenGL)的范围之内。

+0

那么我怎么才能计算出它在JS? –

+3

@DannyFox:你可以用任何其他语言来计算它:通过求解各种几何相交测试方程,并从结果中提取碰撞。关于这个主题有一本很好的书:http://realtimecollisiondetection.net/ – datenwolf

+0

你可以通过使用着色器明确解决与OpenGL(也可能是WebGL)的冲突。给对象不同的颜色,然后使用混合将两者结合起来。如果在结果图像上有一个或多个与两个对象颜色不同的像素(例如,来自对象的某些像素与其他对象像素混合),则会发生碰撞。 – Willem

3

一个简单的方法来在GPU上进行射线碰撞检测。签出关于这个话题的以下博文。

http://blog.xeolabs.com/ray-picking-in-scenejs

的主要思想是使用保存的代替色彩的对象ID的着色器来渲染场景到纹理(使用FBO)。然后,您可以非常快地在此纹理中查找以查看光线与之发生什么碰撞。

+0

这仅适用于测试来自视角或非遮挡几何体的光线。 – datenwolf

+0

是的,该解决方案只适用于射线碰撞,但问题并未说明需要什么样的碰撞检测。我的观点是,一些碰撞测试可以在GPU上完美运行(但它不是一个通用的解决方案),谢谢 – Mortennobel

+0

,但它在scene.js中。我想在没有任何库的情况下做到这一点 –

1

由于星期日我试图解决同样的问题。尽管www中有很多信息,但我无法使用它来处理我的示例程序。只要我解决它,我会在这里发布我的例子。

我最后的尝试是为webGL使用glu-unProject端口。这其中需要下列参数:

功能(WINX,酒味,winZ,模型,凸出,视图,objPos)

我试图直接从我的场景绘制函数调用这个函数用于测试目的。

var pMatrix = new mat4.ortho(iL, iR, iB, iT, fNearZ, farZ); 
var mvMatrix = new mat4.create(); 

mat4.identity(mvMatrix); 
mat4.translate(mvMatrix,[0,0,-40]); 

var oMouseMatrix = mat4.create(); 
mat4.identity(oMouseMatrix); 

//Rotate eye :-S 
mat4.rotate(oMouseMatrix,((this.fAnimationXAngle/10) * Math.PI)/360.0,[0,1,0]); 
mat4.rotate(oMouseMatrix,((this.fAnimationYAngle/10) * Math.PI)/360.0,[1,0,0]); 

mat4.multiply(oMouseMatrix, mvMatrix, mvMatrix); 

//Rotate model 
mat4.rotateX(mvMatrix,this.fRotX * Math.PI/180.0); 
mat4.rotateY(mvMatrix,this.fRotY * Math.PI/180.0); 
mat4.rotateZ(mvMatrix,this.fRotZ * Math.PI/180.0); 



var aTest = this.unProject(
    this.pLastMouse.x, 
    this.pLastMouse.y, 
    0, 
    mvMatrix, 
    pMatrix, 
    [0,0,this.iWidth,this.iHeight] 
); 

this.iWidth & this.iHeight是画布和视口宽度/高度 - this.pLastMouse.x & .Y是画布

zI.debug(aTest); 

内的鼠标坐标但结果是完全废话。我想我的代码中有几个错误。我刚刚在上周五开始玩WebGL。我不想早早放弃,但自那时以来,我解决了许多问题,但这个让我发疯。

在openGL中,对我来说更容易。

+0

谢谢,我会试试看 –

1

我建议以下网页(可惜只有德文版)http://www.peter-strohm.de/webgl/webgltutorial8.php

我们能够实现碰撞检测,并使用ID映射(例如显示工具提示使用的附加信息的服务器甚至可以进行API调用场景中的某个对象)。

我希望这会有所帮助。