首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算两个平面之间的角度?

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

Stack Overflow用户
提问于 2017-07-25 14:21:20
回答 2查看 2K关注 0票数 1

我有两个平面,如何计算它们之间的角度?在平面情况下,也可以计算出两个Object3D点之间的角度吗?

这里有一个小提琴示例:https://jsfiddle.net/rsu842v8/1/

代码语言:javascript
复制
  const scene = new THREE.Scene();
  const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000);
  camera.position.set(25, 25, 12);

  var material = new THREE.MeshBasicMaterial({
    color: 0x00fff0,
    side: THREE.DoubleSide
  });
  window.plane1 = new THREE.Mesh(new THREE.PlaneGeometry(10, 10), material);
  scene.add(plane1);

  plane1.position.set(0.3, 1, -2);
  plane1.rotation.set(Math.PI / 3, Math.PI / 2, 1);

  window.plane2 = new THREE.Mesh(new THREE.PlaneGeometry(10, 10), new THREE.MeshBasicMaterial({
    color: 0x0fff00,
    side: THREE.DoubleSide
  }));
  scene.add(plane2);


  // setup rest
  var pointLight = new THREE.PointLight(0xFFFFFF);
  pointLight.position.x = 10;
  pointLight.position.y = 50;
  pointLight.position.z = 130;
  scene.add(pointLight)

  const renderer = new THREE.WebGLRenderer({
    antialias: true
  });
  renderer.setSize(window.innerWidth, window.innerHeight);
  renderer.setClearColor(0x20252f);
  renderer.setPixelRatio(window.devicePixelRatio);
  document.body.appendChild(renderer.domElement);

  const controls = new THREE.OrbitControls(camera, renderer.domElement);

  animate();

  // TODO: What is the angle between plane1 and plane2?

  function animate() {
    requestAnimationFrame(animate);
    render();
  }

  function render() {
    renderer.render(scene, camera);
  }
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r82/three.js"></script>
<script src="https://yume.human-interactive.org/examples/buffer-geometry/OrbitControls.js"></script>

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-25 16:34:05

你想要找到两个three.js平面网格之间的角度。

未旋转的THREE.PlaneGeometry是面向正z轴的.平面的正z轴方向的法线点。

因此,创建一个( 0,0,1)向量,并将同样的旋转应用于平面网格。

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

代码语言:javascript
复制
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号

票数 7
EN

Stack Overflow用户

发布于 2017-07-25 15:05:05

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

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

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

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

如果您知道n1n2单位向量,那么方程就进一步简化为a = arccos(dot(n1,n2))

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45306101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档