1

我有一个立方体的 8 个顶点,它们只是索引。我想获得每个顶点在标准化立方体中的各自位置。在下图中,假设 +x 位于右侧,+y 位于上方,+z 位于屏幕外。(顶点 2、3、6 和 7 在前面,如果很难看到的话)。

多边形化

(忽略边缘索引)

这是我所拥有的:

for (int v = 0; v < 8; v++) {
    float x, y, z;

    if(v < 4)                                    y = -1;
    else                                         y = +1;
    if(v == 1 || v == 2 || v == 5 || v == 6)     x = +1;
    else                                         x = -1;
    if(v == 2 || v == 3 || v == 6 || v == 7)     z = +1;
    else                                         z = -1;
}

没有这么多逻辑 OR,有没有更合乎逻辑的方法来做到这一点?

4

2 回答 2

1

您可以使用查找表。LUT 往往非常有效,但有些人发现它们违反直觉。

for (int v = 0; v < 8; v++) {
    int[] lutX = new int[] {-1, -1, -1, -1, 1, 1, 1, 1};
    int[] lutY = new int[] {-1, -1, -1, -1, 1, 1, 1, 1};
    int[] lutZ = new int[] {-1, -1, 1, 1, -1, -1, 1, 1};
    float x = lutX[v];
    float y = lutY[v];
    float z = lutZ[v];
}

通常你应该在你的函数之外静态地声明它们。

您可以通过如下逻辑从基于 OR 的逻辑中推导出 LUT:

If for v==0, the OR-logic adds 1 to X, set lutX[0] to 1.
Else set lutX[0] to -1
于 2014-01-17T03:34:22.667 回答
0

这一个班轮怎么样:

float x = 2*((v/2)%2)-1, y = 2*(v/4)-1, z = 2*(v%2)-1;

测试代码:

static void Main(string[] args)
{
    Debug.Print("{0,3} {1,3},{2,3},{3,3}", "v", "x", "y", "z");
    for(int v=0; v<8; v++)
    {
        float x=2*((v/2)%2)-1, y=2*(v/4)-1, z=2*(v%2)-1;

        Debug.Print("{0,3} {1,3},{2,3},{3,3}", v, x, y, z);
    }
}

结果:

v   x,  y,  z
0  -1, -1, -1
1  -1, -1,  1
2   1, -1, -1
3   1, -1,  1
4  -1,  1, -1
5  -1,  1,  1
6   1,  1, -1
7   1,  1,  1
于 2014-01-17T18:07:16.847 回答