簡體   English   中英

旋轉動態3D位置數組

[英]Rotating a dynamic 3D array of positions

所以我有一個系統,可以在位置上放置一簇物品。 群集存儲在數組中,如下所示:

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(高度)軸。

我猜答案與矩陣和翻轉特定軸有關。

您將需要一個旋轉矩陣。

旋轉矩陣是一個矩陣,當與向量相乘時,將導致該向量的旋轉。

旋轉矩陣有三種類型

繞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軸的ans旋轉

Rz(a) =  [ cos(a) -sin(a) 0 0,
           sin(a) cos(y)  0 0,
             0      0     1 0,
             0      0     0 0]

您將在此處找到有關旋轉矩陣的更多數學信息

我仍然不相信您的數據結構。 但是,讓我回答您的問題。

首先,指定旋轉順序。 在下文中,我假設順序為x,z,y。 然后,找到相應的旋轉矩陣(例如,從此處開始 )。 然后,將位置向量與矩陣相乘以獲得新向量。

如果舊向量的坐標為x, y, z ,則新向量的x坐標為(矩陣的第一行):

newX = x * cos(rZ) * cos(rY) - y * sin(rZ) + z * cos(rZ) * sin(rY)

因此,該行的第一個條目乘以x ,第二個條目乘以y ,依此類推。 插入正確的角度即可。

由於余弦和正弦對於90度的倍數始終為-1、0或1,因此可以改進相應的計算以不使用實際的正弦和余弦函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM