【发布时间】:2012-10-20 13:41:08
【问题描述】:
我正在使用 THREE.js 和 WebGL 渲染制作一个 3D 突破性游戏。我想用 THREE.Ray 来检测弹跳球和底部平台的碰撞,你可以控制,但是我遇到了麻烦。
我已经设法将光线从平台投射到球上(或其他方式),但是一旦我这样做了,球就会卡在屏幕中间并且无法设置动画。
var ray = new THREE.Ray( platform.position, ball.position.subSelf( platform.position ).normalize() );
var intersects = ray.intersectObject( ball );
if ( intersects.length > 0 ) console.log(intersects[0].distance);
我尝试删除 subSelf 和 normalize() 但这会破坏检测。
这是游戏,代码可以在 script.js 中找到:
http://dl.dropbox.com/u/4531743/WebGL/Breakout-3D/index.html
如果你打开控制台,你可以看到移动面板时距离值会发生变化,这很好。但是球不能动画,因为在每一帧它都被设置到那个位置。
http://dl.dropbox.com/u/4531743/WebGL/Breakout-3D/index.html#disableRay
以上是我最初的做法,只是通过计算球和面板的 Z 位置并查看它是否更大并且在面板的宽度 (x) 坐标内,如果是,则将其弹回。
球的弹跳只是每帧将 X 和 Z 坐标改变一个固定的量,如果它在任一方向上走得太远,则反转该量使其返回。
【问题讨论】:
-
调试太多了。你能用相关代码做一个更简单的例子吗?您能否让您的简单示例在 jsfiddle 中运行,以便更容易被黑客入侵?
-
当然,这里:jsfiddle.net/g9Djn 我需要一条射线来检测平台和球之间的碰撞,然后如果它们接触,将球弹开。
-
如何使用THREE.Ray检测红球与绿台的碰撞?
-
尝试自己将碰撞代码添加到小提琴中。到目前为止,你做得很好。 :-) 如果仍有问题,请重新发布。
-
jsfiddle.net/g9Djn/1 这是我所能得到的。我可以检测到它们之间的距离,但现在你不能移动绿色平台,它会移动到中间。
标签: javascript collision-detection three.js