static Matrix4T<T> rotation(float degrees, const Vector3T<T> &inaxis) { Matrix4T<T> m; Vector3T<T> axis = inaxis; axis.normalize(); float c = cos((float)degToRad(degrees)); float s = sin((float)degToRad(degrees)); m.x.x = (axis.x * axis.x) * (1.0f - c) + c; m.y.x = (axis.y * axis.x) * (1.0f - c) + (axis.z * s); m.z.x = (axis.z * axis.x) * (1.0f - c) - (axis.y * s); m.x.y = (axis.x * axis.y) * (1.0f - c) - (axis.z * s); m.y.y = (axis.y * axis.y) * (1.0f - c) + c; m.z.y = (axis.z * axis.y) * (1.0f - c) + (axis.x * s); m.x.z = (axis.x * axis.z) * (1.0f - c) + (axis.y * s); m.y.z = (axis.y * axis.z) * (1.0f - c) - (axis.x * s); m.z.z = (axis.z * axis.z) * (1.0f - c) + c; return m; }
static Matrix4T<T> buildViewMatrix(const Vector3T<T> &from, const Vector3T<T> &lookingAt, const Vector3T<T> &up /*= Vector3(1,0,0)*/) { Matrix4T<T> r; r.SetPositionVector(Vector3T<T>(-from.x,-from.y,-from.z)); Matrix4T<T> m; Vector3T<T> f = (lookingAt - from); f.normalize(); Vector3T<T> s = Vector3T<T>::Cross(f,up); Vector3T<T> u = Vector3T<T>::Cross(s,f); m.x.x = s.x; m.x.y = s.y; m.x.z = s.z; m.y.x = u.x; m.y.y = u.y; m.y.z = u.z; m.z.x = -f.x; m.z.x = -f.y; m.z.z = -f.z; return m * r; }
Vector3T normalized() const { Vector3T v = *this; v.normalize(); return v; }