我正在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)
)。
例如,使用以下值:
生成的点数应如下(顺序无关紧要):
我的问题:有没有办法生成这些点而不用实际硬编码?
我目前所需解决方案的代码是:
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
。
非常感谢任何帮助。
答案 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);