【发布时间】:2025-12-14 22:35:01
【问题描述】:
大家好,我一直在利用很棒的库 three.js 进行我的一个小项目
现在我一直在使用https://github.com/stemkoski/stemkoski.github.com/blob/master/Three.js/Collision-Detection.html 的示例来处理碰撞检测,当一个对象与另一个使用voxel's 的对象重叠时更是如此。
为了引用我的问题,我使用了http://threejs.org/examples/#canvas_interactive_voxelpainter 示例。
无论如何要继续,当我将voxel 渲染到屏幕上时,立方体上方的任何东西都将允许我渲染另一个voxel 一定半径内的任何东西below volex 不会让我渲染:
现在这是我使用stemkoski提供的示例整理的简洁小函数:
checkOverlapObject: function(voxel) // THIS IS USED TO SEE IF WE ARE OVER LAPPING ANY OBJECTS
{
var originPoint = voxel.position.clone();
var collidableObjs = this.rooms;
for (var vertexIndex = 0; vertexIndex < voxel.geometry.vertices.length; vertexIndex++)
{
var localVertex = voxel.geometry.vertices[vertexIndex].clone();
console.log(localVertex);
var globalVertex = localVertex.applyMatrix4( voxel.matrix );
console.log(globalVertex);
var directionVector = globalVertex.sub( voxel.position );
console.log(directionVector);
console.log(originPoint);
console.log(directionVector.clone().normalize());
if(collidableObjs.length > 0)
{
var ray = new THREE.Raycaster( originPoint, directionVector.clone().normalize() );
var collisionResults = ray.intersectObjects( collidableObjs );
if ( collisionResults.length > 0 && collisionResults[0].distance < directionVector.length() )
{
console.log(collisionResults);
console.log(collisionResults[0].distance);
console.log( directionVector.length() );
return false
}
}
}
return true;
},
现在这里发生的情况是,在实际添加渲染的volex 之前,用户可以预览他们是否有权添加volex 所以我们传递了一个volex,由:
var voxel = new THREE.Mesh( this.room.cubeGeometry, this.room.cubeTmpHoverMaterial );
voxel.geometry.computeBoundingBox();
voxel.position.copy( intersect.point ).add( intersect.face.normal );
voxel.position.divideScalar( 50 ).floor().multiplyScalar( 50 ).addScalar( 25 );
voxel.material.color.setHex(this.colorTmpHover);
进入我们的checkOverlapObject 函数,查看对象是否与已渲染到screen/grid 上的对象重叠
现在按照我创建的little neat 函数,我已将console.log 放置在输出参数中,以下是其中的一些输出:
T…E.Vector3 {x: 25, y: 25, z: 25} <!-- our localVertex
T…E.Vector3 {x: 25, y: 25, z: 25} <!-- our globalVertex
T…E.Vector3 {x: 0, y: 0, z: -350} <!-- our directionVector
T…E.Vector3 {x: 25, y: 25, z: 375} <!-- our originPoint
T…E.Vector3 {x: 0, y: 0, z: -1} <!-- our directionVector.clone().normalize()
[Object, Object] <!-- our collisionResults
225 <!-- our collisionResults[0].distance
350 <!-- our directionVector.length()
此数据基于第一张图片。
请理解我还有其他volex 占用2 blocks on the grid 或更多。所以这样做的原因是,我有一个位置的中心位置,但如果它占用2 blocks on the grid,我需要考虑对象的其余部分,以检查它是否与already rendered volex重叠我不在乎他们是否互相触摸。
关于可能是什么问题的任何建议或想法?
【问题讨论】:
标签: javascript three.js