code: public Quaterniond rotateZYX(double angleZ, double angleY, double angleX, Quaterniond dest) {
          double sx =  Math.sin(angleX * 0.5);
          double cx =  Math.cosFromSin(sx, angleX * 0.5);
          double sy =  Math.sin(angleY * 0.5);
          double cy =  Math.cosFromSin(sy, angleY * 0.5);
          double sz =  Math.sin(angleZ * 0.5);
          double cz =  Math.cosFromSin(sz, angleZ * 0.5);
  
          double cycz = cy * cz;
          double sysz = sy * sz;
          double sycz = sy * cz;
          double cysz = cy * sz;
          double w = cx*cycz + sx*sysz;
          double x = sx*cycz - cx*sysz;
          double y = cx*sycz + sx*cysz;
          double z = cx*cysz - sx*sycz;
          // right-multiply
          dest.set(this.w * x + this.x * w + this.y * z - this.z * y,
                   this.w * y - this.x * z + this.y * w + this.z * x,
                   this.w * z + this.x * y - this.y * x + this.z * w,
                   this.w * w - this.x * x - this.y * y - this.z * z);
          return dest;
      }
docs: /* (non-Javadoc)
  @see org.joml.Quaterniondc#rotateZYX(double, double, double, org.joml.Quaterniond)