Staging Area

SimplerJOGL is a wrapper for the JOGL API, designed for use in a high school classroom. The wrapper shields new programmers from some of the intricacies of OpenGL and JOGL (and Swing and AWT), while providing an entry point for delving deeper into all these subjects by exploring the wrapper itself.

This was originally written as a group of C++ classes when I was teaching at the Baylor School. I have since ported the idea (if not the exact specifics) of those classes to Java for my classes at St. Mark’s. This past semester, I started using SimplerJOGL by introducing the Logo-esque SimplerJOGL Drawing environment.

November 23rd, 2012

Posted In: Projects

Tags: , , , ,

This is actually a collaborative project between two colleagues (who are also my mother and my sister): a Latin grammar dictionary that is created by introductory students as they learn it. I still have my physical copy of this document.

The Birdbook

November 23rd, 2012

Posted In: Projects

Tags: , , , ,

Setting Up Blender

  1. Set Better Defaults
  2. Splitting (and Joining) Views

Basics of Working with Models

  1. Add and Remove Objects
  2. Move Objects with the Translate Manipulator
  3. Spin and Twist Objects with the Rotate Manipulator
  4. Make Objects Bigger and Smaller with the Scale Manipulator
  5. Save (and Reopen) Models

Working with Meta Shapes

  1. Overview of Working with Meta Shapes
  2. Convert a Meta Shape into a Mesh Object

Materials and Painting

  1. Basic Materials for Color and Shininess
  2. Diffuse, Specular and Ambient Lighting (Conceptual Background)
  3. Painting Colors on to a Model with Vertex Painting
  4. More Detailed Vertex Painting

Lights, Camera and Rendering Images

  1. Basics of Adjusting Lighting, Camera Angles and Rendering an Image
  2. Using Multiple, Colored Lights
  3. Using Ambient Lighting and Ambient Occlusion to Improve Image Quality


  1. Basic Keyframe Animation
  2. Rendering an Animation into a Movie

Building Armatures

These series of videos is also available as a playlist.

  1. Starting an Armature
  2. Adding Bones to Your Armature
  3. Continuing Your Armature From a “Butt” Joint
  4. Add Armature Bones in the Third Dimension
  5. Naming the Bones of the Armature
  6. Attach the Armature to a Mesh Model
  7. Creating Vertex Groups
  8. Multiple Vertex Groups

Duplicating Objects

  1. Using Animation (and DupliFrames) to Duplicate Objects
  2. Duplicating Objects Along a Specific (Complex) Path
  3. Converting DupliFrame Objects into Real Objects

Sculpting Mesh Objects

  1. Introduction to Sculpting Meshes

UV Textures

This series of videos is also available as a playlist.

  1. Unwrapping a Mesh Object into a UV Texture
  2. Using Seams to Modify (and Improve) UV Texture Shapes
  3. Exporting Your UV Texture as an Image File
  4. Editing the UV Texture in Photoshop
  5. Importing the UV Texture into Blender
  6. Using a UV Texture as an Object Material
  7. Editing an Existing UV Texture in Photoshop and Blender

June 6th, 2011

Posted In: Handouts

Tags: , , , , , , , ,

Making Things Run Smoothly

  • Make sure that you always insert pictures into your presentation using the Insert Picture command from the Insert menu. Do not copy and paste pictures into your presentation. For arcane reasons, copy and pasting pictures can make your PowerPoint fail to display your pictures on other computers.
  • Keep a folder of all of the pictures and video that you add to your PowerPoint. Just in case you need to re-insert it (for example, if you messed up on following the tip above).
  • Video is not embedded in PowerPoint, pictures are – share Zip files. That is, you can insert pictures into a PowerPoint presentation and send the presentation to someone else and they can see the pictures but you cannot insert video, send the presentation to someone else, and expect them to see the video. PowerPoint creates a link to the video instead. To get around this, if you are going to use video, put your presentation and your video files in a folder together, then insert the video. When you are ready to share your presentation, right-click on the folder and Send To > Compress or Zip Archive and send out the Zip file instead. Your recipient can unzip the archive and will have the presentation and the video.

