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. I'm not usually the professor who teaches this course, but I petitioned to teach it 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 been making games, making spotty attempts to learn 3D modeling with Blender, and designing a programming language for algorithmic construction of 3D models. My programming assignments in all classes 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 your tablemates. If you have a laptop, bring it on Thursdays. I encourage you to leave it home on Tuesdays or closed. Speaking from personal experience, I'm not very present when there's a soul-sucking screen on around me. Please be present, and make it easy for others to be present.
The textbook for our is 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—but not this week. Your first reading is due before Thursday. More on that later. 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
- matrices
- triangle meshes
- lighting
- cameras
- interaction
- physics
- textures
- terrain
- skeletal animation
- shadows
- noise
There will be math in this class—mostly multiplication and addition and trigonometry. But it will look scarier. 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 a single project with five milestones. You will build a two-player cart-racing 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 five project milestones will not have exact due dates. Instead I will announce five 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
On this first day, I thought it best that we just soak in three dimensions and not bother with any code. Form a group of three 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? Try to find an orientation so that its coordinates are all integers.
Together we'll attempt to recreate your shapes in Blender. The first milestone will be to make models for your cart-racer.
Award
Now it's your turn to fumble around in Blender. As an individual, complete this exercise:
- The movies have the Oscars. TV has the Emmys. Dream up a human endeavor and design its trophy by composing together solids with rotation, translation, and scaling. Post a screenshot in #general on Discord, and be prepared to interpret your trophy to the class.
TODO
Here's your list of things to do before we meet next:
See you next time.
Sincerely,
P.S. It's time for a haiku!