所以我有一个系统,可以在一个位置上保存一组项目。群集存储在数组中,如下所示:
int[,,] = int[length, width, height];
长度,宽度和高度都可以根据群集而有所不同。如果我想用一组度数(范围从0到360)旋转整个集群:
double rX, double rZ, double rY
如何确定每个项目的新位置并在新阵列中导出?
我的破坏尝试都是这样开始的:
int iX = Math.Abs(rX / 90), iZ = Math.Abs(rZ / 90), iY = Math.Abs(rY / 90);
if (iY == 1) // 90 or -90 degrees
{
group.Length = (rY / 90) * back.Width;
group.Width = (rY / 90) * back.Length;
}
else if (iY == 2) // 180 degrees
{
group.Length *= -1;
group.Width *= -1;
}
if (iZ == 1) // 90 or -90 degrees
{
group.Length = (rZ / 90) * back.Height;
group.Height = (rZ / 90) * back.Length;
}
else if (iZ == 2) // 180 degrees
{
group.Length *= -1;
group.Height *= -1;
}
if (iX == 1) // 90 or -90 degrees
{
group.Width = (rX / 90) * back.Height;
group.Height = (rX / 90) * back.Width;
}
else if (iX == 2) // 180 degrees
{
group.Width *= -1;
group.Height *= -1;
}
for(int gX = 0; gX < group.Length; gX++)
{
for (int gZ = 0; gZ < group.Width; gZ++)
{
for (int gY = 0; gY < group.Height; gY++)
{
//I lose track here.
}
}
}
从那里我不知道去哪里。 group
是我正在尝试轮播的群集,back
是这些操作之前group
的副本。此群集中的数组如下所示:
Cluster.Items[,,]
它的尺寸设置为group
的尺寸。该阵列基于X(长度)Z(宽度)Y(高度)轴。
我猜这个答案与矩阵和翻转某个轴有关。
答案 0 :(得分:0)
您需要一个旋转矩阵。
旋转矩阵是一个矩阵,当与矢量相乘时,将导致该矢量的旋转。
有三种类型的旋转矩阵
围绕x轴旋转
Rx(a) = [ 1 0 0 0,
0 cos(a) -sin(a) 0,
0 sin(a) cos(a) 0,
0 0 0 1]
围绕y轴
Ry(a) = [ cos(a) 0 sin(a) 0,
0 1 0 0,
-sin(a) 0 cos(a) 0,
0 0 0 1]
围绕z轴旋转
Rz(a) = [ cos(a) -sin(a) 0 0,
sin(a) cos(y) 0 0,
0 0 1 0,
0 0 0 0]
有关旋转矩阵的更多数学,您会发现here
答案 1 :(得分:0)
我仍然不相信你的数据结构。但是,让我回答你的问题。
首先,指定旋转顺序。在下面,我假设顺序x,z,y。然后,找到相应的旋转矩阵(例如,来自here)。然后,将位置向量与矩阵相乘以得到新向量。
如果旧矢量的坐标为x, y, z
,那么新矢量的x坐标将是(矩阵的第一行):
newX = x * cos(rZ) * cos(rY) - y * sin(rZ) + z * cos(rZ) * sin(rY)
因此,行中的第一个条目乘以x
,第二个条目乘以y
,依此类推。无论你做什么,都要插入正确的角度。
由于对于90°的倍数,余弦和正弦总是-1,0或1,因此可以改进相应的计算,不使用实际的正弦和余弦函数。