2011-04-05 149 views
0

我想旋轉其Z軸上的3D對象(上/下)。3D數學/ 2D旋轉計算:分割/切割3D模型?

public void RotateY(float angle) 
{ 
    foreach (CoordinateVertices cv in this.GetAll<CoordinateVertices>()) 
    { 
     for (int i = 0; i < cv.Coordinates.Length; i++) 
     { 
      Vector3 old = cv.Coordinates[i]; 

      float theta = Math.Atan2(old.Y, old.X) + angle; 
      float rayon = Math.Sqrt(Math.Pow(old.X, 2) + Math.Pow(old.Y, 2)); 

      cv.Coordinates[i] = new Vector3(Math.Cos(theta) * rayon, Math.Sin(theta) * rayon, old.Z); 
     } 
    } 
} 

三角法相當簡單,它似乎工作正常,但由於某種原因,我的3D對象被削減了一半。

Comparison

有誰知道發生了什麼事情的想法?我會在數學StackExchange上發佈這個,但這也可能是我編程時遇到的一個問題,三角函數非常簡單。

+0

注意:在我看來,一半的座標輸出爲0,但我不知道爲什麼。 – Lazlo 2011-04-05 02:03:42

回答

0

其實,這個錯誤消失,無章可循。我繼續測試一些更多的價值觀,並且他們工作。我回到以前的相同價值,它的工作。這很荒謬,它總是發生在我身上。

這是什麼名字?自己消失的錯誤。

+1

http://www.catb.org/jargon/html/H/heisenbug.html – 2011-04-05 02:15:56

+0

@Tom Zych:不是。當你不學習時,海森堡會回來。 – Lazlo 2011-04-05 02:19:24

+1

我喜歡說這是一個「月相」的錯誤。 – 2011-04-05 02:20:40

1

編輯:以下是與上述相同的替代方法。我花了幾分鐘才意識到以下解決方案與最初發布的代碼相同。

它應該是這樣的:

double Xnew = X * cos(theta) + Y * sin(theta); 
double Ynew = Y * cos(theta) - X * sin(theta); 

或者在你的代碼:

public void RotateY(float angle) 
{ 
    foreach (CoordinateVertices cv in this.GetAll<CoordinateVertices>()) 
    { 
     for (int i = 0; i < cv.Coordinates.Length; i++) 
     { 
      Vector3 old = cv.Coordinates[i]; 
      float xnew = old.X * Math.Cos(angle) + old.Y * Math.Sin(angle); 
      float ynew = old.Y * Math.Cos(angle) - old.X * Math.Sin(angle); 

      cv.Coordinates[i] = new Vector3(xnew, ynew, old.Z); 
     } 
    } 
} 

上面的代碼假設你繞原點。如果你沒有圍繞原點旋轉,你只需要翻譯成原點,旋轉,然後迴轉。

在這裏看到更多的細節:http://en.wikipedia.org/wiki/Transformation_matrix#Rotation

+0

其實我是這樣做的,因爲它現在起作用了。但謝謝你的嘗試。 – Lazlo 2011-04-05 02:14:32

+0

是的,當我盯着它幾分鐘後,我才意識到。花了我一段時間才意識到它和上面的代碼完全一樣。 – 2011-04-05 02:15:57

+1

是的,這只是一個翻譯極地,然後回來(只圍繞z軸)。奇怪的是,它一開始並不工作,但。我懷疑程序中的其他地方存在一個錯誤。 – 2011-04-05 02:18:02

1

如前所述,您的代碼沒有問題。但是,您可能也有興趣使用Transform函數(它可以一次對整個座標數組進行操作)。 Vector3.Transform (Vector3[], Matrix)。你可以用一個rotation matrix來計算一個給定角度theta,關於任何軸的旋轉。我希望這對於大量的點來說要快得多。 (較少的trig計算,可能還有硬件加速)