返回列表 发帖

[原创代码] [PyOpenGL]仿Vortex效果

本帖最后由 523066680 于 2016-9-24 15:41 编辑


这是一张网络图片,琢磨出了对应公式

直接贴代码了,备注:需要OpenGL模块
http://pypi.python.org/pypi/PyOpenGL
'''
    Torus_Vortex.py
    Code by 523066680, 2013-02-05
    paktcmail@gmail.com
    Imitate whirlpool effect
'''
from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import gluLookAt,gluPerspective
from math import cos,sin,pi
from time import sleep
import sys
PI2=pi*2.0
WIN_X=300
WIN_Y=300
ANG=0.0
ANGX=0.0
theVortex=0
winid=0
def vortex(R=20.0,r=12.0):
    ''' Torus_Vortex '''
    nparts=50
    mparts=28
    detail=float(mparts)/float(nparts)
    tm=0.0
   
    for m in range(mparts):
        m=float(m)
        c=float(m%2)
        glColor3f(c*0.5,c*0.8,c*1.0)
        glBegin(GL_QUAD_STRIP)
        move=0.0
        for n in range(nparts+1):
            n=float(n)
            move+=detail
            x=r*cos(n/nparts*PI2)
            y=r*sin(n/nparts*PI2)
            for o in (0.0,1.0):
                tm=o+m+move;
                mx=(x+R)*cos(tm/mparts*PI2)
                mz=(x+R)*sin(tm/mparts*PI2)
                glVertex3f(mx,y,mz)
        glEnd()
def init():
    global theVortex
    glClearColor(0.0,0.0,0.0,0.0)
    glEnable(GL_DEPTH_TEST)
    theVortex=glGenLists(1)
    glNewList(theVortex,GL_COMPILE)
    vortex(18.0,12.0)
    glEndList()
   
def display():
    global theVortex
    glClearColor(0.0,0.0,0.0,0.0)  
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
    glPushMatrix()
    glRotatef(ANGX,1.0,0.0,0.0)
    glRotatef(ANG,0.0,-1.0,0.0)
    glCallList(theVortex)
    glPopMatrix()
    glutSwapBuffers()
def idle():
    global ANG
    ANG+=1.0
    sleep(0.01)
    glutPostRedisplay()
def reshape(Width,Height):
    far=30.0
    if (Width==Height):
        glViewport(0,0,Width,Height)
    elif (Width>Height):
        glViewport(0,0,Height,Height)
    else:
        glViewport(0,0,Width,Width)
   
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    #glFrustum(-10.0,10.0,-10.0,10.0,3.0,60.0)
    gluPerspective(80.0,1.0,1.0,80.0)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    gluLookAt(0.0,0.0,far, 0.0,0.0,0.0, 0.0,1.0,far)
   
def hitkey(key,mousex,mousey):
    global winid,ANGX
    if (key=='q'):            
        glutDestroyWindow(winid)
        sys.exit()
    elif (key=='a'):
        ANGX+=1.0
def main():
    global WIN_X,WIN_Y,winid
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH)
    glutInitWindowSize(WIN_X,WIN_Y)
    glutInitWindowPosition(100,100)
    winid=glutCreateWindow("Vortex")
    init()
    glutDisplayFunc(display)
    glutIdleFunc(idle)
    glutReshapeFunc(reshape)
    glutKeyboardFunc(hitkey)
    glutMainLoop()
if __name__=="__main__":
    main()COPY
1

评分人数

[url=][/url]

按q退出,按a旋转X轴观察
[url=][/url]

TOP

本帖最后由 523066680 于 2016-9-24 16:26 编辑

回复 3# codegay


    噗。发廊……  不知道是不是版本区别,提示undefined function的话,可能还是缺少了什么模块
[url=][/url]

TOP

本帖最后由 523066680 于 2016-9-25 12:45 编辑

回复 5# yu2n

原本测试是python2.7(重新试了一次2.7版本运行没问题),
   看到两位执行都有错误提示就去装了python3.5,确实出错。找了两个帖子,都是说安装没问题,缺少相应的dll库,复制粘贴到运行目录即可,尝试了都不见效,遂放弃……

[CSDN]Python3.5.1与pyopengl3.1.0环境配置

[StackOverflow]Attempt to call an undefined function glutInit
[url=][/url]

TOP

本帖最后由 523066680 于 2016-9-26 00:38 编辑

回复 9# aa77dd@163.com

    相当佩服。似乎在搜索过程中也看到了一个非官方的安装包链接,但是没有去尝试。
在可以运行后,推荐安装 pyopengl-demo(主要是示例代码),找到目录并运行里面的Demo看看效果。

用Python折腾过OpenGL, 用Perl折腾过OpenGL,最后还是回到了C/C++,目前在学。
稍后对里面的函数做一些补充说明

该程序的C语言版以及环境配置
1

评分人数

[url=][/url]

TOP

本帖最后由 523066680 于 2016-9-26 21:52 编辑

回复 11# happy886rr


显示原理看两张外部观察图(该程序按 a 键可以旋转x轴,切换观察角度)
先一圈圈地组成一个圆环


然后再把每个圈绘制的时候的公式作修改 - 位置偏移,使其最终回到原点合并


最后把观察点放到圆环的内部,就是1楼的效果了。因为没开启光照和阴影计算,所以还少一个阴影效果。
要使图像变得更加圆润平滑,将
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH );
改为
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_MULTISAMPLE );
开启多重采样(一种抗锯齿方法),开启以后可以说是效果感人……

贝塞尔曲线可以改C版本,找个时间
[url=][/url]

TOP

本帖最后由 523066680 于 2016-9-27 13:24 编辑

回复 11# happy886rr

Bezier曲线C+OpenGL (固定管线) 版本
    http://www.code-by.org/viewtopic.php?f=43&t=109

2楼写了设计思路
1

评分人数

[url=][/url]

TOP

本帖最后由 523066680 于 2016-9-27 16:12 编辑

回复 14# happy886rr


    话说为啥不来我论坛聊这个~ (其实主要是做个补集,所以也没有开批处理版块(定位不同))
[url=][/url]

TOP

返回列表