假设我有两个顶点,我想知道这两个顶点之间的 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);
例如,在上图中,我追踪了连接三 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 或变换矩阵)是一个非常糟糕的主意,因为那样会非常慢。而是使用简单的向量数学,我是这样看的:
所以你得到了光线方向 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/