从顶点位置以编程方式创建 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)
)。
例如,使用以下值:
- x = 1
- y = 2
- z = 3
生成的点数应该如下(顺序无关紧要):
- (1,2,3)
- (1,2,-3)
- (1,-2,3)
- (1,-2,-3)
- (-1,2,3)
- (-1,2,-3)
- (-1,-2,3)
- (-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);
我正在使用 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)
)。
例如,使用以下值:
- x = 1
- y = 2
- z = 3
生成的点数应该如下(顺序无关紧要):
- (1,2,3)
- (1,2,-3)
- (1,-2,3)
- (1,-2,-3)
- (-1,2,3)
- (-1,2,-3)
- (-1,-2,3)
- (-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);