@Override public void visit(Spatial spatial) { SkeletonControl control = spatial.getControl(SkeletonControl.class); if (control != null) { Armature armature = skeletonArmatureMap.get(control.getSkeleton()); SkinningControl skinningControl = new SkinningControl(armature); Map<String, List<Spatial>> attachedSpatials = new HashMap<>(); for (int i = 0; i < control.getSkeleton().getBoneCount(); i++) { Bone b = control.getSkeleton().getBone(i); Node n = control.getAttachmentsNode(b.getName()); n.removeFromParent(); if (!n.getChildren().isEmpty()) { attachedSpatials.put(b.getName(), n.getChildren()); } } spatial.removeControl(control); spatial.addControl(skinningControl); for (String name : attachedSpatials.keySet()) { List<Spatial> spatials = attachedSpatials.get(name); for (Spatial child : spatials) { skinningControl.getAttachmentsNode(name).attachChild(child); } } } }
@Override public void simpleInitApp() { flyCam.setMoveSpeed(10f); cam.setLocation(new Vector3f(6.4013605f, 7.488437f, 12.843031f)); cam.setRotation(new Quaternion(-0.060740203f, 0.93925786f, -0.2398315f, -0.2378785f)); DirectionalLight dl = new DirectionalLight(); dl.setDirection(new Vector3f(-0.1f, -0.7f, -1).normalizeLocal()); dl.setColor(new ColorRGBA(1f, 1f, 1f, 1.0f)); rootNode.addLight(dl); Spatial model = (Spatial) assetManager.loadModel("Models/Oto/OtoOldAnim.j3o"); model.center(); control = model.getControl(AnimControl.class); control.addListener(this); channel = control.createChannel(); for (String anim : control.getAnimationNames()) System.out.println(anim); channel.setAnim("stand"); geom = (Geometry)((Node)model).getChild(0); SkeletonControl skeletonControl = model.getControl(SkeletonControl.class); Box b = new Box(.25f,3f,.25f); Geometry item = new Geometry("Item", b); item.move(0, 1.5f, 0); item.setMaterial(assetManager.loadMaterial("Common/Materials/RedColor.j3m")); Node n = skeletonControl.getAttachmentsNode("hand.right"); n.attachChild(item); rootNode.attachChild(model); inputManager.addListener(this, "Attack"); inputManager.addMapping("Attack", new KeyTrigger(KeyInput.KEY_SPACE)); }
@Override public void simpleInitApp() { flyCam.setMoveSpeed(10f); cam.setLocation(new Vector3f(6.4f, 7.5f, 12.8f)); cam.setRotation(new Quaternion(-0.060740203f, 0.93925786f, -0.2398315f, -0.2378785f)); DirectionalLight dl = new DirectionalLight(); dl.setDirection(new Vector3f(-0.1f, -0.7f, -1).normalizeLocal()); dl.setColor(ColorRGBA.White); rootNode.addLight(dl); Spatial model = assetManager.loadModel("Models/Jaime/Jaime.j3o"); control = model.getControl(AnimControl.class); SkeletonControl skeletonControl = model.getControl(SkeletonControl.class); model.center(); model.setLocalScale(5f); control.addListener(this); channel = control.createChannel(); channel.setAnim("Idle"); Box box = new Box(0.3f, 0.02f, 0.02f); Geometry saber = new Geometry("saber", box); saber.move(0.4f, 0.05f, 0.01f); Material red = assetManager.loadMaterial("Common/Materials/RedColor.j3m"); saber.setMaterial(red); Node n = skeletonControl.getAttachmentsNode("hand.R"); n.attachChild(saber); rootNode.attachChild(model); inputManager.addListener(this, "Attack"); inputManager.addMapping("Attack", new KeyTrigger(KeyInput.KEY_SPACE)); }
public Node getBoneAttachmentsNode(String boneName) { if (myJME3ModelSceneNode != null) { SkeletonControl sc = myJME3ModelSceneNode.getControl(SkeletonControl.class); return sc.getAttachmentsNode(boneName); } else { return null; } }
q.fromAngles(0f, 0f, 90f); obj.setLocalRotation(q); attachmentsNode = sc.getAttachmentsNode("LThumb"); } else if (partOfBody == PartOfBody.RightHand) { obj.setLocalTranslation(0, 0.05f, 0.02f); q.fromAngles(0f, 0f, 90f); obj.setLocalRotation(q); attachmentsNode = sc.getAttachmentsNode("RThumb"); } else if (partOfBody == PartOfBody.RightWrist) { obj.setLocalTranslation(0, 0.0f, 0.02f); attachmentsNode = sc.getAttachmentsNode("RightHand"); } else if (partOfBody == PartOfBody.LeftWrist) { obj.setLocalTranslation(0, 0.0f, 0.02f); attachmentsNode = sc.getAttachmentsNode("LeftHand"); } else if (partOfBody == PartOfBody.LeftWrist) { obj.setLocalTranslation(0, 0.0f, 0.02f); attachmentsNode = sc.getAttachmentsNode("LeftHand"); } else if (partOfBody == PartOfBody.LeftUnkle) { obj.setLocalRotation(new Quaternion().fromAngles(0f, FastMath.HALF_PI, -FastMath.HALF_PI)); obj.setLocalTranslation(0.04f, 0f, -0.1f); attachmentsNode = sc.getAttachmentsNode("LeftFoot"); } else if (partOfBody == PartOfBody.RightUnkle) { obj.setLocalRotation(new Quaternion().fromAngles(0f, FastMath.HALF_PI, -FastMath.HALF_PI)); obj.setLocalTranslation(-0.04f, 0f, -0.1f); attachmentsNode = sc.getAttachmentsNode("RightFoot"); } else if (partOfBody == PartOfBody.Chest) { obj.setLocalTranslation(0f, 0.1f, 0.2f); attachmentsNode = sc.getAttachmentsNode("Spine1");
private void setupControls() { for (SkinData skinData : skinnedSpatials.keySet()) { List<Spatial> spatials = skinnedSpatials.get(skinData); Spatial spatial = skinData.parent; if (spatials.isEmpty()) { continue; } if (spatials.size() >= 1) { spatial = findCommonAncestor(spatials); } if (skinData.parent != null && spatial != skinData.parent) { skinData.rootBoneTransformOffset = spatial.getWorldTransform().invert(); skinData.rootBoneTransformOffset.combineWithParent(skinData.parent.getWorldTransform()); } if (skinData.animControl != null && skinData.animControl.getSpatial() == null) { spatial.addControl(skinData.animControl); } spatial.addControl(skinData.skeletonControl); } for (int i = 0; i < nodes.size(); i++) { BoneWrapper bw = fetchFromCache("nodes", i, BoneWrapper.class); if (bw == null || bw.attachedSpatial == null) { continue; } SkinData skinData = fetchFromCache("skins", bw.skinIndex, SkinData.class); skinData.skeletonControl.getAttachmentsNode(bw.bone.getName()).attachChild(bw.attachedSpatial); } }