void Camera::rotate(Radians angle) { Quat rot = glm::angleAxis(angle.value(), mUpReal); mFront = Vec3(rot * mFront).normalized(); mRight = Vec3(rot * mRight).normalized(); mMatrixUpdateFlags |= MatrixRotationUpdated; updateAngles(); }
void Camera::mouseLook(Radians dtX, Radians dtY) { float angleXZ = getHorizontalAngle().value(); float angleY = getVerticalAngle().value(); angleXZ -= dtX.value(); // -? lol angleY -= dtY.value(); // same angleY = glm::clamp(angleY, -PI_2, PI_2); float len = Vec3(mAt - mEye).length(); Vec3 at = mEye + Vec3(len * sinf(angleXZ) * cosf(angleY), len * sinf(angleY), len * cosf(angleXZ) * cosf(angleY)); //gLog.trace("%f, %f, len %f\n", angleXZ, angleY, len); //gLog.trace("eye: %s\n", utils::toString(mEye).c_str()); //gLog.trace("at: %s\n", utils::toString(mAt).c_str()); //gLog.trace("at - eye: %s\n", utils::toString(Vec3(mAt - mEye)).c_str()); //gLog.trace("new at = %s\n", utils::toString(Vec3(len * sinf(angleXZ) * cosf(angleY), //len * sinf(angleY), //len * cosf(angleXZ) * cosf(angleY))).c_str()); lookAt(mEye, at, mUp); }
float sin(const Radians &rad) { return sinf(rad.value()); }
float atan(const Radians &rad) { return atanf(rad.value()); }
float acos(const Radians &rad) { return acosf(rad.value()); }
void Camera::rotateAround(Radians angle) { Quat rot = glm::angleAxis(angle.value(), mUpReal); lookAt(mAt + (rot * (mEye - mAt)), mAt, mUp); }
void Camera::rotate(const Vec3& axis, Radians angle) { Quat rot = glm::angleAxis(angle.value(), axis.normalized()); lookAt(mEye, mEye + (rot * (mAt - mEye)), mUp); }