File: /projects/sage/sage-7.5/local/lib/python2.7/site-packages/sage/plot/plot3d/tachyon.py
Docstring :
Create a scene the can be rendered using the Tachyon ray tracer.
INPUT:
* "xres" - (default 350)
* "yres" - (default 350)
* "zoom" - (default 1.0)
* "antialiasing" - (default "False")
* "aspectratio" - (default 1.0)
* "raydepth" - (default 5)
* "camera_center" - (default (-3, 0, 0))
* "updir" - (default (0, 0, 1))
* "look_at" - (default (0,0,0))
* "viewdir" - (default "None"), otherwise list of three numbers
* "projection" - "'PERSPECTIVE'" (default), "'perspective_dof'"
or "'fisheye'".
* "frustum" - (default ''), otherwise list of four numbers. Only
used with projection='fisheye'.
* "focallength" - (default ''), otherwise a number. Only used
with projection='perspective_dof'.
* "aperture" - (default ''), otherwise a number. Only used with
projection='perspective_dof'.
OUTPUT: A Tachyon 3d scene.
Note that the coordinates are by default such that z is up,
positive y is to the {left} and x is toward you. This is not
oriented according to the right hand rule.
EXAMPLES: Spheres along the twisted cubic.
sage: t = Tachyon(xres=512,yres=512, camera_center=(3,0.3,0))
sage: t.light((4,3,2), 0.2, (1,1,1))
sage: t.texture('t0', ambient=0.1, diffuse=0.9, specular=0.5, opacity=1.0, color=(1.0,0,0))
sage: t.texture('t1', ambient=0.1, diffuse=0.9, specular=0.3, opacity=1.0, color=(0,1.0,0))
sage: t.texture('t2', ambient=0.2,diffuse=0.7, specular=0.5, opacity=0.7, color=(0,0,1.0))
sage: k=0
sage: for i in srange(-1,1,0.05):
....: k += 1
....: t.sphere((i,i^2-0.5,i^3), 0.1, 't%s'%(k%3))
sage: t.show()
Another twisted cubic, but with a white background, got by putting
infinite planes around the scene.
sage: t = Tachyon(xres=512,yres=512, camera_center=(3,0.3,0), raydepth=8)
sage: t.light((4,3,2), 0.2, (1,1,1))
sage: t.texture('t0', ambient=0.1, diffuse=0.9, specular=0.5, opacity=1.0, color=(1.0,0,0))
sage: t.texture('t1', ambient=0.1, diffuse=0.9, specular=0.3, opacity=1.0, color=(0,1.0,0))
sage: t.texture('t2', ambient=0.2,diffuse=0.7, specular=0.5, opacity=0.7, color=(0,0,1.0))
sage: t.texture('white', color=(1,1,1))
sage: t.plane((0,0,-1), (0,0,1), 'white')
sage: t.plane((0,-20,0), (0,1,0), 'white')
sage: t.plane((-20,0,0), (1,0,0), 'white')
sage: k=0
sage: for i in srange(-1,1,0.05):
....: k += 1
....: t.sphere((i,i^2 - 0.5,i^3), 0.1, 't%s'%(k%3))
....: t.cylinder((0,0,0), (0,0,1), 0.05,'t1')
sage: t.show()
Many random spheres:
sage: t = Tachyon(xres=512,yres=512, camera_center=(2,0.5,0.5), look_at=(0.5,0.5,0.5), raydepth=4)
sage: t.light((4,3,2), 0.2, (1,1,1))
sage: t.texture('t0', ambient=0.1, diffuse=0.9, specular=0.5, opacity=1.0, color=(1.0,0,0))
sage: t.texture('t1', ambient=0.1, diffuse=0.9, specular=0.3, opacity=1.0, color=(0,1.0,0))
sage: t.texture('t2', ambient=0.2, diffuse=0.7, specular=0.5, opacity=0.7, color=(0,0,1.0))
sage: k=0
sage: for i in range(100):
....: k += 1
....: t.sphere((random(),random(), random()), random()/10, 't%s'%(k%3))
sage: t.show()
Points on an elliptic curve, their height indicated by their height
above the axis:
sage: t = Tachyon(camera_center=(5,2,2), look_at=(0,1,0))
sage: t.light((10,3,2), 0.2, (1,1,1))
sage: t.texture('t0', ambient=0.1, diffuse=0.9, specular=0.5, opacity=1.0, color=(1,0,0))
sage: t.texture('t1', ambient=0.1, diffuse=0.9, specular=0.5, opacity=1.0, color=(0,1,0))
sage: t.texture('t2', ambient=0.1, diffuse=0.9, specular=0.5, opacity=1.0, color=(0,0,1))
sage: E = EllipticCurve('37a')
sage: P = E([0,0])
sage: Q = P
sage: n = 100
sage: for i in range(n):
....: Q = Q + P
....: t.sphere((Q[1], Q[0], ZZ(i)/n), 0.1, 't%s'%(i%3))
sage: t.show()
A beautiful picture of rational points on a rank 1 elliptic curve.
sage: t = Tachyon(xres=1000, yres=800, camera_center=(2,7,4), look_at=(2,0,0), raydepth=4)
sage: t.light((10,3,2), 1, (1,1,1))
sage: t.light((10,-3,2), 1, (1,1,1))
sage: t.texture('black', color=(0,0,0))
sage: t.texture('red', color=(1,0,0))
sage: t.texture('grey', color=(.9,.9,.9))
sage: t.plane((0,0,0),(0,0,1),'grey')
sage: t.cylinder((0,0,0),(1,0,0),.01,'black')
sage: t.cylinder((0,0,0),(0,1,0),.01,'black')
sage: E = EllipticCurve('37a')
sage: P = E([0,0])
sage: Q = P
sage: n = 100
sage: for i in range(n):
....: Q = Q + P
....: c = i/n + .1
....: t.texture('r%s'%i,color=(float(i/n),0,0))
....: t.sphere((Q[0], -Q[1], .01), .04, 'r%s'%i)
sage: t.show()
A beautiful spiral.
sage: t = Tachyon(xres=800,yres=800, camera_center=(2,5,2), look_at=(2.5,0,0))
sage: t.light((0,0,100), 1, (1,1,1))
sage: t.texture('r', ambient=0.1, diffuse=0.9, specular=0.5, opacity=1.0, color=(1,0,0))
sage: for i in srange(0,50,0.1):
....: t.sphere((i/10,sin(i),cos(i)), 0.05, 'r')
sage: t.texture('white', color=(1,1,1), opacity=1, specular=1, diffuse=1)
sage: t.plane((0,0,-100), (0,0,-100), 'white')
sage: t.show()
If the optional parameter "viewdir" is not set, the camera center
should not coincide with the point which is looked at (see
https://trac.sagemath.org/7232):
sage: t = Tachyon(xres=80,yres=80, camera_center=(2,5,2), look_at=(2,5,2))
Traceback (most recent call last):
...
ValueError: camera_center and look_at coincide
Use of a fisheye lens perspective.
sage: T = Tachyon(xres=800, yres=600, camera_center=(-1.5,-1.5,.3), projection='fisheye', frustum=(-1.0, 1.0, -1.0, 1.0))
sage: T.texture('t1', color=(0,0,1))
sage: cedges = [[[1, 1, 1], [-1, 1, 1]], [[1, 1, 1], [1, -1, 1]],
....: [[1, 1, 1], [1, 1, -1]], [[-1, 1, 1], [-1, -1, 1]], [[-1, 1, 1],
....: [-1, 1, -1]], [[1, -1, 1], [-1, -1, 1]], [[1, -1, 1],
....: [1, -1, -1]],
....: [[-1, -1, 1], [-1, -1, -1]], [[1, 1, -1], [-1, 1, -1]],
....: [[1, 1, -1], [1, -1, -1]], [[-1, 1, -1], [-1, -1, -1]],
....: [[1, -1, -1], [-1, -1, -1]]]
sage: for ed in cedges:
....: T.fcylinder(ed[0], ed[1], .05, 't1')
sage: T.light((-4,-4,4), .1, (1,1,1))
sage: T.show()
Use of the "projection='perspective_dof'" option. This may not be
implemented correctly.
sage: T = Tachyon(xres=800,antialiasing=4, raydepth=10, projection='perspective_dof', focallength='1.0', aperture='.0025')
sage: T.light((0,5,7), 1.0, (1,1,1))
sage: T.texture('t1', opacity=1, specular=.3)
sage: T.texture('t2', opacity=1, specular=.3, color=(0,0,1))
sage: T.texture('t3', opacity=1, specular=1, color=(1,.8,1), diffuse=0.2)
sage: T.plane((0,0,-1), (0,0,1), 't3')
sage: ttlist = ['t1', 't2']
sage: tt = 't1'
sage: T.cylinder((0,0,.1), (1,1/3,0), .05, 't3')
sage: for q in srange(-3, 100, .15):
....: if tt == 't1':
....: tt = 't2'
....: else:
....: tt = 't1'
....: T.sphere((q, q/3+.3*sin(3*q), .1+.3*cos(3*q)), .1, tt)
sage: T.show()