本文整理汇总了Java中com.jme3.animation.SkeletonControl.getSkeleton方法的典型用法代码示例。如果您正苦于以下问题:Java SkeletonControl.getSkeleton方法的具体用法?Java SkeletonControl.getSkeleton怎么用?Java SkeletonControl.getSkeleton使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类com.jme3.animation.SkeletonControl
的用法示例。
在下文中一共展示了SkeletonControl.getSkeleton方法的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Java代码示例。
示例1: showSkeleton
import com.jme3.animation.SkeletonControl; //导入方法依赖的package包/类
public void showSkeleton(Node n) {
Skeleton sk = null;
SkeletonControl sc = n.getControl(SkeletonControl.class);
if (sc != null) {
sk = sc.getSkeleton();
}
AnimControl control = n.getControl(AnimControl.class);
if (sk == null && control != null) {
sk = control.getSkeleton();
}
if (sk != null) {
final SkeletonDebugger skeletonDebug = new SkeletonDebugger("skeleton." + n.getName(), sk);
final Material mat = new Material(getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
mat.setColor("Color", ColorRGBA.Green);
mat.getAdditionalRenderState().setWireframe(true);
mat.getAdditionalRenderState().setDepthTest(false);
skeletonDebug.setMaterial(mat);
n.attachChild(skeletonDebug);
}
}
示例2: showSkeleton
import com.jme3.animation.SkeletonControl; //导入方法依赖的package包/类
public void showSkeleton(Node n) {
Skeleton sk = null;
SkeletonControl sc = n.getControl(SkeletonControl.class);
if (sc != null) {
sk = sc.getSkeleton();
}
AnimControl control = n.getControl(AnimControl.class);
if (sk == null && control != null) {
sk = control.getSkeleton();
}
if (sk != null) {
final SkeletonDebugger skeletonDebug = new SkeletonDebugger("skeleton." + n.getName(), sk);
final Material mat = new Material(getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
mat.setColor("Color", ColorRGBA.Green);
mat.getAdditionalRenderState().setWireframe(true);
mat.getAdditionalRenderState().setDepthTest(false);
skeletonDebug.setMaterial(mat);
n.attachChild(skeletonDebug);
}
}
示例3: trySwitchToHardware
import com.jme3.animation.SkeletonControl; //导入方法依赖的package包/类
/**
* 打开skin的hws,如果角色actor主SkeletonControl已经打开该功能,则该方法将偿试打开skinNode的hws以配合角色骨骼.
* @param actor
* @param skinNode
*/
public static void trySwitchToHardware(Entity actor, Spatial skinNode) {
// 如果hsw未打开,则不需要管,交由sc内部去一起处理就可以.
SkeletonControl sc = actor.getSpatial().getControl(SkeletonControl.class);
if (!sc.isHardwareSkinningUsed()) {
return;
}
// 如果hsw已经开启过了,则需要把skinNode处理后再添加到actor中,否则skinNode将无法启用hsw
final Set<Mesh> targets = new HashSet<Mesh>();
final Set<Material> materials = new HashSet<Material>();
Node tempNode = new Node();
tempNode.attachChild(skinNode);
findTargets(tempNode, targets, materials);
// Next full 10 bones (e.g. 30 on 24 bones)
Skeleton skeleton = sc.getSkeleton();
int numBones = ((skeleton.getBoneCount() / 10) + 1) * 10;
for (Material m : materials) {
m.setInt("NumberOfBones", numBones);
}
for (Mesh mesh : targets) {
if (mesh.isAnimated()) {
mesh.prepareForAnim(false);
}
}
sc.setSpatial(actor.getSpatial());
}
示例4: checkEnableHardwareSkining
import com.jme3.animation.SkeletonControl; //导入方法依赖的package包/类
/**
* 检测并判断是否打开或关闭该模型的硬件skining加速
*/
private static void checkEnableHardwareSkining(Spatial actorModel) {
SkeletonControl sc = actorModel.getControl(SkeletonControl.class);
if (sc == null) {
return;
}
// 代换自定义的SkeletonControl,因为默认的SkeletonControl会把带
// SkeletonControl的子节点也进行处理。比如弓武器,当弓武器带有动画时可能
// 导致角色的SkeletonControl和弓的SkeletonControl存在冲突导致弓模型变形
CustomSkeletonControl csc = new CustomSkeletonControl(sc.getSkeleton());
actorModel.removeControl(sc);
actorModel.addControl(csc);
csc.setHardwareSkinningPreferred(true);
}
示例5: simpleInitApp
import com.jme3.animation.SkeletonControl; //导入方法依赖的package包/类
@Override
public void simpleInitApp() {
// assetManager.registerLocator("assets/", FileLocator.class);
// 关闭第一人称
// flyCam.setEnabled(false);
this.getFlyByCamera().setMoveSpeed(30);
cam.setFrustumPerspective(45, (float) cam.getWidth() / cam.getHeight(), 0.1F, 1000);
AmbientLight amb = new AmbientLight();
amb.setColor(new ColorRGBA(0.6F, 0.8F, 0.8F, 1.0f));
rootNode.addLight(amb);
DirectionalLight light = new DirectionalLight();
light.setColor(new ColorRGBA(1.0f, 0.9f, 0.8f, 1.0f));
light.setDirection(new Vector3f(0F, -0.779F, 0.627F));
rootNode.addLight(light);
// 第一步加载骨骼文件
ske = (Node) assetManager.loadModel("Models/actor/ske.mesh.j3o");
SkeletonControl sc = ske.getControl(SkeletonControl.class);
CustomSkeletonControl csc = new CustomSkeletonControl(sc.getSkeleton());
ske.removeControl(sc);
ske.addControl(csc);
// csc.setHardwareSkinningPreferred(true);
rootNode.attachChild(ske);
addSkeletonAnim(assetManager.loadModel("Models/actor/ext_anim/idle_run.mesh.j3o"), ske);
// 加载初始化皮肤
ske.attachChild(assetManager.loadModel("Models/actor/female/foot.003.mesh.j3o"));
// 播放动画
AnimControl animControl = ske.getControl(AnimControl.class);
System.out.println(animControl.getAnimationNames().toString());
anim = animControl.createChannel();
anim.setAnim("idle_run");
keyMapping();
}
示例6: doLink
import com.jme3.animation.SkeletonControl; //导入方法依赖的package包/类
@Override
public boolean doLink(RelationsMerger loader,RefData data, Logger log) {
XbufAnimation op1=getRef1(data,XbufAnimation.class,log);
Spatial op2=getRef2(data,Spatial.class,log);
if(op1==null||op2==null)return false;
AnimControl c=op2.getControl(AnimControl.class);
if(c==null){
SkeletonControl sc=op2.getControl(SkeletonControl.class);
c=sc!=null?new AnimControl(sc.getSkeleton()):new AnimControl();
op2.addControl(c);
}
c.addAnim(op1.toJME(c.getSkeleton()));
return true;
}
示例7: redirectBoneIndex
import com.jme3.animation.SkeletonControl; //导入方法依赖的package包/类
public static void redirectBoneIndex(String outfitFile, String rigSkeFile) {
AssetManager am = LuoYing.getAssetManager();
Spatial outfit = am.loadModel(outfitFile);
if (outfit.getUserData(REDIRECT_BONE_INDEX_OK) != null) {
logger.log(Level.WARNING, "Outfit name={0} has already Redirect bone index!", outfit.getName());
return;
}
AnimControl outfitAC = outfit.getControl(AnimControl.class);
SkeletonControl outfitSC = outfit.getControl(SkeletonControl.class);
if (outfitSC == null) {
return;
}
// 移除control
outfit.removeControl(outfitAC);
outfit.removeControl(outfitSC);
// 重定向boneIndex
Skeleton rigSke = am.loadModel(rigSkeFile).getControl(SkeletonControl.class).getSkeleton();
// skin中可能存在多个Geometry,每一个都要进行处理.
List<Geometry> geos = GeometryUtils.findAllGeometry(outfit);
Skeleton outfitSke = outfitSC.getSkeleton(); // skin中的骨骼(已丢弃)
for (Geometry geo : geos) {
// 找到Mesh中的骨骼索引
// 这里需要检测并初始化一次就可以, 不能重复做,即使skin是重新load进来的
// 因为geometry或mesh可能进行了缓存,所以即使重新Loader.loadSkin(),可能
// 载入的对象仍然引用相同的mesh.所以这里需要通过判断,避免对skin mesh
// 中的骨骼索引重定向多次,只有第一次是正确的,第二次及后续一定错误,因为数据覆盖了.
Mesh mesh = geo.getMesh();
logger.log(Level.INFO, "==MaxNumWeights={0}", mesh.getMaxNumWeights());
VertexBuffer indices = mesh.getBuffer(VertexBuffer.Type.BoneIndex);
if (!indices.getData().hasArray()) {
// Prepares the mesh for software skinning by converting the bone index and weight buffers to heap buffers.
// 另参考: SkeletonControl => void resetToBind()
mesh.prepareForAnim(true);
}
// 重定向
ByteBuffer ib = (ByteBuffer) indices.getData();
ib.rewind();
byte[] fib = ib.array();
for (int i = 0; i < fib.length; i++) {
int bIndex = fib[i] & 0xff; // bIndex是skin中子骨骼
// 这里一般不会发生, 除非做了第二次骨骼索引的重定向,
// 否则skin中的初始骨骼索引不可能会大于或等于它的骨骼数(最大索引为BoneCount-1)
if (bIndex >= outfitSke.getBoneCount()) {
logger.log(Level.WARNING, "SkinSke bone index big than boneCount, bIndex={0}, totalBone={1}"
, new Object[] {bIndex, outfitSke.getBoneCount()});
continue;
}
String boneName = outfitSke.getBone(bIndex).getName();
// 从父骨骼中找出与skin中当前骨头相同名称的骨头.
int rootBoneIndex = rigSke.getBoneIndex(boneName);
if (rootBoneIndex != -1) {
logger.log(Level.INFO, "update bone index, skin={0}, index update: {1} to {2}"
, new Object[]{outfit.getName(), fib[i], rootBoneIndex});
fib[i] = (byte) rootBoneIndex;
} else {
// 如果skinNode中的骨骼没有在父骨骼中找到,则随便直接绑定到父骨骼的根节点中.
// 出现这种情况主要是skin中存在额外的骨骼,这个骨头不知道要绑定到哪里?!!?
fib[i] = 0;
logger.log(Level.WARNING, "SkinSke found a extra bone, but not know where to bind to! boneName={0}"
, boneName);
}
}
indices.updateData(ib);
}
outfit.setUserData(REDIRECT_BONE_INDEX_OK, "1");
ModelFileUtils.saveTo(outfit, outfitFile);
}