Viewing Transformation Tong-Yee Lee
Changes of Coordinate System World coordinate system Camera (eye) coordinate system
Default Camera Position and Orientation The default camera is with eye at the origin (0,0,0) and the axis of the pyramid aligned with the z-axis. The eye is looking down the negative z-axis.
In this equation, a is world coordinate, B will convert a to b (in another coordinate system)
Why B is orthonormal? In above equation, 0 is due to vi.vj=0 i!=j
b1=Bw->1aw aw=Bw->1Tb1=B-w->1b1 b2=Bw->2aw aw=Bw->2Tb2=B-w->2b2 B-w->1b1=B-w->2b2 Bw->1B-w->1b1= Bw->1B-w->2b2 b1= Bw->1B-w->2 b2= Bw->1B2->w b2
Consider a special case as v1=(1,0,0), v2=(0,1,0) and v3(0,0,1)
This is same as previous matrix composition by way of a is coordinate in (v1,v2,v3) system (usually is world coordinate) b is coordinate in (u1,u2,u3) system B is easily remembered by carefully checking B The first row: u1 projects on three axes v1,v2,v3 The second row: u2 projects on three axes v1,v2,v3 The third row: u3 projects on three axes v1,v2,v3 How about B’ for c is coordinate in (w1,w2,w3) for b converted to c? (i.e. c=B’b) This is same as previous matrix composition by way of transforming to world coordinate
X axis vector Y axis vector Z axis vector
Intuitive Camera Specification
Not easy for user to pick up exact up vector!! So, we compute v automatically from up vector.
n a b n b’ b
n a b Another way ……………….. a = b’ x n b = n x a
v1=(1,0,0), v2=(0,1,0) and v3(0,0,1)
Note that matrix storage order is column major in OpenGL
u (i.e., x) axis n (i.e.,z) axis v (i.e., y) axis Treat yourself (viewer) as a airplane heading to –Zc Note that: as a viewer is moving, the object is moving in opposite direction on the viewing plane!!
This is z-like rotation
n v n’ v’ u n n’ u’ This is x-like rotation This is y-like rotation
How about pitch() and yaw()? Same stories as roll(). 7.3.1. Implementing pitch() and yaw(). void Camera :: pitch (float angle) { // pitch the camera through angle degrees around U float cs = cos(3.14159265/180 * angle); float sn = sin(3.14159265/180 * angle); Vector3 t(v); // remember old v v.set(cs*t.x + sn*n.x, cs*t.y + sn*n.y, cs*t.z + sn*n.z); n.set(-sn*t.x + cs*n.x, -sn*t.y + cs*n.y, -sn*t.z + cs*n.z); setModelViewMatrix(); } void Camera :: yaw (float angle) { // yaw the camera through angle degrees around V Vector3 t(n); // remember old v n.set(cs*t.x + sn*u.x, cs*t.y + sn*u.y, cs*t.z + sn*u.z); u.set(-sn*t.x + cs*u.x, -sn*t.y + cs*u.y, -sn*t.z + cs*u.z);
How about slide() Sliding a camera means to move it along one of its own axes-that is in the u,v,n direction-without rotating it. Along n means forward or backward Along u is left and right Along v is up and down Assume slide(delU, delV, delN)
Flythrough a Scene!!!