Lecture: Origin
Dear students:
Welcome to CS 488: Computer Graphics. I have two primary computing interests: computer graphics and programming languages. They don't necessarily go together, but I like them both and I try to find ways to unite them so that one doesn't get jealous of the other.
I'm Chris, and you can call me Chris. Or Dr. Chris. Or Dr. Johnson. I'm still kind of new to this department and this part of the country. My family fled the Midwest because of the cold and other reasons that we can talk about some time. When I say family, I'm referring to my wife and four sons. I'll show you a picture so you know that you aren't the only thing I've got going on in my life.
Graphics Origin
As your professor, I think it's important for you to know that I am a human and not a robot. Therefore, I will offer up a little biographical information that I think is relevant. When I first arrived at the university, someone else taught this course. I petitioned to teach it for a couple of reasons. For one, because it needed to be updated. It was using an obsolete system called the fixed-function pipeline. For two, because graphics has between intertwined with my computer science journey from the very start. In the mid-1990s, my family got our first computer, a Macintosh Performa, and we got the internet a short time later. I discovered POV-Ray, a raytracing programming that let me program geometric scenes. I used it to design art for websites and to help me with me calculus homework. My interest in 3D was fed by the wireframe renderings I saw in Nintendo Power of the forthcoming Donkey Kong Country.
Then college happened, and I got a degree in computer science. As graduation neared, I wasn't sure what to do. I wasn't excited by the prospect of working for a corporation. A professor convinced me to attend graduate school. When I showed up to pick classes for my first semester, I saw computer graphics. A wave of nostalgia for my early days of computing rushed over me and I signed up. As soon as the class started, I regretted my decision. The math was too much for this poor farm kid. I dropped the class and grieved over my failure.
The textbook remained on my desk and haunted me. I decided to keep working on the programming assignments even though I wasn't registered for the class anymore. And it was such fun. Eventually I met with the instructor and explained that I was interested in the subject but ill-prepared. He suggested that I take the class with him as an independent study the next semester. I did, and he eventually became my advisor. I worked on papers with him about finding interesting features in large datasets. Around that time, NVIDIA and ATI (now AMD) started selling graphics cards that you could write programs for. I spent most of my dissertation time writing a renderer that would display volumetric data sets like CT and MRI scans.
Since graduate school, I've taught computer graphics and game development courses, made spotty attempts to learn 3D modeling with Blender, and designed a programming language for algorithmic construction of 3D models. My programming assignments are often centered around producing graphical output. During a sabbatical, I worked as a contract engineer for an educational game development company in Wisconsin. That was really the first time I experienced what a team of people with diverse skills can do together. There were 2D artists, 3D artists, UX designers, programmers, game designers, and project managers making a thing. Sorry we're not recreating that environment here.
All that brings me here to this course. What brings you?
Course Structure
My aim is for our weekly schedule to be predictable. On Tuesdays, we'll have lecture. I will talk. I will try to get you to talk. We'll write a fair bit of code together. On Thursdays we'll have a lab. All labs will involve you writing a renderer with a partner.
The textbook for our course is one that I am working on. I have chosen to write it not because I think I can do it better than others. I have other reasons: so that I myself can better understand the material, so that I can give it to you for free, so that I can distill the book down to the material that we'll actually cover, so that I can integrate exercises directly into the reasons, and so that I can improve the writing and the exercises semester after semester. The book is a work-in-progress, and I welcome your constructive criticism.
Each week will look something like this: read → front quiz → lecture → middle quiz → lab. Readings will generally be assigned on Thursdays. You will take a front quiz that accompanies the reading, all before Tuesday's lecture. If you like your score, you can keep it. If not, you can take a middle quiz and replace it. You don't have as much time for that one. Then on Thursday you'll work on a lab exercise in teams. These labs will generally be due by Monday noon. The quizzes aren't timed because I want to eliminate panic where I can.
Here's a rough outline of the topics we'll cover:
- rendering points, lines, and triangles
- moving models around with transformations
- triangle meshes
- matrices
- lighting
- cameras
- interaction
- textures
- terrain
- skeletal animation
- noise
- shadows
There will be math in this class—mostly multiplication and addition and trigonometry. But it will look scarier because it will be accomplished through matrices. I will try to do a better job explaining and deriving things than I got in my first graphics course.
I have long avoided taking attendance because it made me feel like a high school teacher. But I don't feel like things have been going well the past few years as our focus and commitment degrades. If I don't expect attendance, our whole mission seems sort of pointless. We're here to talk to each other about programming languages. So, while I'm not going to waste my time on attendance itself, I am going to assign in-class exercises each time we meet, both Tuesdays and Thursdays. These will be short and related to the course topics. Your participation will count toward your grade.
For programming assignments, we will have three individual assignments, one group presentation, and one group project. For the project, you will build a multi-player non-networked game.
I push due dates right up to the point at which I'm going to start grading. There won't be extensions. I have a job that does not end and easily destroys relationships and physical and mental health. If you find that you don't have enough time to complete something, please just accept the very appropriate consequence of not receiving credit.
The programming assignments will not have exact due dates. Instead I will announce four ready dates. These are dates at which you may turn in your work for a milestone. You will get credit if you've met all the requirements of the milestone. If you don't, then you can roll over to the next ready date. This is my scheme for accommodating emergencies and other trying times. I do not otherwise grant extensions because I'm a finite being.
You will turn in all your work on GitHub using a repository that I have made for you. I need to get you access to that repository. Also, we will use Discord for all communication. Please do not use email. If you send me an email, I will wait one day before responding, and then my response will be, “Please ask on Discord.” Email is terrible because I cannot easily revisit the history of our conversation and because the university floods us with noise. Emoji is also easier on Discord.
Let's take a moment right now to make sure I have your GitHub and Discord usernames. Find the link on Canvas and submit these to me. Make accounts if you need to.
Zometool Exercise
This class is spatial, and I'm going to have you use your body and brain together from time to time. Form a group of two and complete these exercises:
- Form a right parallelipiped using Zometool. Describe it. How many vertices does it have? Edges? Faces? What are possible coordinates of its vertices?
- Form a tetrahedron using Zometool. (Use the green struts.) Describe it. How many vertices does it have? Edges? Faces? What are possible coordinates of its vertices? Rotate it until you find an orientation that puts all of its coordinates on the integer lattice.
Together we'll attempt to recreate your shapes in Blender.
Lost Vertex
We often represent an ngon as a sequence of n vertices. But what if we lost one of them? Could we recover it? Perhaps if we know something more about the shape. Suppose you know that the shape is a parallelogram. But you only have its first three vertices as you wind around its perimeter:
Can you compute a fourth? If so, write down an algorithm.
Then we'll build a little renderer that has the broken shape and restores its lost vertex.
TODO
Here's your list of things to do before we meet next:
See you next time.
Sincerely,