Making Things Look Pretty

  • Black text on a white background is not traditional by accident. It’s easy to read. Think carefully before trying a novel color combination.
  • One picture per slide lets you show the picture big, in all its glory. Multiple pictures per slide lets you compare pictures. Think about which it is you want to be doing (and remember that postage stamps are hard to see!).
  • Don’t stretch your pictures. You can scale your pictures proportionately by holding down the Shift key when you drag the grab boxes on the corners of the picture. This will make sure that the picture doesn’t get distorted.
  • Use text judiciously. This one is complicated: you don’t want to have too much text on a slide because it will get small and hard to read. You don’t want to put your script on the slide, because then you’ll be reading from the slide, which is deathly dull (unless, maybe, you’re Morgan Freeman). But you do want to present text that will support your arguments and highlight important ideas. And you do want to present quotations that are illuminating. One rule of thumb is the “six by six” rule: no more than six words per bullet point, no more than six bullet points per slide. This is totally artificial and you should violate it as needed… but remember it and what it is really urging: don’t overwhelm your audience with text!
  • Less is more. This is true of almost everything involved in PowerPoint, but particularly when it comes to animation and sound effects. They have a campy appeal, and can sometimes underscore a point you’re trying to make. But you ain’t Spielberg and PowerPoint ain’t ILM, so don’t go trying to put in gratuitous special effects just to make your PowerPoint more appealing. Your research and ideas should be the focus, not your ability to make car crash sound effects.

March 11th, 2011

Posted In: Handouts

Debriefing the Wiki Challenge

  • Is the word processor dead? Why or why not?
  • Did you turn up any tools that were new/surprising/unexpected? How so?
  • Did you discover any ways of writing that you had not anticipated? What were they?
  • Did you see examples of other teachers using these tools? Were they pedagogically sound?

Designing Pedagogy

  • Focus on your learning objectives.
  • Plan for process. Wiggins’ backwards design is often very helpful.
  • Choose your tools — and make no assumptions about experience, ability! Remember that with the addition of new processes, tools and skills, you should anticipate differentiating your instruction in new dimensions.
  • Consider the four lenses (or your own local variant: use some checklist, structure or protocol to evaluate your plan).

Models of Project Design

Guided Inquiry

  • Webquests utilize guided inquiry, jigsaw learning model.
  • Experience a webquest about webquests.
  • Designed (and promoted) by Bernie Dodge at San Diego State University.
  • QuestGarden is an archive of re-usable webquests. (For a modest fee, you can use their tools to create webquests of your own).
  • A webquest is an idea. You don’t need a fancy tool to build one — you can build it in a wiki, or a blog, or Google Doc, or…


  • Blogs tend to shine in this category: a prompt followed by discussion and responses.
  • Elu V’Elu is a Jewish studies blog (Rabbi Neal Scheindlin, Milken Community High School). Note how process changes with experience: here’s the previous year’s blog.
  • There is a norm in the “blogosphere” of citing sources by linking directly to them — a useful tool for teaching academic references.
  • You can build your own blogs (for free!) on and
  • A sample blogging rubric — build your own, specific to your learning objectives.
  • is a WordPress blog theme for discussing text in detail.
  • Diigo is an interesting possibility for collaborative discussion around texts hosted on someone else’s web site. Everyone would need to have their own Diigo account. Watch their video to see how it works.

Peer Editing/Collaborative Writing

Some Legal Considerations

  • COPPA restricts the information that web sites can collect about users 13 and younger — which means that many web tools refuse to allow the 13-and-under set to sign up to use them.
  • FERPA restricts what information you can share or publish about your students: check with your school about how it handles student and family privacy with regard to working online. It varies wildly.
  • By law, it is assumed that anything that anyone publishes is copyright (by them), unless explicitly stated otherwise. A great source of public domain, re-usable media and images is the Creative Commons. Copyright law, in general, should be seen as an extension of concerns about plagiarism and citation.

