Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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()

我在这里演示了这一点:

谢谢!光线投射的一个优点是,您可以判断对象前面是否有其他物体。在这种情况下,可能是按钮不可单击。就像它在墙角。但我想这取决于用例。