00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #if defined(_MSC_VER)
00025 #pragma once
00026 #endif
00027
00028 #ifndef PBRT_CORE_QUATERNION_H
00029 #define PBRT_CORE_QUATERNION_H
00030
00031
00032 #include "pbrt.h"
00033 #include "geometry.h"
00034
00035
00036 struct Quaternion {
00037
00038 Quaternion() { v = Vector(0., 0., 0.); w = 1.f; }
00039 Quaternion &operator+=(const Quaternion &q) {
00040 v += q.v;
00041 w += q.w;
00042 return *this;
00043 }
00044 friend Quaternion operator+(const Quaternion &q1, const Quaternion &q2) {
00045 Quaternion ret = q1;
00046 return ret += q2;
00047 }
00048 Quaternion &operator-=(const Quaternion &q) {
00049 v -= q.v;
00050 w -= q.w;
00051 return *this;
00052 }
00053 friend Quaternion operator-(const Quaternion &q1, const Quaternion &q2) {
00054 Quaternion ret = q1;
00055 return ret -= q2;
00056 }
00057 Quaternion &operator*=(float f) {
00058 v *= f;
00059 w *= f;
00060 return *this;
00061 }
00062 Quaternion operator*(float f) const {
00063 Quaternion ret = *this;
00064 ret.v *= f;
00065 ret.w *= f;
00066 return ret;
00067 }
00068 Quaternion &operator/=(float f) {
00069 v /= f;
00070 w /= f;
00071 return *this;
00072 }
00073 Quaternion operator/(float f) const {
00074 Quaternion ret = *this;
00075 ret.v /= f;
00076 ret.w /= f;
00077 return ret;
00078 }
00079 Transform ToTransform() const;
00080 Quaternion(const Transform &t);
00081
00082
00083 Vector v;
00084 float w;
00085 };
00086
00087
00088 Quaternion Slerp(float t, const Quaternion &q1, const Quaternion &q2);
00089
00090
00091 inline Quaternion operator*(float f, const Quaternion &q) {
00092 return q * f;
00093 }
00094
00095
00096 inline float Dot(const Quaternion &q1, const Quaternion &q2) {
00097 return Dot(q1.v, q2.v) + q1.w * q2.w;
00098 }
00099
00100
00101 inline Quaternion Normalize(const Quaternion &q) {
00102 return q / sqrtf(Dot(q, q));
00103 }
00104
00105
00106
00107 #endif // PBRT_CORE_QUATERNION_H