图元:四棱锥\立方体\扇形\带孔圆盘\圆柱体\球体
技术
PyOpenGL
run函数的运行框架
https://www.cnblogs.com/lusonixs/p/17038379.html
四棱锥
摆放方面
四棱锥放在左侧,可以看到一部分侧面。(摆放在正中可能就看不到了)
模型方面
因为看不到底面,就省略了底面的绘制。
代码(py)
def drawObject():
# 三角形
# 先移动到三角形的中心位置开始绘制
# 为了看到全貌,距离屏幕6个单位的地方绘制
# 四棱锥放在左侧,可以看到一部分侧面。(摆放在正中可能就看不到了)
glTranslatef(-1.5,0.0,-6.0)
glBegin(GL_TRIANGLES)
# 前侧面
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) # 三角形的右下顶点 (右侧面)
# 后侧面
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()
run(drawObject)
立方体
代码(py)
def drawObject():
# 立方体
# 先移动到立方体的中心位置开始绘制
# 为了看到全貌,距离屏幕6个单位的地方绘制
# 立方体放在右侧,可以看到一部分侧面。(摆放在正中可能就看不到了)
glTranslatef(1.5,0.0,-6.0)
glBegin(GL_QUADS)
# 顶面
glColor3f(0.0,1.0,0.0) # 颜色改为蓝色
glVertex3f( 1.0, 1.0,-1.0) # 四边形的右上顶点 (顶面)
glVertex3f(-1.0, 1.0,-1.0) # 四边形的左上顶点 (顶面)
glVertex3f(-1.0, 1.0, 1.0) # 四边形的左下顶点 (顶面)
glVertex3f( 1.0, 1.0, 1.0) # 四边形的右下顶点 (顶面)
# 底面
glColor3f(1.0,0.5,0.0) # 颜色改成橙色
glVertex3f( 1.0,-1.0, 1.0) # 四边形的右上顶点(底面)
glVertex3f(-1.0,-1.0, 1.0) # 四边形的左上顶点(底面)
glVertex3f(-1.0,-1.0,-1.0) # 四边形的左下顶点(底面)
glVertex3f( 1.0,-1.0,-1.0) # 四边形的右下顶点(底面)
# 前面
glColor3f(1.0,0.0,0.0) # 颜色改成红色
glVertex3f( 1.0, 1.0, 1.0) # 四边形的右上顶点(前面)
glVertex3f(-1.0, 1.0, 1.0) # 四边形的左上顶点(前面)
glVertex3f(-1.0,-1.0, 1.0) # 四边形的左下顶点(前面)
glVertex3f( 1.0,-1.0, 1.0) # 四边形的右下顶点(前面)
# 后面
glColor3f(1.0,1.0,0.0) # 颜色改成黄色
glVertex3f( 1.0,-1.0,-1.0) # 四边形的右上顶点(后面)
glVertex3f(-1.0,-1.0,-1.0) # 四边形的左上顶点(后面)
glVertex3f(-1.0, 1.0,-1.0) # 四边形的左下顶点(后面)
glVertex3f( 1.0, 1.0,-1.0) # 四边形的右下顶点(后面)
# 左面
glColor3f(0.0,0.0,1.0) # 颜色改成蓝色
glVertex3f(-1.0, 1.0, 1.0) # 四边形的右上顶点(左面)
glVertex3f(-1.0, 1.0,-1.0) # 四边形的左上顶点(左面)
glVertex3f(-1.0,-1.0,-1.0) # 四边形的左下顶点(左面)
glVertex3f(-1.0,-1.0, 1.0) # 四边形的右下顶点(左面)
# 右面
glColor3f(1.0,0.0,1.0) # 颜色改成紫罗兰色
glVertex3f( 1.0, 1.0,-1.0) # 四边形的右上顶点(右面)
glVertex3f( 1.0, 1.0, 1.0) # 四边形的左上顶点(右面)
glVertex3f( 1.0,-1.0, 1.0) # 四边形的左下顶点(右面)
glVertex3f( 1.0,-1.0,-1.0) # 四边形的右下顶点(右面)
glEnd()
run(drawObject)
扇形
特点
* 没有厚度。
* 圆盘位于X0Y平面。
代码(py)
p1=0
p2=0.01
part1=0
part2=0
def DrawCylinder():
global p1,p2,part1,part2
part1+=p1
part2+=p2
if part1>359:
p1=0
part1=0
p2=0.01
part2=0
if part2>359:
p1=0.01
p2=0
glTranslatef(0.0, 0.0, -5.0)
Q=gluNewQuadric()
glColor3f(1.0, 1.0, 1.0) # 白色的圆锥体
gluPartialDisk(Q,0.5,1.5,32,32,part1,part2-part1)
gluDeleteQuadric( Q )
run(DrawCylinder)
带孔圆盘 绕Y轴旋转
创建一个CD样子的带孔圆盘。
特点
* 没有厚度。
* 圆盘位于X0Y平面。
代码(py)
rtri=0
def DrawDisk():
global rtri
glTranslatef(0.0, 0.0, -5.0)
Q=gluNewQuadric()
glRotatef(rtri,0.0,1.0,0.0)
glColor3f(1.0, 1.0, 1.0) # 白色的圆柱体
gluDisk(Q,0.5,1.5,32,32)
gluDeleteQuadric( Q )
rtri+=0.02
run(DrawDisk)
圆柱体 绕Y轴旋转
特点
* 没有顶面和底面。
* 圆柱体底面默认为X0Y平面。
* 圆柱体顶面默认向Z轴正方向延伸。
代码(py)
rtri=0
def DrawCylinder():
global rtri
glTranslatef(0.0, 0.0, -5.0)
Q=gluNewQuadric()
glRotatef(rtri,0.0,1.0,0.0)
glColor3f(1.0, 1.0, 1.0) # 白色的圆柱体
gluCylinder(Q,1.0,1.0,3.0,32,32)
gluDeleteQuadric( Q )
rtri+=0.02
run(DrawCylinder)
二次曲面:球体
二次曲面绘制的球,包括两层纹理,一层是球的纹理,一层是高光纹理,高光纹理以40%的透明度混合而成。
代码(py)
ballr=0.17
def DrawBall():
glTranslatef(0.0, 0.0, -5.0)
Q=gluNewQuadric()
gluQuadricNormals(Q, GL_SMOOTH)
gluQuadricTexture(Q, GL_TRUE)
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP)
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP)
glColor3f(1.0, 1.0, 1.0) # 白色的球
glBindTexture( GL_TEXTURE_2D, LoadTextures('Ball.bmp') ) # 球的纹理贴图
global ballr
gluSphere(Q, ballr*2, 32, 32)
glBindTexture( GL_TEXTURE_2D, LoadTextures('Envroll.bmp') ) # 设置为环境纹理
glColor4f(1.0, 1.0, 1.0, 0.4) # 使用alpha为40%的白色
glEnable(GL_BLEND) # 启用混合
glBlendFunc(GL_SRC_ALPHA, GL_ONE) # 把原颜色的40%与目标颜色混合
glEnable(GL_TEXTURE_GEN_S)
glEnable(GL_TEXTURE_GEN_T)
gluSphere(Q, ballr*2, 32, 32) # 绘制球体,并混合
glDisable(GL_TEXTURE_GEN_S)
glDisable(GL_TEXTURE_GEN_T)
glDisable(GL_BLEND)
gluDeleteQuadric( Q )
run(DrawBall)