正交相机下的交点求解

3
我在我的项目中使用正交相机。我的问题是射线投射器。它工作了,但不正确。对象的选择并不是在其全部宽度或高度内进行的。有时它仅使用对象的一半。但当我通过轨道控制移动相机时,射线投射器可以正常工作。我忘了说我使用GPUpicker库。
我的项目:https://alovert.ru 默认情况下相机是透视的,要切换为正交,请按键盘上的“O”键。
要查看问题,您必须单击立方体侧面和梁的小侧面。这样,您可以向场景中添加一个新对象。当您尝试添加新对象时,您会发现该对象的某些部分直到您移动相机才会相交。使用透视相机没有问题。感谢任何帮助!enter image description here
我的代码交集
function onMouseClick(e) {
  e.preventDefault();

  mouse.x = e.clientX;
  mouse.y = e.clientY;
  var raymouse = new THREE.Vector2();
  raymouse.x = ((event.clientX - renderer.domElement.offsetLeft) / renderer.domElement.width) * 2 - 1;
  raymouse.y = - ((event.clientY - renderer.domElement.offsetTop) / renderer.domElement.height) * 2 + 1;

  raycaster.setFromCamera(raymouse, activeCamera);

  var intersect = gpuPicker.pick(mouse, raycaster);
}

1
很好的问题,Arkadiy Vinkovskiy。 - user6600549
1
我建议您打印或渲染射线与物体之间的碰撞点。如果可能的话,尝试以某种方式渲染射线,以便您可以看到它在空间中的移动方式。我不知道gpupicker是什么,但可能存在一个问题,即您的射线和物体在计算中处于不同的视角,导致一些射线无法命中目标。 - Marko Taht
不,那只是一个实验。我现在正在处理我的项目,请再看一下。当我使用鼠标移动的代码时,新对象没有被添加到场景中。你能试一下吗?@Marko Taht - vinkovsky
我查看了GPUPick的代码。似乎由于某种原因,一条射线和一个三角形是平行的,所以它们不相交,从而导致错误。将您的模型简化为立方体和矩形。它们具有更简单的形状,交集测试应该更简单。然后您可以查看问题是否仍然存在,这可能更容易调试。下一步是深入研究GPUPicker代码,并查看是否可以以某种方式呈现或轮廓显示检查失败的三角形。 - Marko Taht
它已经是一个立方体和矩形了。交集只适用于立方体。请再次查看我的项目。我打开线框模式@Marko Taht - vinkovsky
显示剩余16条评论
2个回答

1
要解决这个问题,只需添加这一行代码
raycaster.ray.origin.set( mouse.x, mouse.y, - 1 ).unproject( camera );

1
您正在渲染相机后面的对象。camera.near 应该大于 0。https://dev59.com/X2Mm5IYBdhLWcg3whPPq#17567292 - WestLangley

1
请看这个例子: https://threejs.org/examples/#webgl_interactive_cubes_ortho

Code: https://github.com/mrdoob/three.js/blob/master/examples/webgl_interactive_cubes_ortho.html

试试这个:


var camera = new THREE.OrthographicCamera(0, window.innerWidth, -window.innerHeight, 0, -100, 100);

var raycaster = new THREE.Raycaster(); // create once
var mouse = new THREE.Vector2(); // create once

...

mouse.x = ( event.clientX / renderer.domElement.clientWidth ) * 2 - 1;
mouse.y = - ( event.clientY / renderer.domElement.clientHeight ) * 2 + 1;

raycaster.setFromCamera( mouse, camera );

var intersects = raycaster.intersectObjects( objects, recursiveFlag );

1
当我将“near”参数设置为-1000时,它似乎并没有改变,仍然是0。 - vinkovsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接