回答
为了简单起见,您可以强制至少一个点位于旋转轴上。您可以通过对所有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