@Override
protected final Spatial loadAnimModel() {
fixedPoints = data.getAsVector3fArray("fixedPoints");
randomPoints = data.getAsArray("randomPoints");
width = data.getAsFloat("width", width);
segments = data.getAsInteger("segments", segments);
tension = data.getAsFloat("tension", tension);
cycle = data.getAsBoolean("cycle", cycle);
up = data.getAsVector3f("up", up).normalizeLocal();
dimension = data.getAsInteger("dimension", dimension);
if (fixedPoints == null && randomPoints == null)
throw new NullPointerException("need fixedPoints or randomPoints");
// 生成路径点
if (fixedPoints == null) {
fixedPoints = new Vector3f[randomPoints.length];
for (int i = 0; i < randomPoints.length; i++) {
Vector3f point = new Vector3f();
((Position)Loader.load(randomPoints[i])).getPoint(point);
fixedPoints[i] = point;
}
}
MySpline spline = createSpline(fixedPoints, tension, cycle);
if(dimension > 1) {
// 计算出实际的维度旋转轴
TempVars tv = TempVars.get();
Vector3f nextPoint = tv.vect1;
Vector3f forward = tv.vect2;
Vector3f left = tv.vect3;
Vector3f rotAxis = tv.vect4;
spline.getSplinePoint(spline.getTotalLength() / segments, nextPoint);
nextPoint.subtract(spline.getControlPoints().get(0), forward).normalizeLocal();
up.cross(forward, left).normalizeLocal();
left.cross(up, rotAxis).normalizeLocal();
Quaternion qua = new Quaternion();
Vector3f tempUp = tv.vect5;
float angle = FastMath.PI / dimension;
Node animObject = new Node();
for (int i = 0; i < dimension; i++) {
qua.fromAngleAxis(angle * i, rotAxis);
qua.mult(up, tempUp);
animObject.attachChild(createSurface(spline, tempUp));
}
tv.release();
return animObject;
} else {
return createSurface(spline, up);
}
}