March 3rd, 2011

Posted In: Handouts

Tags: , , , , , , , , , , , , , , , ,

Considering Technology in Education

It is important to remember that using technology in education is not an unalloyed good in and of itself. Using technology is good when you are meeting a need, when you are providing a tool or assistive device or accommodation, when you are facilitating communication, when you are documenting learning, when you are assessing understanding… whenever you’re being a teacher and a learner.

With that in mind, let’s consider these four possible lenses through which we can view technology in education (borrowed liberally from Bernie Dodge’s Webquest about Webquests, and flavored with some of my own perspective).

  1. Efficiency — How does this project or technology allow us to do something that we couldn’t do before? Or help us to do something better than we could before? Or allow us to bypass unncessary work? Or increase the efficiency of our learning? From this perspective, a project or technology that does not enhance our work product or workflow adds no value to the classroom.
  2. Collaboration — How does this project or technology promote learner cooperation? Or facilitate collaboration between individuals or groups? Or engender debate — or consensus-building? Or encourage discussion and reflection with peers or teachers? From this perspective, a project or technology that encourages solitary or individual work is undesirable.
  3. 21st Century Learning — How does this project or technology promote higher order thinking? Or facilitate critical thought and analysis? Or support creative synthesis of ideas? Or develop information and media literacy? From this perspective, projects and technologies aimed at rote recall, rather than “21st century learning” undermine learning.
  4. Engagement — How does this project or technology embrace the power of the internet? Or engage learners through its use of media? Or make use of “cutting edge” tools? Or push students to approach ideas and concepts from a novel perspective or tack? From this perspective, a project or technology that fails to meet students “where they’re at” is uninteresting and unengaging.

Example Wikis

  • Building a collaborative reference: Jewish Futures Project (Rabbi Yechiel Hoffman, Milken Community High School)
  • Sharing knowledge: Tech Resources Wiki (Education Technology Department, Milken Community High School)
  • Building a professional community: The Hebrew Project (Nehama Moskowitz, Jewish Education Center of Cleveland)
  • Sharing a passion: Electric Cars and Alternative Vehicles (Ken Wells, St. Mark’s School)
  • Constructing a collaborative document: Milken WASC (Milken Community High School)
  • Recording the sum of all human knowledge (about things that nerds are interested in): Wikipedia (The Wikimedia Foundation)

Models of Teaching 2011 Wiki

Today we’ll be working on Wikispaces, a wiki-hosting service (it’s worth noting that you can get a free, ad-free wiki from them just for being an educator!). Our wiki is at:

Wikispaces provides a series of video tutorials explaining how to use their site.

Nota bene: you will need to log in to your email to click the confirmation link from Wikispaces after you register and before you can edit any pages on the wiki!

Wiki Considerations/Affordances

  • Asynchronous versus synchronous communication. Only one person can edit a page at a time. Divide the site into sections and pages that are distinct enough that two people shouldn’t need to edit the same page at the same time — or, one person can do other work on the site while another edits the page.
  • Organization matters in the big picture. Page hierarchies and links make it easier to find information. Use standard naming conventions. Consider developing a style guide for when and how to link both to other pages on the wiki and to resources off-site.
  • Organization matters in the small picture. Structured text make it possible for the software to “understand” our information too. Consider developing a style guide to standardize the structure of pages to make it predictable where information will be on the page.
  • Target your audience. Decide on a target audience — or recognize who is reading and responding to your wiki — and write for them. Explain what they don’t understand. Engage them in conversation. Solicit edits, updates and content from your audience. Engage.
  • Separate the product from the discussion. Use the discussion tab for discussion, use the page for presentation. The page should reflect the final outcome of the discussion, while the discussion (and revision history) represents the process to get to that outcome.
  • Moderate the discussion. Set ground rules and expectations, define community norms. Be present and responsive. Push back against people who test the envelope.
  • Learning in public. Know who can read, who can edit, who can administer your wiki. And be aware of how that challenges you and your students. Know — and respect — your school’s guidelines for protecting student (and teacher) privacy.
  • Track revisions. You can see who edited which pages when and how. Check the history often enough to recognize “normal” and look for anomalies. Respond to anomalies.

