#! /usr/bin/env python # Rotate a 3D surface created using NURBS. # # Press left mouse button to toggle surface trimming. # Press ESC to quit. # # See the GL manual for an explanation of NURBS. from gl import * from GL import * from DEVICE import * TRUE = 1 FALSE = 0 ORDER = 4 idmat = [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1] surfknots = [-1, -1, -1, -1, 1, 1, 1, 1] def make_ctlpoints(): c = [] # ci = [] ci.append((-2.5, -3.7, 1.0)) ci.append((-1.5, -3.7, 3.0)) ci.append((1.5, -3.7, -2.5)) ci.append((2.5, -3.7, -0.75)) c.append(ci) # ci = [] ci.append((-2.5, -2.0, 3.0)) ci.append((-1.5, -2.0, 4.0)) ci.append((1.5, -2.0, -3.0)) ci.append((2.5, -2.0, 0.0)) c.append(ci) # ci = [] ci.append((-2.5, 2.0, 1.0)) ci.append((-1.5, 2.0, 0.0)) ci.append((1.5, 2.0, -1.0)) ci.append((2.5, 2.0, 2.0)) c.append(ci) # ci = [] ci.append((-2.5, 2.7, 1.25)) ci.append((-1.5, 2.7, 0.1)) ci.append((1.5, 2.7, -0.6)) ci.append((2.5, 2.7, 0.2)) c.append(ci) # return c ctlpoints = make_ctlpoints() trimknots = [0., 0., 0., 1., 1., 2., 2., 3., 3., 4., 4., 4.] def make_trimpoints(): c = [] c.append((1.0, 0.0, 1.0)) c.append((1.0, 1.0, 1.0)) c.append((0.0, 2.0, 2.0)) c.append((-1.0, 1.0, 1.0)) c.append((-1.0, 0.0, 1.0)) c.append((-1.0, -1.0, 1.0)) c.append((0.0, -2.0, 2.0)) c.append((1.0, -1.0, 1.0) ) c.append((1.0, 0.0, 1.0)) return c trimpoints = make_trimpoints() def main(): init_windows() setup_queue() make_lights() init_view() # set_scene() setnurbsproperty( N_ERRORCHECKING, 1.0 ) setnurbsproperty( N_PIXEL_TOLERANCE, 50.0 ) trim_flag = 0 draw_trim_surface(trim_flag) # while 1: while qtest(): dev, val = qread() if dev == ESCKEY: return elif dev == WINQUIT: dglclose(-1) # this for DGL only return elif dev == REDRAW: reshapeviewport() set_scene() draw_trim_surface(trim_flag) elif dev == LEFTMOUSE: if val: trim_flag = (not trim_flag) set_scene() draw_trim_surface(trim_flag) def init_windows(): foreground() #prefposition(0, 500, 0, 500) wid = winopen('nurbs') wintitle('NURBS Surface') doublebuffer() RGBmode() gconfig() lsetdepth(0x000, 0x7fffff) zbuffer( TRUE ) def setup_queue(): qdevice(ESCKEY) qdevice(REDRAW) qdevice(RIGHTMOUSE) qdevice(WINQUIT) qdevice(LEFTMOUSE) #trimming def init_view(): mmode(MPROJECTION) ortho( -4., 4., -4., 4., -4., 4. ) # mmode(MVIEWING) loadmatrix(idmat) # lmbind(MATERIAL, 1) def set_scene(): lmbind(MATERIAL, 0) RGBcolor(150,150,150) lmbind(MATERIAL, 1) clear() zclear() # rotate( 100, 'y' ) rotate( 100, 'z' ) def draw_trim_surface(trim_flag): bgnsurface() nurbssurface(surfknots, surfknots, ctlpoints, ORDER, ORDER, N_XYZ) if trim_flag: bgntrim() nurbscurve(trimknots, trimpoints, ORDER-1, N_STW) endtrim() endsurface() swapbuffers() def make_lights(): lmdef(DEFLMODEL,1,[]) lmdef(DEFLIGHT,1,[]) # # define material #1 # a = [] a = a + [EMISSION, 0.0, 0.0, 0.0] a = a + [AMBIENT, 0.1, 0.1, 0.1] a = a + [DIFFUSE, 0.6, 0.3, 0.3] a = a + [SPECULAR, 0.0, 0.6, 0.0] a = a + [SHININESS, 2.0] a = a + [LMNULL] lmdef(DEFMATERIAL, 1, a) # # turn on lighting # lmbind(LIGHT0, 1) lmbind(LMODEL, 1) main()