3d 检查物体是否在摄像机的中心 我想检查一个圆柱体是否或多或少在照相机的中间,然后进行交互。气缸像按钮一样工作。 我的想法是检查平截头体,但我不知道如何调整z轴。 或者它们可能是更好的选择 var frustum = new THREE.Frustum(); var matrix = new THREE.Matrix4().multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); frustum.setFromMatrix( matrix ); if(frustum.containsPoint( cylinder.position )) cylinder.material.color.setHex( '0xbada55' ); else cylinder.material.color.setHex( '0xffcc00' ); 检查气缸是否在视图中,而不是在中间范围内。 < P>,可以使用目标。
大概是这样的:3d 检查物体是否在摄像机的中心 我想检查一个圆柱体是否或多或少在照相机的中间,然后进行交互。气缸像按钮一样工作。 我的想法是检查平截头体,但我不知道如何调整z轴。 或者它们可能是更好的选择 var frustum = new THREE.Frustum(); var matrix = new THREE.Matrix4().multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); frustum.setFromMatrix( matrix ); if(frustum.containsPoint( cylinder.position )) cylinder.material.color.setHex( '0xbada55' ); else cylinder.material.color.setHex( '0xffcc00' ); 检查气缸是否在视图中,而不是在中间范围内。 < P>,可以使用目标。,3d,three.js,frustum,3d,Three.js,Frustum,大概是这样的: var raycaster = new THREE.Raycaster(camera.position, camera.getWorldDirection()); 然后检查你想要的物体是否被击中 var intersects = raycaster.intersectObjects(scene.children); if (intersects && intersects[0].object.id == myObjectId) { // Object
var raycaster = new THREE.Raycaster(camera.position, camera.getWorldDirection());
然后检查你想要的物体是否被击中
var intersects = raycaster.intersectObjects(scene.children);
if (intersects && intersects[0].object.id == myObjectId) {
// Object is in the center of the camera
}
这通常使用光线投射完成:将光线从视口中心投射到场景中,并检查该光线是否与任何对象相交。原则上,这是您需要的代码:
var raycaster = new THREE.Raycaster();
var center = new THREE.Vector2(0, 0);
var raycastTargets = [
// add objects (meshes) that should be subject to raycasting
];
function render() {
// ...
camera.updateMatrixWorld();
raycaster.setFromCamera(center, camera);
var intersections = raycaster.intersectObjects(raycastTargets);
var intersection = (intersections.length) > 0 ? intersections[0] : null;
// ...
}
在“渲染”函数中输入该代码后,您将在“交叉点”中看到所涉及的对象是否位于视图的中心。光线投射成本较高 最简单的方法是将圆柱体位置投影到屏幕空间,并检查其是否靠近屏幕中心。通过这种方式,您还可以定义一个阈值,以确定距离中心的距离:
var阈值=0.2;
var positionScreenSpace=cylinder.position.clone().project(摄像机);
位置屏幕空间.setZ(0);
var isCloseToCenter=positionScreenSpace.length()
我在这里演示了这一点:谢谢!光线投射的一个优点是,您可以判断对象前面是否有其他物体。在这种情况下,可能是按钮不可单击。就像它在墙角。但我想这取决于用例。