Wiki Challenge, for Thursday, March 3

The Word Processor is Dead.

On Thursday, we’re going to look at a number of other online tools that can be used for teaching and learning. All of these tools have — at their core — a word processor. Each is tailored to a particular use, each promotes different kinds of writing, different kinds of reading, different kinds of thinking. None of them are a “general purpose” word processor like Microsoft Word or Apple’s Pages. They’re not about composing documents that will be printed out and distributed on paper (or as PDFs). How does this shift in paradigms change what a classroom looks like in the early twenty-first century?

As a class, divide and conquer this question and present your findings and conclusions on the Models of Teaching 2011 wiki.

Some things to consider as you tackle this project:

  • What are the key components of this question? Who will be responsible for addressing which components?
  • How will you organize the wiki? Who will be responsible for being “editor in chief”?
  • What kind of evidence (for or against) should you each be looking for?
  • Where will you look for information? How will you cite this information?

February 28th, 2011

Posted In: Handouts

Tags: , , , , , , , ,

Mouse Basics

Right-Click Right-click (also referred to as RMB for [R]ight [M]ouse [B]utton) selects a given object. Hold down Shift to select additional objects.
Left-Click Left-click (also referred to as LMB for [L]eft [M]ouse [B]utton) “does” stuff: works the transform manipulators, sculpts, paints, etc. (If you pause to think about it, these button assignments make sense, since you’re going to be doing a lot more LMB clicking to make little edits, and making many fewer RMB selections… probably.)
Middle-Click Middle-click (done by treating the the scroll wheel as a button and clicking with it on most mice) allows you to drag the view around the currently selected object. This is a free, unconstrained view rotation. Often useful for taking a quick look at things from another angle.
Scroll Wheel The scroll wheel zooms in and out in the current view.

Navigating the View

Camera Angles

Keypad 0 View through the camera.
Keypad 1 View from the front (looking along the Y-axis). Note that holding down the Control key and typing Keypad 1 (Control + Keypad 1) shifts the view to looking along the negative Y-axis — i.e. from the back.
Keypad 3 View from the right (looking along the X-axis). Control + Keypad 3 views from the left (negative X-axis).
Keypad 7 View from the top (looking along the Z-axis). Control + Keypad 7 views from the bottom (negative Z-axis).

View Adjustments

Keypad 4 Rotate the view counter-clockwise around the selected object.
Keypad 6 Rotate the view clockwise around the selected object.
Control + Keypad Arrows Pan the view in the direction of the arrow. Not all keypads are marked with arrows:

  • Keypad 4 is ←
  • Keypad 6 is →
  • Keypad 8 is ↑
  • Keypad 2 is ↓
Keypad Period Zoom and center the view to maximize the view of the currently selected object.
Keypad 5 Toggle between perspective and orthorgraphic (map) views.

Selecting and Manipulating Objects


A Select [A]ll objects in the scene in Object Mode (or all vertices in the object, if Edit Mode). If any objects are already selected, pressing A once will deselect everything, and pressing it a second time will select everything.
B Select objects with a [B]ox. Switches to a marquee selection tool, draw a box around the objects that you want to select.
Shift + Right-Click Add more objects to the current selection


N Show the details window in any 3D view. The contents of the details window vary depending on the mode and on which object is selected.
Spacebar Brings up the “Spacebar Menu” which provides a contextual set of options, depending on what object(s) are selected. Use this for quick access to adding objects and complex object editing options.


