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

时间:2015-03-14 21:27:41

标签: c# arrays unity3d unityscript

我正在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是预定值,点是Vector3[](数组)。棱镜的中心是点0,0,0(Unity中的Vector3(0,0,0))。

例如,使用以下值:

  • x = 1
  • y = 2
  • z = 3

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

  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)
  9. 我的问题:有没有办法生成这些点而不用实际硬编码?

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

    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

    非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

您可以使用嵌套的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();

可能有一种更简单,更清洁的方法,但确实有效。

答案 1 :(得分:1)

我不知道我的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);