---
# System prepended metadata

title: CSCI 420 week 02 input and interaction & transformation
tags: [CSCI 420]

---

# CSCI 420 week 02 input and interaction & transformation 

###### tags: `CSCI 420`

* **Input and Interaction** (setup glut)
    * primitives: **vertices, lines, polygons**
    * one strength of modern consumer GPU: vertices attributes are abstract entities(a bunch of numbers), which why machine learning could work on GPUs
    * CPU $\Leftrightarrow$ GPU: like client server architecture
        * object vertices is sent to GPU once and never modify again for efficiency
        * read back from GPU would choke the pipeline
    * display list
        * aspect of instancing, render things repeatly with high efficiency
        * don't put variable in display list
        * graphics hardware is optimized to do 4x4 matrix multiplication
    * vertex array
        * list all points, and triangle array indexes into vertex array
        * don't have to duplicate data
    * **vertex buffer objects(VBOS)**: modern way to move data to gpu and render, fast / flexible
        * **display list**: fast / inflexible
        * **Immediate mode**(GL_begin, GL_end): slowest / flexible
        * **vertex array**: slow / flexible
    * hidden surface removal
        * **object space**: depth sort (painter's algorithm)
        * **image space**: z-buffer algorithm(for each object), raycasting(do inverse of z-buufer, for every pixels)
        * z-buffer algorithm: using depth buffer, if farer, discard, otherwise, draw and update
    * glOrtho() for parallel viewing, glPerspective() for perspective viewing
* **Tranformation**
    * 2 matrix stacks in opengl, modeling and viewing transformation matrix, projection matrix
        * **object coordinate $\to$ world coordinate $\to$ camera coordinate**
        * model-view matrix: move everything in front of camera
        * modern openGL: compute transformation matrix yourself
        * glLoadIdentity() create a 4x4 matrix and push on top of matrix stack, very common use
    * glRotate: rotate about object coordinate system, not world coordinate system
    * follow this sequence on openGL: 
    **translate $\to$ rotate $\to$ scale**, or result will be mayhem
    * gl{Push, Pop}Matrix to save previous state(**now deprecated**)
* **Linear Algebra**
    * use square length for comparison instead of square root for performance reason
    * a x b
\begin{align}
\begin{pmatrix}
a_1\\
a_2\\
a_3\\
\end{pmatrix}
\times
\begin{pmatrix}
b_1\\
b_2\\
b_3\\
\end{pmatrix}
=
\begin{pmatrix}
a_2b_3-a_3b_2\\
a_3b_1-a_1b_3\\
a_1b_2-a_2b_1\\
\end{pmatrix}
\end{align}
    * coordinate system changing: express vector u in terms of vector v:
\begin{gather}
u_1=\gamma_1v_1+\gamma_2v_2+\gamma_3v_3\\
u_2=\gamma_4v_1+\gamma_5v_2+\gamma_6v_3\\
u_3=\gamma_7v_1+\gamma_8v_2+\gamma_9v_3
\end{gather}
\begin{align}
\begin{bmatrix}
a_1\\
a_2\\
a_3\\
\end{bmatrix}
=
M
\begin{bmatrix}
b_1\\
b_2\\
b_3\\
\end{bmatrix}
,\ M
=
\begin{bmatrix}
\gamma_1&\gamma_2&\gamma_3\\
\gamma_4&\gamma_5&\gamma_6\\
\gamma_7&\gamma_8&\gamma_9\\
\end{bmatrix}
\end{align}
    * affine transformation
    \begin{bmatrix}
    \alpha_1& \alpha_2 & \alpha_3 & 1
    \end{bmatrix}
        * if fourth coordinate(homogeneous coordinate) is non zero, it's point, actual point is other 3 values divided by fourth value
        * it's 1 unless in projection
        * rotation in 2D (determinant is 1, and is a orthogonal matrix, because $\sin^2\theta+\cos^2\theta=1$)
\begin{align}
\begin{bmatrix}
x^\prime\\
y^\prime\\
\end{bmatrix}
=
\begin{bmatrix}
\cos\theta&-\sin\theta\\
\sin\theta&\cos\theta\\
\end{bmatrix}
\begin{bmatrix}
x\\
y\\
\end{bmatrix}
\end{align}