G Translate (move or “[G]o”) the selected object freely in the current view. Type G and then move the mouse. Left-click to “put down” the object.
S [S]cale the selected object uniformly in all dimensions. Type S and then move the mouse. Left-click to “put-down” the object.
R [R]otate the selected object in the current plane of view. Type S and then move the mouse. Left-click to “put-down” the object.
Control + Any Transform Holding down the Control key while doing any transformation (using the transform manipulators or the keyboard shortcuts above) while lock you into moving at “even” increments (5 degrees of rotation, 1 unit of movement, etc.). The exact numeric value of the transformation is shown in the lower-left corner of the 3D view pane.

Editing Objects

Shift + D [D]uplicate the currently selected object. Type Shift + D and then move the mouse. Left-click to “put-down” the object.
W With two objects selected in Object Mode, W brings up the boolean modeling options. In Edit Mode, W brings up the subdivide options.
Tab Toggle between the two most recently selected modes (say, Object Mode and Edit Mode). Control + Tab will cycle through all available modes.


I [I]nsert a keyframe for the selected object. Choose the type of keyframe from the menu.

February 8th, 2011

Posted In: Handouts

Tags: ,

GDE Error: Unable to load requested profile.

February 8th, 2011

Posted In: Handouts

Tags: ,

There are three basic transformations in OpenGL:

  • Scale (changing the size of an object)
  • Translate (moving an object to another location relative to where it started)
  • Rotate (rotating an object around a particular axis through the origin of the model)

The actual method calls for each of these transformations is fairly straightforward:

gl.glScaled(double xScale, double yScale, double zScale);
gl.glTranslated(double xTranslation, double yTranslation, double zTranslation);
gl.glRotated(double degrees, double x, double y, double z);

It is worth mentioning that in each of these method calls, the method ends in a D not because it is in the past tense, but because there are several variations of each of these methods, and the one we will use expects doubles as parameters (as opposed to glRotatef, which expects floats). Presumably glScaled() and glTranslated() are fairly self-evident: the object is either stretched by a particular factor or shifted by a particular factor along each of the axes — and it could be a different factor for each axis.

glRotated() requires further explanation. glRotated() operates on what is colloquially referred to as the “Right Hand Rule”.

Imagine that your hand is placed with the base of the palm at the origin. The (x, y, z) coordinates specified by glRotated() are at the tip of your thumb. The line from the origin (your palm) to that point (your thumb) defines the axis of rotation — the pole about which the rotation will be performed — nota bene that the axis of rotation will always pass through the origin. Your fingers then define the direction of rotation around that axis. And the number of degrees is, well, the number of degrees that you will rotate the object.

The order of transformations is critical. Applying transformations in different orders will have noticeably different effects. The best way to think of the situation that the objects being modeled are passing through a filter, the transformation matrix. Each time a new transformation is applied, the filter is adjusted slightly. A rotation followed by a translation will first rotate the object and then translate it into a new position. A translation followed by a rotation will first move the object into its new position and then rotate the object — from its new position — around the axis of rotation at the origin — causing a planet-like orbit about the origin.

Because this filter is adjusted by each transformation applied, all transformations apply to any objects drawn after the transformations apply — the objects always pass through the transformation matrix on their way to being drawn on-screen, and each transformation we apply adjusts the transformation matrix. There is only one transformation matrix. All objects pass through it. The only question is: when do they pass through it? Before or after a particular adjustment?

gl.glRotated(90, 0, 1, 0); // rotate 90 degrees around the positive y-axis
glut.glutWireTeapot(1.0); // the teapot is rotated
gl.glTranslated(10, 0, 0); // translate 10 units along the positive x-axis
glut.glutWireTetrahedron; // the tetrahedron is translated and then rotated
gl.glScaled(1, 1, 3); // scale, leaving x- and y-axes unchanged, but triple z
glut.glutWireIcosahedron(); // the icosahedron is scaled, translated and then rotated

