void Camera::calculateViewingTransformParameters() { // compute new transformation based on // user interaction Mat4f dollyXform; Mat4f azimXform; Mat4f elevXform; Mat4f twistXform; Mat4f originXform; Vec3f upVector; MakeHTrans(dollyXform, Vec3f(0,0,mDolly)); MakeHRotY(azimXform, mAzimuth); MakeHRotX(elevXform, mElevation); MakeDiagonal(twistXform, 1.0f); MakeHTrans(originXform, mLookAt); mPosition = Vec3f(0,0,0); mPosition = originXform * (azimXform * (elevXform * (dollyXform * mPosition))); if ( fmod(double(mElevation), 2.0*M_PI) < -M_PI/2 || fmod(double(mElevation), 2.0*M_PI) > M_PI/2 ) mUpVector= Vec3f(0,-1,0); else mUpVector= Vec3f(0,1,0); mDirtyTransform = false; }
void Camera::calculateViewingTransformParameters() { Mat4f dollyXform; Mat4f azimXform; Mat4f elevXform; Mat4f twistXform; Mat4f originXform; Vec3f upVector; MakeHTrans(dollyXform, Vec3f(0,0,mDolly)); MakeHRotY(azimXform, mAzimuth); MakeHRotX(elevXform, mElevation); MakeDiagonal(twistXform, 1.0f); MakeHTrans(originXform, mLookAt); mPosition = Vec3f(0,0,0); // grouped for (mat4 * vec3) ops instead of (mat4 * mat4) ops mPosition = originXform * (azimXform * (elevXform * (dollyXform * mPosition))); if ( fmod((double)mElevation, 2.0*M_PI) < 3*M_PI/2 && fmod((double)mElevation, 2.0*M_PI) > M_PI/2 ) mUpVector= Vec3f(0,-1,0); else mUpVector= Vec3f(0,1,0); mDirtyTransform = false; }
void MakeHRotZ(Mat4f &m, float theta) { MakeDiagonal(m,1.0f); float cosTheta = cos(theta); float sinTheta = sin(theta); m[0][0] = cosTheta; m[0][1] = -sinTheta; m[1][0] = sinTheta; m[1][1] = cosTheta; }
void Camera::calculateViewingTransformParameters() { Mat4f dollyXform; Mat4f azimXform; Mat4f elevXform; Mat4f twistXform; Mat4f originXform; MakeHTrans(dollyXform, Vec3f(0,0,mDolly)); MakeHRotY(azimXform, mAzimuth); MakeHRotX(elevXform, mElevation); MakeDiagonal(twistXform, 1.0f); MakeHTrans(originXform, mLookAt); mPosition = Vec3f(0,0,0); // grouped for (mat4 * vec3) ops instead of (mat4 * mat4) ops mPosition = originXform * (azimXform * (elevXform * (dollyXform * mPosition))); Vec3f nx = originXform * (azimXform * (elevXform * (dollyXform * Vec3f(1, 0, 0)))); Vec3f ny = originXform * (azimXform * (elevXform * (dollyXform * Vec3f(0, 1, 0)))); mUpVector = nx*sin(mTwist) + ny*cos(mTwist); mDirtyTransform = false; }
void MakeHTrans(Mat4f &m, const Vec3f &s) { MakeDiagonal(m,1.0f); m[0][3] = s[0]; m[1][3] = s[1]; m[2][3] = s[2]; }
void MakeHScale(Mat4f &m, const Vec3f &s) { MakeDiagonal(m,1.0f); m[0][0] = s[0]; m[1][1] = s[1]; m[2][2] = s[2]; }
Matrix2x::Matrix2x (fixed fM00, fixed fM11) { MakeDiagonal(fM00,fM11); }