2013-10-20 94 views
-3

我創建了一個有26個方塊的魔方(不是27,因爲你看不到中間的那個)。我正在嘗試旋轉立方體。我想過使用Pushstack Popstack,但我找不到任何可以看到的好例子。魔方旋轉

我想知道什麼是旋轉的好方法。我使用以下代碼中的26個來創建立方體

glBegin(GL_POLYGON); 
    //glColor3f( 1.0, 0.0, 1.0); 
    glColor3f( 1.0, 0.0, 0.0); 
    glVertex3f(1.5, -0.5, -0.5); 
    glVertex3f(1.5, 0.5, -0.5); 
    glVertex3f(1.5, 0.5, 0.5); 
    glVertex3f(1.5, -0.5, 0.5); 
    glEnd(); 
+0

沒有顯示你的一些代碼,你也可以去問一下_all-know,all-seeing Trash Heap_。 –

+0

什麼是你的數據結構(具體)?這決定了算法。 –

+0

@ThomasMatthews我編輯了最初的問題。另外任何其他方式,你會建議我創建立方體 – james456

回答

2

您的代碼會生成一個面,而不是整個多維數據集。但是你需要26個完整的小立方體才能正確渲染。否則,如果你旋轉一個立方體,會出現漏洞。

你可以做類似如下:

組織的大立方體爲3x3x3的網格。每個網格單元格包含一個小立方體。每個小立方體由其幾何數據及其旋轉信息組成。您可以將幾何數據存儲爲頂點緩衝區或顯示列表,或者作爲一種即時生成幾何圖形的方法。正如你所願。所以如果你還沒有任何旋轉,並且你渲染了純粹的幾何圖形,那麼你應該讓整個立方體完全對齊。

對於旋轉,對每個小立方體使用四元數是合理的。但是,您也可以使用矩陣,但這些處理起來有點棘手。實際上,我會爲每個立方體存儲兩個四元數。描述目標旋轉和描述當前旋轉的動畫(用於動畫目的)。在向目標旋轉更新當前旋轉時,可以這樣做:

interpolationVariable = c^timeStep //to allow a fluid and continuous animation. 
//c is usually between 0.99 and 1, depending on the desired animation smoothness 
currentRotation := interpolationVariable * currentRotation + (1 - interpolationVariable) * targetRotation 
currentRotation.normalize() 

這實際上是一個無限的調整。您應該爲currentRotationtargetRotation之間的差異設置一個閾值,以將currentRotation設置爲targetRotation,並且僅在currentRotation != targetRotation時更新。

現在我們將旋轉指定爲一個四元數。爲了渲染立方體,可以將四元數應用爲模型變換(在轉換爲矩陣之後)並渲染幾何。

要旋轉立方體切片,只需將旋轉變換應用於相應的立方體。例如。如果你想圍繞X軸旋轉:

quat = QuaternionRotation((1,0,0) /* axis */ , Pi/2 /* angle */) 
for each affected cube 
    cube.targetRotation = cube.targetRotation * quat 
next  
// Update the grid 

而切片將很好地旋轉到目標位置。如果你的幾何結構完好(原點附近),你不需要任何翻譯,因爲所有的旋轉都是圍繞原點(或者通過原點的軸)。

+0

我不是很熟悉quarternions。我可以使用push stack pop stack嗎? – james456

+0

單個堆棧不會幫助你,因爲每個小立方體都有不同的旋轉。在大多數圖書館中已經有了四元數的實現,所以你只需要使用它。 –