Math 有没有更快的方法来进行角度比较?

Math 有没有更快的方法来进行角度比较?,math,3d,geometry,culling,Math,3d,Geometry,Culling,在笛卡尔坐标系中有两个幺正向量p和Q。我需要一个非常快速的方法来知道两者之间的夹角是否小于某个量a。我能想到的最好办法是: if(acos(dot(P, Q)) < A) cull(); else draw(); 角度越大,其余弦越小。这是一个剔除算法。如果角度小于A(视野外),则不会绘制对象,因此,可以接受少量的假阴性(我偶尔可以向GPU发送视野外的内容),但假阳性不是(我无法避免渲染视野内的内容) 最快的方法是什么?我能比现在做得更好吗 当然,如果A是一个定义视场的常

在笛卡尔坐标系中有两个幺正向量
p
Q
。我需要一个非常快速的方法来知道两者之间的夹角是否小于某个量
a
。我能想到的最好办法是:

if(acos(dot(P, Q)) < A)
    cull();
else
    draw();
角度越大,其余弦越小。这是一个剔除算法。如果角度小于A(视野外),则不会绘制对象,因此,可以接受少量的假阴性(我偶尔可以向GPU发送视野外的内容),但假阳性不是(我无法避免渲染视野内的内容)


最快的方法是什么?我能比现在做得更好吗

当然,如果
A
是一个定义视场的常数,您可以预先计算其余弦并使用第二种方法,这将非常快?A不是常数。我的空间是球形的,A是物体半径与限制视野的每个“平面”半径的总和(总共5个)。球形空间中的“平面”是“大球体”。远剪裁平面是一个例外,因为它不是一个“大球体”,其半径较小。总结:对于场景中的每个对象,我有两个不同的
A
,如果对象大小改变,它们也会改变。你可以使用cos(A)的查找表,比如预先计算1˚和2˚等,然后使用
cosA=table[floor(A*180/pi)];如果(点(P,Q)>cosA).
。(或者可能是ceil(…))一个对象的大小究竟如何决定?对象是否会立即改变其大小?目前,场景中只有一个对象会增长。和
A=R-R
,其中
R
是对象边界球体的半径,R是限制球体的视野半径。但你可能会问:球体的半径与你所问问题中的角度有什么关系?我从问题中省略了这个解释,因为它很复杂而且似乎不相关,但简单地说,正如我之前所说,球体包含在一个球体空间中,因此那里的每一条“海峡”线(如半径)都是更大超球体上的一条弧。想想地球的子午线和热带:赤道半径是pi/2。
if(dot(P, Q) > cos(A))
    cull();
else
    draw();