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
Three.js 按需查找立方体的上表面_Three.js_3d_Intersection_Raycasting - Fatal编程技术网

Three.js 按需查找立方体的上表面

Three.js 按需查找立方体的上表面,three.js,3d,intersection,raycasting,Three.js,3d,Intersection,Raycasting,我试图解决的一般问题是找出立方体的哪个面朝上。立方体可以一次在任何方向上滚动90°。如果某个面朝上,立方体将消失。我正在用tweens旋转立方体并改变它的位置 我目前正试图通过创建一条新光线来解决这个问题,它的原点设置在立方体的正上方,方向向下一小段距离,因此它只与立方体的上表面相交。 到目前为止还不错。当我按照console.log()进行检查时,我将多维数据集作为相交对象,但当我尝试通过faceIntersect.face访问相交面时,它似乎未定义 有关职能: 函数checkupface(

我试图解决的一般问题是找出立方体的哪个面朝上。立方体可以一次在任何方向上滚动90°。如果某个面朝上,立方体将消失。我正在用tweens旋转立方体并改变它的位置

我目前正试图通过创建一条新光线来解决这个问题,它的原点设置在立方体的正上方,方向向下一小段距离,因此它只与立方体的上表面相交。

到目前为止还不错。当我按照
console.log()
进行检查时,我将多维数据集作为相交对象,但当我尝试通过
faceIntersect.face
访问相交面时,它似乎未定义

有关职能:

函数checkupface(posX、posZ){
//从传递的x和z值获取位置(y始终位于立方体上方)
//并设置光线的方向和长度
变量位置=新的三个向量3(posX,3,posZ);
变量方向=新的三个向量3(0,-1,0);
var-far=2;
//创建从立方体上方向下的光线
var cubeRaycaster=新的三点光线投射器(位置、方向、0、远);
//与滚动立方体的上表面相交
var faceIntersect=cubeRaycaster.intersectObject(currentCube);
//添加辅助对象以查看光线
var arrowHelper=新的三个.arrowHelper(方向、位置、距离,0x770077);
添加(箭头辅助对象);
console.log(faceIntersect);//对象显示了我想知道的一切
console.log(faceIntersect.face);//显示为未定义
}

可能不是光线投射问题的解决方案,而是另一种方法:为什么不通过比较旋转角度来检测上表面?例如(伪代码):


您必须处理值公差(85°-95°)负旋转值和超出PI*2范围的值,但除此之外,这不是更容易吗?

最后,我按照@unx建议的方式进行了处理,但我真的想避免使用庞大的if-else语句,所以我使用了一个数组
rotationLibrary
,该数组具有与模具顶面对应的所有可能的旋转。但由于我用来旋转和移动模具的二者之间,其旋转值实际上不在同一点上,因此很难与固定旋转值进行比较,因为我在阵列中使用它们

因此,我将模具的旋转值“规格化”为可用于将其与
旋转库中的值进行比较的值。最后一步是将结果存储/更新到立方体对象本身顶部的面上,以便我可以随时获取结果

//繁殖条件:
//1个在顶部,2个面向摄像机,3个面向右侧(从摄像机上看),
//4个面朝左侧(见3),5个面朝远离摄像机,6个面朝下
变量旋转库=[
{x:0,y:0,z:0,面:1},
{x:0,y:90,z:0,面:1},
{x:180,y:0,z:180,面:1},
{x:0,y:-90,z:0,面:1},
{x:-90,y:0,z:0,面:2},
{x:-90,y:0,z:90,面:2},
{x:-90,y:0,z:180,面:2},
{x:-90,y:0,z:-90,面:2},
{x:0,y:0,z:90,面:3},
{x:90,y:90,z:0,面:3},
{x:-90,y:-90,z:0,面:3},
{x:-90,y:90,z:180,面:3},
{x:180,y:0,z:-90,面:3},
{x:0,y:0,z:-90,面:4},
{x:90,y:-90,z:0,面:4},
{x:-90,y:90,z:0,面:4},
{x:180,y:0,z:90,面:4},
{x:90,y:0,z:0,面:5},
{x:90,y:0,z:-90,面:5},
{x:90,y:0,z:180,面:5},
{x:90,y:0,z:90,面:5},
{x:90,y:90,z:90,面:5},
{x:0,y:0,z:180,面:6},
{x:180,y:-90,z:0,面:6},
{x:180,y:90,z:0,面:6},
{x:180,y:0,z:0,面:6}
];
函数检查RotationToGetUpface(立方体){
//创建具有“标准化”(四分之一圆度值)度的对象
变量normalizedRotation={
x:0,,
y:0,
z:0
};
normalizedRotation.x=获取normalizedDegree(立方体旋转);
normalizedRotation.y=获取normalizedDegree(立方体旋转);
normalizedRotation.z=getNormalizedDegree(立方体旋转);
//浏览具有对应上表面的所有度的库
对于(var i=0;i45&&rotValue<135){
标准化度=90;
}
//x在-45°和-135°之间(~-90)
否则如果(rotValue<-45&&rotValue>-135){
标准化程度=-90;
}
//x在135°和215°之间或x在-135°和-215°之间(~180)
否则如果((rotValue>135&&rotValue<215)| |(rotValue<-135&&rotValue>-215)){
标准化度=180;
}
返回正常化程度;
}

()

我想那会更容易些,我到现在为止没有这样做的唯一原因是因为我想避免一个很长的if-else语句和很多其他语句。但如果我不能解决我的raycast问题,我可能会那样做,所以谢谢。)
if(cube.rotation.x % 360 == 0)
{
    // upper face upwards
}
else if(cube.rotation.x % 360 == 90)
{
    // left face upwards
}