回答
爲了簡單起見,您可以強制至少一個點位於旋轉軸上。您可以通過對所有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點圓。
現在使一個三維形狀像這樣:
- 通過使用您的中心點和旋轉點的第一陣列
- 對於每個連續的陣列創建GL「三角形扇」,使用創建一個三角形帶先前的陣列中的陣列中的點和點
- 光潔度由最後陣列
一個創建中心在中心點另一個三角形風扇和使用該分需要注意的是,通常,我使用的trig函數的種類以弧度測量角度,OpenGL使用度數。要度轉換爲弧度,其公式爲:
degrees = radians/pi * 180
如果你只是希望它的轉動,然後:
glRotatef(angle,0,1,0);
將其旋轉繞Y軸。如果你想要一臺車牀,那麼這更加複雜。
我的錯誤。通過旋轉我的意思是車牀。我將編輯該問題。 – Mahm00d 2010-11-07 09:13:26
本質上的策略是通過掃繞給定軸的用戶給出的輪廓,並生成一個串聯連接相鄰切片的三角形帶。
假設用戶已經在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)函數)。
- 1. Opengl,2D靜止形狀,與移動攝像頭的3D場景
- 2. 如何在Three.js中將3D網格「拼合」爲2D形狀
- 3. 縮放3D形狀(OpenGL和C++)
- 4. 如何將3D形狀逼近網格?
- 5. 3D形狀分析工具
- 6. 使用java圖形API(2D/3D/OpenGL /等)的交互式圖形?
- 7. 如何在OpenGL中繪製2D不規則曲線形狀
- 8. 用於OpenGL中的2D和3D圖形操作的單一API
- 9. OpenGL - 繪製具有紋理的2D多邊形形狀
- 10. 當新形狀在加工時形成不規則形狀
- 11. 使用css將2D Logo變成3D嗎?
- 12. ios opengl es 2.0 2D + 3D組合
- 13. 從2D切換到3D時的OpenGL
- 14. 2D圖形使用OpenGL庫
- 15. 繪製2D七邊形OpenGL
- 16. 如何變換一個投影的3D矩形成2D軸線對齊矩形
- 17. Spinning 3D WebGL形狀
- 18. 如何將3D物體表面壓平成2D陣列?
- 19. 將3D添加到2D遊戲
- 20. 使用WebGL 3D形狀作爲2D帆布圖像
- 21. 如何在OpenGL中一起繪製2D和3D材質?
- 22. 將3D形狀拖動到Google Map上?
- 23. 如何將形狀拉伸成體積
- 24. C++將2D位圖轉換爲3D使用C++和OPENGL庫
- 25. 如何在Android上使用OpenGL渲染2D圖形/圖形?
- 26. 2D OpenGL場景變慢,出現大量重疊的形狀
- 27. 將3D點轉換爲2D
- 28. iPhone - 繪製2D形狀
- 29. 將3D形狀面與3D軌跡法線對齊
- 30. 映射一個3D矩形2D屏幕
感謝您的回答!這很簡單,很好解釋。 – Mahm00d 2010-11-13 10:15:21
我的榮幸,@Flom – sje397 2010-11-13 11:35:21