Sharedunits1819 / graphics / lectures / perspectivedemoshare.sagewsOpen in CoCalc
Author: Killian O'Brien
Views : 25
# Execute each group of commands by pressing Shift+Enter on the cells. # Click and drag the 3-d plots to view them from different angles.
# set up symbolic variables x, y, z (in fact we only need x really for using the implicit_plot3d command I think) var('x,y,z')
# set the distance of projection plane from origin and draw the projection plane (in blue) and the origin f=2 P=implicit_plot3d(z==f, (x, -3, 3), (y, -3,3), (z, -3,3),opacity=0.5) P+=point([0,0,0])
# Executing the command 'P' will show us the 3-D plot P show(P)
# define the vertices of a cube cube_verts=[[1,-1,5],[1,1,5],[-1,1,5],[-1,-1,5],[1,-1,7],[1,1,7],[-1,1,7],[-1,-1,7]]
cube_verts
# define the edges of the cube as pairs of vertex labels cube_edges=[[0,1],[1,2],[2,3],[3,0],[0,4],[1,5],[2,6],[3,7],[4,5],[5,6],[6,7],[7,4]] cube_edges
# add the edges of the cube to the plot P for edge in cube_edges: P+=line([cube_verts[edge[0]],cube_verts[edge[1]]],color='black')
# show the plot P P.show()
# apply the perspective projection transformation to the vertices of the cube # storing the resulting vertices in a new array proj_cube_verts proj_cube_verts=[] for vertex in cube_verts: proj_vertex=[f*vertex[0]/vertex[2], f*vertex[1]/vertex[2],f] proj_cube_verts.append(proj_vertex)
# confirm that the projected vertices look right proj_cube_verts
# add the lines edges joining the projected vertices to the 3-d plot in green for edge in cube_edges: P+=line([proj_cube_verts[edge[0]],proj_cube_verts[edge[1]]],color='green')
# look at the resulting plot # An interesting experiment is to orient the 3-d plot so that the z-axis is going 'into' the screen. # Then zoom into the plot (use mouse wheel) keeping the origin in the middle of the diagram. # Eventually the origin will 'disappear', i.e. you will have just moved past it. At this precise moment # your 'eye' is at the origin. You will notice that the green perspective projection of the real cube exactly lines up # with the real cube visible through the transparent projection plane. P
# creates a second set of cube vertices by translating the original ones 3 units # in the x direction and 1 in the y direction. Store the results in a new array trans_cube_verts trans_cube_verts=[] for vertex in cube_verts: trans_vertex=[vertex[0]+3, vertex[1]+1,vertex[2]] trans_cube_verts.append(trans_vertex)
trans_cube_verts
# add the edges of the new translated cube to P for edge in cube_edges: P+=line([trans_cube_verts[edge[0]],trans_cube_verts[edge[1]]],color='black')
# You should now see two cubes in the plot P
# Apply the perspective projection to this new cube proj_trans_cube_verts=[] for vertex in trans_cube_verts: proj_vertex=[f*vertex[0]/vertex[2], f*vertex[1]/vertex[2],f] proj_trans_cube_verts.append(proj_vertex)
# Add the projected edges of the second cube, in red for edge in cube_edges: P+=line([proj_trans_cube_verts[edge[0]],proj_trans_cube_verts[edge[1]]],color='red')
P
# Add all the projector lines to P for vertex in cube_verts: P+=line([[0,0,0],vertex],color='green') for vertex in trans_cube_verts: P+=line([[0,0,0],vertex],color='red')
show(P,spin=true)
if 2>1 and 4> 3: print('yes')