This is the first assignment for which you will work in teams of two.
If you have trouble finding a partner, let us know as soon as possible.
The next assignment you will have to work with a *different* partner.

**2D & 3D curves (all cubic, both open and closed forms):**

- Bezier (4 control points)
- Catmull-Rom (any number of control points)
- uniform B-spline (any number of control points)

**3D curved surfaces:**

- Tensor product surface
- extrusion

Implement extrusions using a spine and a crosssection. Varying scale and rotation is extra credit (see below). Let the user choose the default orientation of the cross section between the Frenet frame and the world coordinate system. The Frenet frame is the coordinate system that "follows" the spine (it is given by the tangent to the curve, the curvature vector - that is, the derivative of the tangent, and their cross product). So, if no rotation is given and the default orientation is the Frenet frame, the crosssection should always be perpendicular to the spine. You may assume that the curvature never vanishes or inverts. (a necessary condition for this is that the spine should have C2 continuity) For extra credit, handle those cases gracefully.

Take a look at this webpage for an explanation of the VRML 2.0 Extrusion node. Note that the VRML extrusion uses piecewise linear specifications, while you will have to implement it using smooth continuous splines.

- surface of revolution

**User I/O**

You can write this program from scratch, extend your assignment 3 modeller,
or work from a simplified version of your modeller, which at least has
the following features:

- create, position, etc. sphere/cone/cube/cylinder
- read and display soIndexedFaceSet (if your modeller already could read and display an arbitrary Inventor file, then that's fine)

- switch between 2D and 3D mode (or have more windows)
- ability to create/move etc. 2D curve control points + feedback on coordinates (e.g. coordinates, show axes/grid...)
- the same for a 3D control grid (for a B-spline surface)
- the same for a 3D extrusion path and a 2D cross-section in 3D (for an extrusion)
- and finally, for a 2D curve and rotation axis in 3D (for a surface of revolution)

Put all created objects in your scenegraph.

**Output**

Your program should be able to output to the screen and to an Inventor file.
You may use the Inventor NURBS classes to render to the screen. You'll have to
compute the Bezier curve yourself though, using a recursive approach.
When writing to a file, the user has the option of writing all curved
surfaces as soIndexedFaceSets with a certain resolution.
Be sure to support general saving and loading (you may design your own
format). Also submit a file which shows off the curves your program can
create.

**Camera paths**

If your modeller didn't already have this feature, add it now: the user can
specify an arbritrary number of camera positions and orientations. Use the
positions as a control polyline to create a smooth camera path. Then the user
has two options: fly along this path, or save the animation to separate image
files. Make sure that the camera maintains constant speed along the path,
but start and end with zero speed (for example slowly accelerate in the first
second, and slowly deccelerate in the last).
Also allow the user to specify the total number of frames in the movie.

- the names of you and your partner (you can run submit from either account)
- how you implemented the Bezier curve
- how your program computes indexed facesets for the various surfaces
- how you implemented the camera path routines
- features you did not implement
- an explanations of extra features

- the Angel book, chapter 9, "Curves and surfaces"
- the Inventor Mentor, chapter 8, "Curves and surfaces"
- the lecture notes of lecture 9, "Curves"
- lecture 10 notes, "Surfaces"

Feature | Value |
---|---|

The winning digit "4" for the art contest | 2 points (!) |

Some predefined shapes. Have at least a paraboloid, hyperboloid (saddle), and torus | 1 point |

Multiple Bezier segments patched together, allow the user to specify C0, G1 or C1 continuity | 1 point |

Textures. Note that Inventor texturizes NURBS easily. You should create the texture coordinates for the tesselations. | 1 point |

When using Frenet frame for extrusions, gracefully handle cases where curvature vanishes or inverts. | 2 points |

Varying scale and rotation along an extrusion spine. Add the ability to edit 2D graphs specifying the amount of scaling and rotation along the spine. Specify the rotation using yaw, pitch and roll angles. | 2 points |

Be able to edit camera motion in a similar way to a full-fledged extrusion spine: 3D path, orientation (yaw,pitch,roll) relative to Frenet frame, zoom (instead of the extrusion scale), and velocity specified by splines | 2 point |

Objects with animation paths (same complexity as camera motion). | 1 point |

VRML 2.0 output, this time not using ivToVrml etc., but
by writing the VRML yourself. Use the Extrusion node for both extrusions and
surfaces of revolution. | 2 points |

Error bounded tesselation: the user specifies the maximum distance between the curve/surface and the tesselation. Please explain/prove in your writeup how you guarantee the error bound. | 3 points |

Nice looking seashells (see "Modeling seashells", Deborah R. Fowler, Hans Meinhardt, SIGGRAPH92, pp. 379-387) | 3 points |

CS426, CS Department, Princeton University Last modified: Sun Nov 15 13:23:07 EST 1998