3.4.2版本模型变形bug

在最新版本3.4.2版本中,角色无法变形,但3.4.1版本正常。使用test-cases-3d的MorphController代码来变形。
代码中下:


import { assert, CCFloat, Component, Mesh, MeshRenderer, _decorator } from 'cc';
const { ccclass, property, requireComponent, executeInEditMode } = _decorator;

@ccclass('MorphController')
@requireComponent(MeshRenderer)
@executeInEditMode
export class MorphController extends Component {
    @property([CCFloat])
    private _widgets: number[] = [];
    @property({ type: [CCFloat], min: 0, max: 1, slide: true, step: 0.01 })
    public get widgets(): number[] {
        return this._widgets;
    }
    public set widgets(value: number[]) {
        this._widgets = value;
        this.setWeights(value);
    }

    private _morph!: NonNullable<Mesh['struct']['morph']>;
    private _modelComp: MeshRenderer;

    onLoad() {
        let modelComp = this.node.getComponent(MeshRenderer)!;
        this._modelComp = modelComp;
        const mesh = modelComp.mesh;
        if (mesh == null) return;

        this._morph = mesh.struct.morph!;
        if (this._morph == null) return;

        if (this._morph.subMeshMorphs.length === 0) {
            // TODO submeshcount是0
            console.warn('submesh count is 0');
            return;
        }

        const firstNonNullSubMeshMorph = this._morph.subMeshMorphs.find((subMeshMorph) => !!subMeshMorph);
        if (!firstNonNullSubMeshMorph) {
            // TODO 任何 submesh 都没有Morph
            console.warn(`all submesh don't have morph`)
            return;
        }

        if (!this._morph.subMeshMorphs.every((subMeshMorph) => !subMeshMorph || subMeshMorph.targets.length === firstNonNullSubMeshMorph.targets.length)) {
            // TODO 每个 submesh 的target数量不一样
            console.warn(`not all submesh count are the same`);
        }
        const subMeshMorph = this._morph.subMeshMorphs[0];
        const nTargets = subMeshMorph ? subMeshMorph.targets.length : 0;
        assert(nTargets == this.widgets.length);
        this._widgets.length = nTargets;
        console.log("onLoad ", nTargets);
    }

    start(): void {
        this.setWeights(this.widgets);
    }

    public setWeights(weights: number[]): void {
        if (weights.length === 0) return;

        for (let iSubMeshMorph = 0; iSubMeshMorph < this._morph.subMeshMorphs.length; ++iSubMeshMorph) {
            if (this._morph.subMeshMorphs[iSubMeshMorph]) {
                this._modelComp.setWeights(weights, iSubMeshMorph);
            }
        }
    }
}

3.4.2版本截图:
image
3.4.1版本截图:
image

模型方便私发看下?

因为模型是项目关系,只能私发了,麻烦给个联系方式。

215194780@qq.com

邮件已发送,请查收。

已经建立相关 issue 在跟了,后续有进展会同步在这,感谢反馈!

麻烦给个issue的链接

嘿,这模型和unity商店的一个好像 :smile:


合这个pr 试试

感谢,我在3.5版本再试这个功能了,目前项目已经使用3.4.1发布了。