void Matrix3DUtils::setOrientation(Matrix3D &m, const Vector3D &dir, const Vector3D &up, const float smooth) { getScale(m, _scale); Vector3D upp; Vector3D dirr; upp.copyFrom(up); dirr.copyFrom(dir); if (smooth != 1) { getDir(m, _dir); _dir.x += (dir.x - _dir.x) * smooth; _dir.y += (dir.y - _dir.y) * smooth; _dir.z += (dir.z - _dir.z) * smooth; dirr = _dir; getUp(m, _up); _up.x += (up.x - _up.x) * smooth; _up.y += (up.y - _up.y) * smooth; _up.z += (up.z - _up.z) * smooth; upp = _up; } else { dirr = dir; } dirr.normalize(); Vector3D rVec; Vector3D::crossProduct(upp, dirr, &rVec); rVec.normalize(); Vector3D uVec; Vector3D::crossProduct(dirr, rVec, &uVec); rVec.scaleBy(_scale.x); uVec.scaleBy(_scale.y); dirr.scaleBy(_scale.z); rVec.w = 0.0f; uVec.w = 0.0f; dirr.w = 0.0f; setVectors(m,rVec, uVec, dirr); }