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);
}