我正在为DirectX应用程序制作一段代码。它的意思是不显示不可见的面孔。 Normaly它只是使用Z缓冲区,但我正在做很多移动和旋转的网格,所以我不想做它们并节省计算能力。我将在立方体上描述这个。你正从前面看,所以你只看到一张脸,你不需要旋转左边的5。如果你有100 * 100个网格的立方体的一面,那么不必转动你真正不需要的50k网格就好了。所以我存储了相机的X,Y,Z旋转(Z旋转我没有使用),还有X,Y,Z旋转的面。在这个简化的立方体中,我会看到使这个陈述成立的面:
cRot //camera rotation in degrees
oRot //face rotation in degrees
if(oRot.x > cRot.x-90 && oRot.x < cRot.x+90
&& oRot.y > cRot.y-90 && oRot.y < cRot.y+90)
但是出现了问题。如果我将旋转arround,相机可以达到值330为exapmple。在这种状态下,我会看到立方体的正面和右面。右侧有旋转270,因此在IF语句中是正确的。问题是正面旋转0度,也是360度。
所以我的问题是如何让这个语句起作用,因为当我使用modulo时,它会失败,因为它不会对0 = 360起作用。
答案 0 :(得分:1)
您的意思是检查oRot是否与cRot的差异至少为90度?
//integral
if ((360 + cRot - oRot) % 360 >= 90) ...
//floating point
diff = abs(cRot - oRot);
if (diff >= 90 && diff <= 270) ...
答案 1 :(得分:0)
要说我强烈建议不要进行此类优化。在现代GPU上,顶点缓冲区的流水线旋转比用于保存顶点缓冲区的CPU测试要快得多。