Note that something strange happens to the order of the transformations — the objects are passed through the most recent transformations first, moving backward in through all of the transformations applied. A quick way to figure out what order the transformations will be applied to a particular object is start at that object and run a finger up the lines of code. The order in which the transformations are encountered is the order in which they will be applied to the object.

Suppose we don’t want every transformation to apply to every object? It would be nice to apply a transformation and then unapply it. We can do this: we save the transformation matrix in its pre-alteration state, apply a new transformation (or two or three…), draw our object, and then revert back to the version that we saved earlier.

gl.glPushMatrix(); // save current state of transformation matrix
    gl.glRotated(90, 0, 1, 0); // rotate 90 degrees around the positive y-axis
    glut.glutWireTeapot(1.0); // the teapot is rotated
gl.glPopMatrix(); // revert to saved version of transformation matrix
gl.glPushMatrix(); // save transformation matrix (again)
    gl.glTranslated(10, 0, 0); // translate 10 units along the positive x-axis
    glut.glutWireTetrahedron; // the tetrahedron is ONLY translated
gl.glPopMatrix(); // revert to saved (again)
gl.glPushMatrix(); // save the transformation matrix a last time
    gl.glScaled(1, 1, 3); // scale, leaving x- and y-axes unchanged, but triple z
    glut.glutWireIcosahedron(); // the icosahedron is ONLY scaled
gl.glPopMatrix(); // reverto saved a last time
// anything that follows will be unaffected by our transformations!

January 5th, 2011

Posted In: Handouts

Tags: , , ,

Each OpenGL primitive (well, each OpenGL GLUT primitive) can be drawn either as a solid (filled) shape or as a wireframe shape. The two method calls are identical in parameters by differ in their names (as listed below). Each of the methods listed below is a method of the GLUT object, so a primitive would be drawn as a method call of that object:

glutSolidCube(float sideLength)
glutWireCube(float sideLength)

Usually a cube is drawn with unit (1) side length and then scaled to the size desired. This make the cube ideal as the “base shape” for any rectangular shape (since the scaling can be different along each of the x-, y-, and z-axes).

glutSolidSphere(float radius,
    int slices, int stacks)
glutWireSphere(float radius,
    int slices, int stacks)

Spheres are not actually spherical, they are approximated with polyhedrons. The slices parameter defines how many slices (like orange wedges — the longitude lines) the sphere is broken into, while stacks defines how many latitude divisions (rings) the sphere is divided into. Obviously more slices and stacks results in a polyhedron more closely approximating a sphere… but also in a larger number of polygons and thus greater load on the computer. (And, remember, the number of polygons is equal to slices × stacks: 10 slices and 10 stacks gets you 100 polygons.)

glutSolidCylinder(float radius, float length,
    int slices, int stacks)
glutWireCylinder(float radius, float length,
    int slices, int stacks)

The cylinder is (surprisingly, at least to this author) drawn along the z-axis — that is, with the eye staring down the barrel of it from a “normal” default viewpoint). It too is divided into slices and stacks, and in the same manner. Often one needs only a single stack (thereby allowing for the maximizing of slices and thus cylindricality).

glutSolidCone(float radius, float height,
    int slices, int stacks)
glutWireCone(float radius, float height,
    int slices, int stacks)

The cone too is drawn along the z-axis (like the cylinder). It too is broken into slices and stacks.

glutSolidTorus(float innerRadius, float outerRadius,
    int sides, int rings)
glutWireTorus(float innerRadius, float outerRadius,
    int sides, int rings)

The torus has two radii because the inner radius is the radius of the rings circling the “donut”, while the outer radius is the radius of the donut itself. The number of sides refers to the number of sides on the inner radius, while the number of rings is the number of inner radius-sized rings.

glutSolidTeapot(float scale)
glutWireTeapot(float scale)

It pretty much does what it says. Why a teapot? This is no ordinary teapot: this is the Utah Teapot.

Also available:


These all do pretty much what they sound like.

January 5th, 2011

Posted In: Handouts

Tags: , , ,

Next Page »