Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.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
Javascript 如何计算两个平面之间的角度?_Javascript_Math_3d_Three.js_Rotation - Fatal编程技术网

Javascript 如何计算两个平面之间的角度?

Javascript 如何计算两个平面之间的角度?,javascript,math,3d,three.js,rotation,Javascript,Math,3d,Three.js,Rotation,我有两个平面,如何计算它们之间的角度?是否也可以计算两个Object3D点之间的角度(如平面) 这里有一个小提琴的例子: const scene=new THREE.scene(); const-camera=新的3.PerspectiveCamera(45,window.innerWidth/window.innerHeight,11000); 摄像机。位置。设置(25,25,12); var材料=新的三网格基本材料({ 颜色:0x00fff0, 侧面:三个。双面 }); window.pl

我有两个平面,如何计算它们之间的角度?是否也可以计算两个Object3D点之间的角度(如平面)

这里有一个小提琴的例子:

const scene=new THREE.scene();
const-camera=新的3.PerspectiveCamera(45,window.innerWidth/window.innerHeight,11000);
摄像机。位置。设置(25,25,12);
var材料=新的三网格基本材料({
颜色:0x00fff0,
侧面:三个。双面
});
window.plane1=新的三个网格(新的三个平面几何体(10,10),材质);
场景。添加(平面1);
平面1.位置.设置(0.3,1,-2);
平面1.旋转.set(Math.PI/3,Math.PI/2,1);
window.plane2=新的三点网格(新的三点平面几何体(10,10),新的三点网格基本材质({
颜色:0x0fff00,
侧面:三个。双面
}));
场景。添加(平面2);
//安装支架
var pointLight=新的三点光源(0xFFFFFF);
点光源位置x=10;
点光源位置y=50;
点光源位置z=130;
场景.添加(点光源)
const renderer=new THREE.WebGLRenderer({
反别名:对
});
renderer.setSize(window.innerWidth、window.innerHeight);
渲染器.setClearColor(0x20252f);
renderer.setPixelRatio(window.devicePixelRatio);
document.body.appendChild(renderer.doElement);
const controls=新的三个.orbitControl(摄影机、渲染器.doElement);
制作动画();
//TODO:平面1和平面2之间的角度是多少?
函数animate(){
请求动画帧(动画);
render();
}
函数render(){
渲染器。渲染(场景、摄影机);
}

我建议以某种方式计算渲染的每个平面的法向量。一旦你有了这两个向量——比如说
n1
n2
——就很容易用点积计算平面之间的角度

如果您不熟悉点积,
dot(n1,n2)
其中
n1=(x1,y1,z1)
n2=(x2,y2,z2)
将等于
x1*x2+y1*y2+z1*z2
。还有另一个简单的恒等式,表示点(n1,n2)=v1 | | | | v2 | cos(a),其中
|
表示向量的大小,即
| v |=sqrt(x*x+y*y+z*z)
如果
v=(x,y,z)
,a是法线之间的角度,即平面之间的角度。这里是一个链接到一个

简而言之
a=arccos(点(n1,n2)/|n1 | | n2 |)

如果您有兴趣了解更多有关如何定义平面以及法向量表示的内容,请尝试查看


如果您知道
n1
n2
是,那么方程将进一步简化为
a=arccos(点(n1,n2))

我建议以某种方式计算渲染的每个平面的法向量。一旦你有了这两个向量——比如说
n1
n2
——就很容易用点积计算平面之间的角度

如果您不熟悉点积,
dot(n1,n2)
其中
n1=(x1,y1,z1)
n2=(x2,y2,z2)
将等于
x1*x2+y1*y2+z1*z2
。还有另一个简单的恒等式,表示点(n1,n2)=v1 | | | | v2 | cos(a),其中
|
表示向量的大小,即
| v |=sqrt(x*x+y*y+z*z)
如果
v=(x,y,z)
,a是法线之间的角度,即平面之间的角度。这里是一个链接到一个

简而言之
a=arccos(点(n1,n2)/|n1 | | n2 |)

如果您有兴趣了解更多有关如何定义平面以及法向量表示的内容,请尝试查看


如果您知道
n1
n2
是,那么方程将进一步简化为
a=arccos(点(n1,n2))

您希望找到两个3.js平面网格之间的角度

未旋转,a
3。平面几何图形
朝向正z轴。所以平面的法线指向正z轴的方向

因此,创建一个(0,0,1)向量,并对其应用与应用于平面网格相同的旋转

请注意,
plane.quaternion
在设置
plane.rotation
时会自动更新,因此您可以在计算中使用四元数,如下所示:

var vec1 = new THREE.Vector3( 0, 0, 1 ); // create once and reuse
var vec2 = new THREE.Vector3( 0, 0, 1 );

vec1.applyQuaternion( plane1.quaternion );
vec2.applyQuaternion( plane2.quaternion );

var angle = vec1.angleTo( vec2 ); // radians
如果平面是其他旋转对象的子对象,则问题会稍微复杂一些

当然,您可以使用
angleTo()
查找任意两个向量之间的角度


three.js r.86

您希望找到两个three.js平面网格之间的角度

未旋转,a
3。平面几何图形
朝向正z轴。所以平面的法线指向正z轴的方向

因此,创建一个(0,0,1)向量,并对其应用与应用于平面网格相同的旋转

请注意,
plane.quaternion
在设置
plane.rotation
时会自动更新,因此您可以在计算中使用四元数,如下所示:

var vec1 = new THREE.Vector3( 0, 0, 1 ); // create once and reuse
var vec2 = new THREE.Vector3( 0, 0, 1 );

vec1.applyQuaternion( plane1.quaternion );
vec2.applyQuaternion( plane2.quaternion );

var angle = vec1.angleTo( vec2 ); // radians
如果平面是其他旋转对象的子对象,则问题会稍微复杂一些

当然,您可以使用
angleTo()
查找任意两个向量之间的角度


three.js r.86

没有两点之间的角度这一术语。也许你的意思是其他的……没有两点之间的角度这样的术语。也许你指的是别的……太棒了!这个解决方案唯一的问题是角度是弧度(我有点期待)。所以我用
THREE.Math.radToDeg
转换了它们。下面是解决方案:太好了!这个解决方案唯一的问题是角度是弧度(我有点期待)。所以我用
THREE.Math.radToDeg
转换了它们。下面是解决方案: