NeHe的opengl教程delphi版(5)----3D

2008-04-09 04:27:07来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

在上节的内容上作些扩展,现在开始生成真正的3D对象,而不是象前两节中那样3D世界中的2D对象。我们给三角形增加一个左侧面,一个右侧面,一个后侧面来生成一个金字塔(四棱锥)。给正方形增加左、右、上、下及背面生成一个立方体。

我们混合金字塔上的颜色,创建一个平滑着色的对象。给立方体的每一面则来个不同的颜色。

Procedure glDraw();
Begin
glClear(GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
glLoadIdentity(); // 重置当前的模型观察矩阵

glTranslatef(-1.5, 0.0, -6.0); // 左移 1.5 单位,并移入屏幕 6.0

glRotatef(rtri, 0.0, 1.0, 0.0); // 绕Y轴旋转三角形


//下面的代码没有变化。在屏幕的左面画了一个彩色渐变三角形,并绕着Y轴从左向右旋转
glBegin(GL_TRIANGLES); // 绘制三角

{

有些人可能早已在上节课中的代码上尝试自行创建3D对象了。但经常有人来信问我:"我的对象怎么不会绕着其自身的轴旋转?看起来总是在满屏乱转。"要让您的对象绕自身的轴旋转,您必须让对象的中心坐标总是(0.0f,0,0f,0,0f)。
下面的代码创建一个绕者其中心轴旋转的金字塔。金字塔的上顶点离中心一个单位,底面离中心也是一个单位。上顶点在底面的投影位于底面的中心。

注意所有的面-三角形都是逆时针次序绘制的。这点十分重要,在以后的课程中我会作出解释。现在,您只需明白要么都逆时针,要么都顺时针,但永远不要将两种次序混在一起,除非您有足够的理由必须这么做。

我们开始画金字塔的前侧面。因为所有的面都共享上顶点,我们将这点在所有的三角形中都设置为红色。底边上的两个顶点的颜色则是互斥的。前侧面的左下顶点是绿色的,右下顶点是蓝色的。这样相邻右侧面的左下顶点是蓝色的,右下顶点是绿色的。这样四边形的底面上的点的颜色都是间隔排列的。

}

glColor3f(1.0, 0.0, 0.0); // 红色
glVertex3f(0.0, 1.0, 0.0); // 三角形的上顶点 (前侧面)
glColor3f(0.0, 1.0, 0.0); // 绿色
glVertex3f(-1.0, -1.0, 1.0); // 三角形的左下顶点 (前侧面)
glColor3f(0.0, 0.0, 1.0); // 蓝色
glVertex3f(1.0, -1.0, 1.0); // 三角形的右下顶点 (前侧面)

{

现在绘制右侧面。注意其底边上的两个顶点的X坐标位于中心右侧的一个单位处。顶点则位于Y轴上的一单位处,且Z坐标正好处于底边的两顶点的Z坐标中心。右侧面从上顶点开始向外侧倾斜至底边上。
这次的左下顶点用蓝色绘制,以保持与前侧面的右下顶点的一致。蓝色将从这个角向金字塔的前侧面和右侧面扩展并与其他颜色混合。
还应注意到后面的三个侧面和前侧面处于同一个glBegin(GL_TRIANGLES) 和 glEnd()语句中间。因为我们是通过三角形来构造这个金字塔的。OpenGL知道每三个点构成一个三角形。当它画完一个三角形之后,如果还有余下的点出现,它就以为新的三角形要开始绘制了。OpenGL在这里并不会将四点画成一个四边形,而是假定新的三角形开始了。所以千万不要无意中增加任何多余的点。

}

glColor3f(1.0, 0.0, 0.0); // 红色
glVertex3f(0.0, 1.0, 0.0); // 三角形的上顶点 (右侧面)
glColor3f(0.0, 0.0, 1.0); // 蓝色
glVertex3f(1.0, -1.0, 1.0); // 三角形的左下顶点 (右侧面)
glColor3f(0.0, 1.0, 0.0); // 绿色
glVertex3f(1.0, -1.0, -1.0); // 三角形的右下顶点 (右侧面)

{现在是后侧面。再次切换颜色。左下顶点又回到绿色,因为后侧面与右侧面共享这个角。}

glColor3f(1.0, 0.0, 0.0); // 红色
glVertex3f(0.0, 1.0, 0.0); // 三角形的上顶点 (后侧面)
glColor3f(0.0, 1.0, 0.0); // 绿色
glVertex3f(1.0, -1.0, -1.0); // 三角形的左下顶点 (后侧面)
glColor3f(0.0, 0.0, 1.0); // 蓝色
glVertex3f(-1.0, -1.0, -1.0); // 三角形的右下顶点 (后侧面)

{最后画左侧面。又要切换颜色。左下顶点是蓝色,与后侧面的右下顶点相同。右下顶点是蓝色,与前侧面的左下顶点相同。
到这里金字塔就画完了}

glColor3f(1.0, 0.0, 0.0); // 红色
glVertex3f(0.0, 1.0, 0.0); // 三角形的上顶点 (左侧面)
glColor3f(0.0, 0.0, 1.0); // 蓝色
glVertex3f(-1.0, -1.0, -1.0); // 三角形的左下顶点 (左侧面)
glColor3f(0.0, 1.0, 0.0); // 绿色
glVertex3f(-1.0, -1.0, 1.0); // 三角形的右下顶点 (左侧面)
glEnd(); //金字塔绘制结束

{因为金字塔只绕着Y轴旋转,我们永远都看不见底面,因而没有必要添加底面。您觉得有经验了,尝试增加底面(正方形),并将金字塔绕X轴旋转来看看您是否作对了。确保底面四个顶点的颜色与侧面的颜色相匹配。}

{译者:这是我自己加的底面}

glBegin(GL_QUADS); // 绘制底面
glColor3f(0.6, 0.2, 2.0); //设置当前色为紫色
glColor3f(0.0, 1.0, 0.0); // 绿色
glVertex3f(-1.0, -1.0, 1.0); // 左上
glColor3f(0.0, 0.0, 1.0); // 蓝色
glVertex3f(1.0, -1.0, 1.0); // 右上
glColor3f(0.0, 1.0, 0.0); // 绿色
glVertex3f(1.0, -1.0, -1.0); // 左下
glColor3f(0.0, 0.0, 1.0); // 蓝色
glVertex3f(-1.0, -1.0, -1.0); // 右下
glEnd(); // 正方形绘制结束

glLoadIdentity(); // 重置模型观察矩阵
glTranslatef(1.5, 0.0, -6.0); // 右移1.5单位,并移入屏幕 6.0

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:打造Delphi中字符串的replace函数

下一篇:用Delphi创建COM 应用服务器(三, 已修改)