function reversibleRotateAnim(nodeTrans, vecPoint, vecAxis, fLow, fHigh, fStep, interval, scene) {
	this.interval=interval;
	this.nodeTrans=nodeTrans;
	this.vecPoint=vecPoint;
	this.vecAxis=vecAxis.Normalize();
	this.fLow=fLow;
	this.fHigh=fHigh;
	this.fStep=fStep;
	this.currRot=0;
	this.active=false;
	this.scene=scene;

	//LOG("reversibleRotateAnim created ");

	this.perform=function() {
		if(!this.active) {
			return 100;
		} else {
			this.currRot+=this.fStep;
			//LOG("currRot: "+this.currRot);
			if(this.currRot>this.fHigh) {
				this.currRot=this.fHigh;
				this.fStep*=-1;
				this.active=false;
				this.ftransform();
				return 100;
			} else if(this.currRot<this.fLow) {
				this.currRot=this.fLow;
				this.fStep*=-1;
				this.active=false;
				this.ftransform();
				return 100;
			} else {
				this.ftransform();
				return this.interval;
			}
		}
	}

	this.ftransform=function() {
		var vpinv=new Vector3(-this.vecPoint.x,-this.vecPoint.y,-this.vecPoint.z);
		var mat = Matrix.Translation(vpinv);
		mat = mat.Multiply(Matrix.RotationAxis(this.vecAxis, -(this.currRot) * 3.141592 / 180.0));
		mat = mat.Multiply(Matrix.Translation(this.vecPoint));
		scene.SetTransformation(this.nodeTrans,mat);
	}
}