gpt4 book ai didi

actionscript-3 - 如何在 Away3D 中以编程方式移动加载 Assets 的骨骼?

转载 作者:行者123 更新时间:2023-12-03 22:43:34 24 4
gpt4 key购买 nike

我正在将 3D Assets 加载到 Away3D 场景中,我想在代码中移动骨骼的位置。

Assets 加载一切顺利,我捕获了一个指向 Mesh 的指针。和 Skeleton加载时:

private function onAssetComplete(evt:AssetEvent):void
{
if(evt.asset.assetType == AssetType.SKELETON){
_skeleton = evt.asset as Skeleton;
} else if (evt.asset.assetType == AssetType.MESH) {
_mesh = evt.asset as Mesh;
}
}

Assets 加载完成后,我有一个有效的 SkeletonMesh例如,模型在我的场景中也是可见的。我尝试的下一件事是以下内容。
// create a matrix with the desired joint (bone) position
var pos:Matrix3D = new Matrix3D();
pos.position = new Vector3D(60, 0, 0);
pos.invert();

// get the joint I'd like to modifiy. The bone is named "left"
var joint:SkeletonJoint = _skeleton.jointFromName("left");

// assign joint position
joint.inverseBindPose = pos.rawData;

此代码运行没有错误,但新位置并未应用于可见几何体,例如。骨骼的位置根本没有改变。

我在这里缺少额外的步骤吗?我是否必须将骨架重新分配给 Mesh不知何故?或者我是否必须明确告诉网格骨骼位置已经改变?

最佳答案

这可能不是解决此问题的最佳方法,但这是我发现的:

Away3D 仅在存在动画时将关节变换应用于几何体。为了应用你的变换,你的几何体必须有一个动画,否则你必须在代码中创建一个动画。这是您的操作方法(最好在您的 LoaderEvent.RESOURCE_COMPLETE 处理程序方法中:

// create a new pose for the skeleton
var rootPose:SkeletonPose = new SkeletonPose();

// add all the joints to the pose
// the _skeleton member is being assigned during the loading phase where you
// look for AssetType.SKELETON inside a AssetEvent.ASSET_COMPLETE listener
for each(var joint:SkeletonJoint in _skeleton.joints){
var m:Matrix3D = new Matrix3D(joint.inverseBindPose);
m.invert();
var p:JointPose = new JointPose();
p.translation = m.transformVector(p.translation);
p.orientation.fromMatrix(m);
rootPose.jointPoses.push(p);
}

// create idle animation clip by adding the root pose twice
var clip:SkeletonClipNode = new SkeletonClipNode();
clip.addFrame(rootPose, 1000);
clip.addFrame(rootPose, 1000);
clip.name = "idle";

// build animation set
var animSet:SkeletonAnimationSet = new SkeletonAnimationSet(3);
animSet.addAnimation(clip);

// setup animator with set and skeleton
var animator:SkeletonAnimator = new SkeletonAnimator(animSet, _skeleton);

// assign the newly created animator to your Mesh.
// This example assumes that you grabbed the pointer to _myMesh during the
// asset loading stage (by looking for AssetType.MESH)
_myMesh.animator = animator;

// run the animation
animator.play("idle");

// it's best to keep a member that points to your pose for
// further modification
_myPose = rootPose;

在初始化步骤之后,您可以动态修改您的关节姿势(您可以通过修改 translation 属性来更改位置,并通过更改 orientation 属性来更改旋转)。例子:
_myPose.jointPoses[2].translation.x = 100;

如果您不知道关节的索引,而是按名称寻址骨骼,这应该有效:
var jointIndex:int = _skeleton.jointIndexFromName("myBoneName");
_myPose.jointPoses[jointIndex].translation.y = 10;

如果您经常使用名称查找(比如每一帧)并且您的模型中有很多骨骼,建议构建一个 Dictionary您可以在其中按名称查找骨骼索引。造成这种情况的原因是 jointIndexFromName的实现对所有关节执行线性搜索,如果多次执行此操作会很浪费。

关于actionscript-3 - 如何在 Away3D 中以编程方式移动加载 Assets 的骨骼?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20372441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com