在最新版本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版本截图:
3.4.1版本截图: