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
Math 如何确定点是否在框(three.js)内?_Math_Three.js_Geometry_Collision Detection - Fatal编程技术网

Math 如何确定点是否在框(three.js)内?

Math 如何确定点是否在框(three.js)内?,math,three.js,geometry,collision-detection,Math,Three.js,Geometry,Collision Detection,如果我们有非轴对齐框,我们如何最好地检查一个点是否位于其中?(我使用的是three.js,因此那里的任何实用程序都可以提供帮助。three.js包含边界框概念,但这是轴对齐的边界框)如果你的框是一个旋转、平移和缩放的three.BoxGeometry,那么你可以使用它的变换矩阵m来确定它是否与你的点相交v: 将v和长方体转换为m 检查变换的v是否位于变换框内(现在已对齐轴) 代码如下: var box = <Your non-aligned box> var point = &l

如果我们有非轴对齐框,我们如何最好地检查一个点是否位于其中?(我使用的是three.js,因此那里的任何实用程序都可以提供帮助。three.js包含边界框概念,但这是轴对齐的边界框)

如果你的框是一个旋转、平移和缩放的three.BoxGeometry,那么你可以使用它的变换矩阵
m
来确定它是否与你的点相交
v

  • v
    和长方体转换为
    m
  • 检查变换的
    v
    是否位于变换框内(现在已对齐轴)
代码如下:

var box = <Your non-aligned box>
var point = <Your point>

box.geometry.computeBoundingBox(); // This is only necessary if not allready computed
box.updateMatrixWorld(true); // This might be necessary if box is moved

var boxMatrixInverse = new THREE.Matrix4().getInverse(box.matrixWorld);

var inverseBox = box.clone();
var inversePoint = point.clone();

inverseBox.applyMatrix(boxMatrixInverse);
inversePoint.applyMatrix4(boxMatrixInverse);

var bb = new THREE.Box3().setFromObject(inverseBox);

var isInside = bb.containsPoint(inversePoint);
var框=
变量点=
box.geometry.computeBoundingBox();//这仅在未完全就绪时才有必要
box.updateMatrix世界(true);//这可能是必要的,如果框被移动
var-boxMatrixInverse=new THREE.Matrix4().getInverse(box.matrixWorld);
var inverseBox=box.clone();
var inversePoint=point.clone();
应用矩阵(boxMatrixInverse);
反向点。应用矩阵X4(boxMatrixInverse);
var bb=new THREE.Box3().setFromObject(inverseBox);
var isInside=bb.containsPoint(反向点);

下面是一个运行演示:

如何将非轴对齐框放入非对齐状态?你是在使用变换,还是在这样的方向上明确定位的几何体?有很多方法。什么是最好的-取决于盒子是如何定义的。@TheJim01我创建盒子,翻译它并旋转。这是我的第一个想法。如果这是最好的方法,他们应该在three.js中创建一个实用方法来实现这一点。@croraf我将我的答案改为一个更通用的方法,并添加了实现这一点的代码。这对你有用吗?@HolgerL你每秒不必要地实例化240个对象。那又怎么样,@WestLangley。我回答的重点是解释问题是如何解决的。优化后的代码通常更难阅读和理解。问题是如何解决这个问题,而不是如何编写性能优化的代码。演示的目的是证明它是有效的。当我帮助别人时,我喜欢可读性而不是内存占用。我解决了box.matrixWorld未设置的问题,使用:box.updateMatrixWorld(true);因此,在回答中,我只需更改line box.geometry.computeBoundingBox();用那句台词。