3.6 Blendshapes如何使用?

如题,在官方文档中看到有blendshape支持,所以想要尝试一下


但是在cocos里面没有看到有对应的blendshape参数,同样的模型在unity中是有对应参数的


虽然界面上面没有对应参数接口,但是在尝试官方示例的 Morph时发现可以获取到数据。

使用方式可参考范例 MorphGitHub | Gitee)。


但是获取到的数据很奇怪,有23*56个,按照unity中的数据个数,应该是56个。因此我对比了官方示例的模型数据。

发现官方的模型数据在cocos和unity中都是10个参数。

然后我在示例工程中使用我的模型修改weight,所有参数修改都没有作用,请问一下各位大佬,cocos中要如何正确使用Blendshapes呢?

同求,网上连个像样的例子都搜不到

Creator 每个网格是由多个子网格组成,并且允许每个子网格都可以有不同数量的形状(Shape),尽管几乎所有模型里面,子网格的形状数量一定相同。


如果有形变动画,动画播放的时候就会自动生效。

如果是手动设置控制每个形状的权重,可以看下:

  • MeshRenderer.setWeights:设置某个子网格的所有形状的权重

  • MeshRenderer.setWeight: 设置某个子网格的某个形状的权重

例如:

function setAllWeights(meshRenderer: MeshRenderer, weights: number[]) {
  const { mesh } = meshRenderer;
  if (!mesh || !mesh.morph) {
    return;
  }

  // 确保一下所有子网格的形状数量都是 `weights.length`
  assert(mesh.morph.subMeshMorphs.every((subMeshMorph) => subMeshMoprh?.targets.length === weights.length));

  // 设置每个子网格的形状权重
  const nSubMeshes = mesh.struct.primitives.length;
  for (let iSubMesh = 0; iSubMesh < nSubMeshes; ++iSubMesh) {
    meshRenderer.setWeights(iSubMesh, weights);
  }
}

:+1: :+1: :+1: :+1: :+1:

3.5.2可以用这个方法吗, 目前我们想使用 3.5.2 去控制这个blendshapes。
@shrinktofit

找到了。

以后应该是可以把这个功能提供到界面上的把

可以用在 3.5。

以后应该是可以把这个功能提供到界面上的把

是的

我可以在 动画编辑器里面改 这些参数吗

然后给美术做动画

但是这样好像没用, 比如我在 第0帧是 0 . 第30帧是 0.5 第60帧是1.

可是我运行的时候并没有发生改变, 只有节点的基本属性, scale 什么的是生效的

不对啊 动画编辑器里面这些应该都上锁了呀 你这个为啥没上锁

上锁? 我用的 3.6.0 我在编辑器。 找到给挂载这个功能的脚本。 image

然后可选属性就多了这些。 看代码 设置这个应该是会直接刷新的啊

这个后续会把bs名字扩展到编辑器下么。
1.这个targets和这个targetNames这个会合并么,看json数据这两个数组长度应该是一致的。
2.黄线椭圆框的地方是同一个bs多帧的情况。这个是被拆成同级一样的多条数据了么(unity里面是只有不同名的两个bs名字,然后第一个是3帧)

你问错人啦,问引擎组大佬,

这个后续会把bs名字扩展到编辑器下么。
1.这个targets和这个targetNames这个会合并么,看json数据这两个数组长度应该是一致的。
2.黄线椭圆框的地方是同一个bs多帧的情况。这个是被拆成同级一样的多条数据了么(unity里面是只有不同名的两个bs名字,然后第一个是3帧)

大佬!怎么批量修改uuid并且不会造成场景资源丢失?(急求!借楼求助一下!)

已经解决了。 是没有调用到 set weightcontrol, 因为我改数组里面的参数,没有调用到数组这个参数的set方法。

我弄懂了。 这样我弄一个num1, 然后改num1 的时候去 set weightcontrol。

然后我的动画编辑器里面,改的 num1参数就可以了。 其实直接改整个数组也可以,接下来再优化了。

后面美术就可以有几个面,就在那个对于的面的 num 参数在动画编辑器里,编辑就可以了。

你这个问题描述有点模糊,没看懂你是要实现什么或者是解决什么问题?不是很好回答 :dog:

你把子游戏复制一个然后用编辑器打开工程,关闭编辑器再把原来的子游戏拖出去,再用编辑器打开工程你就会看到复制的那个子游戏场景全是miss

你可以把子游戏打成一个bundle包 然后在自己大厅工程里面去加载子游戏的bundle 这样可以实现 或者你可以试试导出能不能实现

并不行,这样导入的 复制游戏 的场景里面所有挂载的东西会全都变成引用为被复制的那些资源