首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Three.js:通过球面上的点构造切平面

Three.js:通过球面上的点构造切平面
EN

Stack Overflow用户
提问于 2021-07-26 09:37:26
回答 1查看 361关注 0票数 0

我试图在一个球面上建立一个切平面,这个切平面在Three.js (v0.129)中穿过球体表面上的特定点。我的算法如下:

  1. 求球心;
  2. 求出与给定点相交的半径向量;
  3. 求半径矢量与法向量之乘积
  4. ,因为两个向量的乘积应是垂直于两个矢量的向量;
  5. 求乘积向量和法线向量的端点,并通过这些点构造平面--这应该是切平面。H 210G 211

但由于某种原因,乘积并不总是垂直于半径和法向量。我不明白为什么,我试着为所有的向量建立线来可视化它,我得到了以下信息:

问题是我做错了什么?还是有更好的方法通过给定的点构造切平面到球面?

我的代码如下:

代码语言:javascript
复制
const createTangentPlane = (point: THREE.Vector3, sphere: Entity) => {
sphere.object3D.updateMatrixWorld();

sphere.object3D.updateMatrix();

const center = sphere.object3D.position;
const radiusVector = new THREE.Vector3().subVectors(point, center).normalize();
const radiusNormal = radiusVector
    .clone()
    .applyAxisAngle(new THREE.Vector3(0, 0, 1), Math.PI * 0.5)
    .normalize();
const a = radiusNormal.clone().normalize().setLength(10).add(point);
const b = radiusNormal.clone().normalize().negate().setLength(10).add(point);
const orthogonalVector = radiusVector.clone().cross(radiusNormal);
const a1 = orthogonalVector.clone().setLength(10).add(point);
const b1 = orthogonalVector.clone().negate().setLength(10).add(point);

createLine(([a1, b1]);
createLine([a, b]);
createLine([center, point]);

//createPlaneFrom4Points([a, a1, b1, b]);

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-26 13:35:17

给予:

  • three.js r130 (r129应该很好),
  • ,球体的位置,

  • ,球体表面的“切点”(假设它是Vector3)

)

假设:

球体位置在世界coordinates

  • The切点上,也在世界坐标

中。

代码语言:javascript
复制
let normal = new THREE.Vector3().copy( tangentPoint )
normal.sub( sphere.position ) // remove sphere translation

let plane = new THREE.Mesh(
  new THREE.PlaneGeometry( sphere.radius, sphere.radius )
  new THREE.MeshBasicMaterial( { color: 'red' } )
)
plane.lookAt( normal )
plane.position.copy( tangentPoint )
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68527609

复制
相关文章

相似问题

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