2010-11-07 131 views

回答

4

爲了簡單起見,您可以強制至少一個點位於旋轉軸上。您可以通過對所有x值添加/減去相同的值以及對多邊形中的點的所有y值相同的值輕鬆完成此操作。它會保留原來的形狀。

其餘的並不那麼辛苦。選擇一個相當小的角度,比如一個或兩個角度,然後計算出多邊形頂點繞軸旋轉的座標。然後加入三角形扇形和三角形條。

圍繞一個軸旋轉一個點只是基本的畢達哥拉斯。在0度旋轉時,您的二維座標中的點數在第三維中爲0。

讓我們假設點在X和Y上,我們圍繞Y旋轉。原始的'X'座標表示斜邊。在1度的旋轉,我們有:

sin(1) = z/hypotenuse 
cos(1) = x/hypotenuse 

(假設基於度的三角函數)

要旋轉的點(X,Y)由角φT繞Y軸以產生3D點( x',y',z'):

y' = y 
x' = x * cos(T) 
z' = x * sin(T) 

因此,對於多邊形邊上的每個點,將產生一個以旋轉軸爲中心的360點圓。

現在使一個三維形狀像這樣:

  1. 通過使用您的中心點和旋轉點的第一陣列
  2. 對於每個連續的陣列創建GL「三角形扇」,使用創建一個三角形帶先前的陣列中的陣列中的點和點
  3. 光潔度由最後陣列

一個創建中心在中心點另一個三角形風扇和使用該分需要注意的是,通常,我使用的trig函數的種類以弧度測量角度,OpenGL使用度數。要度轉換爲弧度,其公式爲:

degrees = radians/pi * 180 
+0

感謝您的回答!這很簡單,很好解釋。 – Mahm00d 2010-11-13 10:15:21

+0

我的榮幸,@Flom – sje397 2010-11-13 11:35:21

0

如果你只是希望它的轉動,然後:

glRotatef(angle,0,1,0); 

將其旋轉繞Y軸。如果你想要一臺車牀,那麼這更加複雜。

+0

我的錯誤。通過旋轉我的意思是車牀。我將編輯該問題。 – Mahm00d 2010-11-07 09:13:26

1

本質上的策略是通過掃繞給定軸的用戶給出的輪廓,並生成一個串聯連接相鄰切片的三角形帶。

假設用戶已經在XZ平面中繪製了多邊形。此外,假設用戶打算圍繞Z軸(即線X = 0)進行掃掠以產生旋轉實體,並且該多邊形的一個邊緣位於該軸上(一旦有了這種簡化的情況,您就可以概括出來加工)。

對於足夠簡單的幾何圖形,可以將多邊形的周長視爲函數x = f(z),即假設每個Z值都有一個唯一的X值。當我們轉到3D時,這個函數變成r = f(z),也就是說,半徑在對象的長度上是唯一的。

現在,假設我們想用M「切片」來逼近每個跨越2 * Pi/M弧度的實體。我們還將使用N個「堆棧」(Z維度中的樣本)。對於每個這樣的切片,我們可以建立一個三角形條,將一個切片(i)上的點與切片(i + 1)上的點連接起來。下面是一些描述過程的僞代碼:

double dTheta = 2.0 * pi/M; 
double dZ = (zMax - zMin)/N; 

// Iterate over "slices" 
for (int i = 0; i < M; ++i) { 
    double theta = i * dTheta; 
    double theta_next = (i+1) * dTheta; 

    // Iterate over "stacks": 
    for (int j = 0; j <= N; ++j) { 
    double z = zMin + i * dZ; 

    // Get cross-sectional radius at this Z location from your 2D model (was the 
    // X coordinate in the 2D polygon): 
    double r = f(z); // See above definition 

    // Convert 2D to 3D by sweeping by angle represented by this slice: 
    double x = r * cos(theta); 
    double y = r * sin(theta); 

    // Get coordinates of next slice over so we can join them with a triangle strip: 
    double xNext = r * cos(theta_next); 
    double yNext = r * sin(theta_next); 

    // Add these two points to your triangle strip (heavy pseudocode): 
    strip.AddPoint(x, y, z); 
    strip.AddPoint(xNext, yNext, z); 
    } 
} 

這就是基本思想。正如sje697所說的,您可能需要添加端蓋以保持幾何體關閉(即,一個實體對象,而不是一個殼)。但這應該足以讓你走。這很容易被推廣到環形形狀(儘管在這種情況下你不會有一對一的r = f(z)函數)。