package framework.animation; import com.sun.j3d.utils.universe.SimpleUniverse; import cv97.SceneGraph; import cv97.j3d.SceneGraphJ3dObject; import cv97.node.Node; import cv97.node.OrientationInterpolatorNode; import cv97.node.PositionInterpolatorNode; import cv97.util.LinkedListNode; import framework.model3D.Position3D; import framework.model3D.Quaternion3D; import framework.schedule.ScheduleManager; import framework.schedule.TaskController; import javax.media.j3d.Canvas3D; import javax.media.j3d.View; public class AnimationFactory { private static Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration()); public static Animation3D loadAnimation(String fileName){ SceneGraph sg = new SceneGraph(SceneGraph.NORMAL_GENERATION); // ファイル読み込み時にレンダリングが行われるので、オフスクリーンレンダリングを禁止する TaskController renderingController = ScheduleManager.getInstance().getController("rendering"); renderingController.waitForActivation(); renderingController.activate(); // ファイル読み込み View view = canvas.getView(); if (view != null) view.removeCanvas3D(canvas); SceneGraphJ3dObject sgObject = new SceneGraphJ3dObject(canvas, sg); sg.setObject(sgObject); sg.load(fileName); // オフスクリーンレンダリングの許可 renderingController.deactivate(); // Animation3Dへの変換 Animation3D animation= loadAnimation(sg); return animation; } private static Animation3D loadAnimation(LinkedListNode node){ Animation3D mergedAnimation = null; System.out.println(node.getClass()); if( ! (node instanceof PositionInterpolatorNode || node instanceof OrientationInterpolatorNode) ){ Node childNodes; String name = ""; if (node instanceof SceneGraph) { childNodes = ((SceneGraph)node).getNodes(); } else { childNodes = ((Node)node).getChildNodes(); name = ((Node)node).getName(); } if(childNodes != null){ for(Node n = childNodes;n != null;n = n.next()){ Animation3D animation; if((animation = loadAnimation(n)) != null){ if (mergedAnimation != null) { mergedAnimation.merge(animation); } else { mergedAnimation = animation; } } //兄弟で無限ループにならないようにする処理 Node dummy = n; dummy = dummy.next(); if(n == dummy){ break; } } // System.out.println("子供の数は"+ list.size()); if(mergedAnimation != null){ return mergedAnimation; } } return null; } else if (node instanceof PositionInterpolatorNode) { String name = ((PositionInterpolatorNode)node).getName(); PositionInterpolatorNode pi = (PositionInterpolatorNode)node; //アニメーションデータの取得 int i=0; PartAnimation pa = new PartAnimation(name); for(i=0;i<pi.getNKeys();i++){ pa.add((long)(pi.getKey(i)*1000),new Position3D(pi.getKeyValue(i)[0], pi.getKeyValue(i)[1], pi.getKeyValue(i)[2])); } //アニメーションの作成 Animation3D animation = new Animation3D(); animation.addPartAnimation(pa); return animation; } else if (node instanceof OrientationInterpolatorNode) { String name = ((OrientationInterpolatorNode)node).getName(); OrientationInterpolatorNode oi = (OrientationInterpolatorNode)node; //アニメーションデータの取得 int i=0; PartAnimation pa = new PartAnimation(name); for(i=0;i<oi.getNKeys();i++){ pa.add((long)(oi.getKey(i) * 1000),new Quaternion3D(oi.getKeyValue(i)[0], oi.getKeyValue(i)[1], oi.getKeyValue(i)[2], oi.getKeyValue(i)[3])); } //アニメーションの作成 Animation3D animation = new Animation3D(); animation.addPartAnimation(pa); return animation; } return null; } }