q.fromAngleAxis(angle, rotAxis);
q.fromAngleNormalAxis(angle, rotAxis);
    private void rotateRight(float amount, float time) {        Vector3f camPos = camera.getCamera().getLocation();        Vector3f targetPos = target.getWorldTranslation();        float azimuthAccel = (amount * mouseXSpeed);        difTemp.set(camPos).subtractLocal(targetPos);                if (worldUpVec.z == 1) {            float y = difTemp.y;            difTemp.y = difTemp.z;            difTemp.z = y;        }        FastMath.cartesianToSpherical(difTemp, sphereTemp);        sphereTemp.y = FastMath.normalize(sphereTemp.y + (azimuthAccel),                -FastMath.TWO_PI, FastMath.TWO_PI);        FastMath.sphericalToCartesian(sphereTemp, rightTemp);        if (worldUpVec.z == 1) {            float y = rightTemp.y;            rightTemp.y = rightTemp.z;            rightTemp.z = y;        }        rightTemp.addLocal(targetPos);        camPos.set(rightTemp);        if (rotateTarget) {            //First figure out the current facing vector.            target.getLocalRotation().getRotationColumn(0, rightTemp);                        // get angle between vectors            rightTemp.normalizeLocal();            difTemp.y = 0;            difTemp.negateLocal().normalizeLocal();            float angle = rightTemp.angleBetween(difTemp);                        // calc how much angle we'll do            float maxAngle = targetTurnSpeed * time;            if (angle < 0 && -maxAngle > angle) {                angle = -maxAngle;            } else if (angle > 0 && maxAngle < angle) {                angle = maxAngle;            }            //figure out rotation axis by taking cross product            Vector3f rotAxis = rightTemp.crossLocal(difTemp);            // Build a rotation quat and apply current local rotation.            Quaternion q = rotTemp;            q.fromAngleAxis(angle, rotAxis);            q.mult(target.getLocalRotation(), target.getLocalRotation());        }    }