2010-11-07 128 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)函数)。