javascript - 如何计算两点之间的 3D Angular ?

标签 javascript algorithm geometry

假设我有两个顶点,我想知道这两个顶点之间的 3D Angular 。所谓 3D Angular ,是指在每个三维平面上一个顶点与另一个顶点之间的 Angular ,存储为

{ x, y, z }

function getAngleBetweenVertices(vert1, vert2){
  return {
    x: 0, // ?
    y: 0, // ?
    z: 0  // ?
  }
}

// Classes

class Vertex {
  constructor(position){
    this.position = {
      x: 0,
      y: 0,
      z: 0,
      ...position
    };
  }
}

// Init

let vert1 = new Vertex({ x: 1, y: 0, z: 1 });
let vert2 = new Vertex({ x: 0, y: 1, z: 1 });
let angle = getAngleBetweenVertices(vert1, vert2);
console.log("angle ", angle);

enter image description here

例如,在上图中,我追踪了连接三 Angular 形上两个顶点的线段。应该可以求出x、y、z轴上两个顶点位置的夹 Angular 。

如何计算两个顶点之间的三维 Angular ?

最佳答案

你可以像这样在两个方向 v1,v2(向量)之间设置 Angular :

ang = acos(dot(v1,v2)/(|v1|.|v2|))

3D 中转换为:

ang = acos( (x1*x2 + y1*y2 + z1*z2) / sqrt( (x1*x1 + y1*y1 + z1*z1)*(x2*x2+y2*y2+z2*z2) ) )

但是你不能在两点之间有 Angular ,这根本没有意义。还要注意 3D Angular 不是您认为的那样(它的 Angular 以球面度为单位,您可以将其视为体积覆盖……法线 Angular 是区域覆盖),是的,它也是标量值。所以你正在寻找的是方向余弦欧拉 Angular (你需要更多信息和变换顺序而不是雄心勃勃)或transform matrices .

但我怀疑这是一个 XY 问题,根据您的评论我是对的。

所以您的真正的问题(基于评论)是从(三 Angular 形)面找到反射光线。使用 Angular (方向余弦、欧拉 Angular 或变换矩阵)是一个非常糟糕的主意,因为那样会非常慢。而是使用简单的向量数学,我是这样看的:

reflect

所以你得到了光线方向 dir 并且想要反射的一个 dir' 从具有正常 nor 的面所以:

dir' = 2 * ( nor*dot(-dir,nor) + dir ) - dir
dir' = 2 * ( -nor*dot(dir,nor) + dir ) - dir
dir' = -2*nor*dot(dir,nor) + 2*dir - dir
dir' = -2*nor*dot(dir,nor) + dir
dir' = dir-2*nor*dot(dir,nor)

所以在 3D 中是:

dir=(dx,dy,dz)
nor=(nx,ny,nz)
t = 2*(dx*nx + dy*ny + dz*nz) // 2*dot(dir,nor)
dx' = dx-t*nx
dy' = dy-t*ny
dz' = dz-t*nz

如您所见,不需要任何测 Angular 学或 Angular ...如果法线点在面/物体内或外也无关紧要 dot 自行处理标志...

如果你需要法线可以通过它的两条边的叉积来计算,所以如果三 Angular 形是由 v0,v1,v2 点定义的,那么:

nor = cross( v1-v0 , v2-v1 )

这是我将此技术用于光线追踪器的示例:

我的 GLSL 光线追踪器支持三 Angular 形面上的反射,它里面没有测 Angular ...在片段着色器中寻找 //reflect 注释,特别是寻找:

ray[rays].dir=ray[rays].dir-(2.0*t*ray[rays].nor);

它的反射在哪里

t=dot(ray[i0].dir,ray[i0].nor);

其中 dir 是光线方向,nor 是面法向(看起来很眼熟?是的,它是同一个方程)...

关于javascript - 如何计算两点之间的 3D Angular ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56536575/

相关文章:

javascript - AngularJS 的路由问题

javascript - 如何等待少数 HTTP promise 完成并仅在所有 promise 都失败时才显示模式

c++ - 由于它们的大 O 复杂性,两个函数没有花费我预期的时间,谁能解释为什么?

用于计算任意多面体的表面积和体积的Python库

javascript - 递归添加数组中点之间的中点

javascript - 在 ajax 调用后使用点击不起作用

algorithm - 计算一个循环中的排列数

C# 字符串排列

javascript - 给定正多边形的一条边,找出剩余的边

javascript - 根据屏幕大小和父 div 位置定位子 div