从顶点位置以编程方式创建 3D 棱镜

Programmatically create a 3D prism from location of its vertices

我正在使用 Unity 4.6 开发一个项目。我想知道是否有一种简单的方法来以编程方式设置顶点位置。目前我的代码看起来像这样 (C#):

public void createPoints(float x, float y, float z) {
    point [0] = new Vector3 (x, y, z);
    point [1] = new Vector3 (x, y, -z);
    point [2] = new Vector3 (x, -y, z);
    point [3] = new Vector3 (x, -y, -z);
    point [4] = new Vector3 (-x, y, z);
    point [5] = new Vector3 (-x, y, -z);
    point [6] = new Vector3 (-x, -y, z);
    point [7] = new Vector3 (-x, -y, -z);
}

其中x、y、z是预定值,point是一个Vector3[](数组)。棱镜的中心是点0,0,0(在Unity中是Vector3(0,0,0))。

例如,使用以下值:

生成的点数应该如下(顺序无关紧要):

  1. (1,2,3)
  2. (1,2,-3)
  3. (1,-2,3)
  4. (1,-2,-3)
  5. (-1,2,3)
  6. (-1,2,-3)
  7. (-1,-2,3)
  8. (-1,-2,-3)

我的问题:有没有一种方法可以生成这些点而无需对其中的值进行实际硬编码?

我当前所需解决方案的代码是:

public void createPoints(float originalX, float originalY, float originalZ) {
    for (int i = 0; i < 8; i++) { //8 vertices exist of a rectangular prism
        point [i] = new Vector3 (x, y, z);
    }
}

如何更改此代码以生成这些正负点?我的猜测是 x、y 和 z 的正负值之间的某种交替,使用 i 的模数或将 i 的除法四舍五入除以其他整数,但是我无法理解我的大脑周围。 C# 或 UnityScript 都可以。

换句话说,在 for 循环的每次迭代中,x = -x,对于每个东西 y = -y,对于每个东西 z = -z

非常感谢任何帮助。

您可以像这样使用嵌套 for 循环来执行此操作:

List<Vector3> points = new List<Vector3>();

for (int i = 0; i < 2; i++)
    for (int j = 0; j < 2; j++)
        for (int k = 0; k < 2; k++)
            points.Add(new Vector3(i == 0 ? originalX : -originalX,
                                   j == 0 ? originalY : -originalY,
                                   k == 0 ? originalZ : -originalZ));

Vector3[] point = points.ToArray();

可能有一种更简单、更简洁的方法来执行此操作,但它确实有效。

我会为此使用 linq

var alt = new[] { 1, -1 };
var result = ( from i in alt
               from j in alt
               from k in alt
               select new Vector3(i * 1, j * 2, k * 3)
              ).ToList();

我不知道我的 Unity 语法是否正确,但这段代码应该可以修改才能在那里工作。基本上,它给你 8 个向量。 x 值是 x, -x, x, -x, ... y 值是 y, y, -y, -y, y, y, ... z 值是 z, z, z, z ,-z,-z,-z,-z。 这是通过乘以 -1 的偶次方和奇次方来完成的。

function createPoints(x, y, z) {
  var resp = [];
  for (var i = 0; i < 8; ++i) {
    var vect = new Vector3d(x * Math.pow(-1, i), y * Math.pow(-1, Math.floor(i / 2)), z * Math.pow(-1, Math.floor(i / 4)));
    resp.push(vect);
  }
  return resp;
}

createPoints(1,2,3);