/// <summary> /// デフォーマーごとの使用頂点設定 /// 使用頂点に対して AddUseVertex() / RemoveUseVertex() を実行する /// </summary> /// <param name="sw"></param> /// <param name="deformer"></param> /// <param name="deformerIndex"></param> protected override void SetDeformerUseVertex(bool sw, BaseMeshDeformer deformer, int deformerIndex) { var cdata = ClothData; for (int i = 0; i < cdata.VertexUseCount; i++) { // 未使用頂点は除く if (ClothData.IsInvalidVertex(i)) { continue; } int vindex = cdata.useVertexList[i]; bool fix = !ClothData.IsMoveVertex(i); if (sw) { deformer.AddUseVertex(vindex, fix); } else { deformer.RemoveUseVertex(vindex, fix); } } }
/// <summary> /// デフォーマーごとの使用頂点設定 /// 使用頂点に対して AddUseVertex() / RemoveUseVertex() を実行する /// </summary> /// <param name="sw"></param> /// <param name="deformer"></param> /// <param name="deformerIndex"></param> protected override void SetDeformerUseVertex(bool sw, BaseMeshDeformer deformer, int deformerIndex) { var data = GetDeformerData(); int vcnt = data.UseVertexCount; for (int j = 0; j < vcnt; j++) { int vindex = data.useVertexIndexList[j]; if (sw) { deformer.AddUseVertex(vindex, false); } else { deformer.RemoveUseVertex(vindex, false); } } }
/// <summary> /// デフォーマとの状態を連動 /// ※デフォーマが接続するCoreComponentのStatusとリンクすることに注意! /// </summary> /// <param name="deformer"></param> /// <param name="sw"></param> private void LinkDeformerStatus(BaseMeshDeformer deformer, bool sw) { var core = deformer.Parent.GetComponent <CoreComponent>(); if (core) { // デフォーマが親、クロスコンポーネントが子として接続するので注意!(v1.5.1) if (sw) { Status.AddParentStatus(core.Status); core.Status.AddChildStatus(Status); //Status.AddChildStatus(core.Status); //core.Status.AddParentStatus(Status); } else { Status.RemoveParentStatus(core.Status); core.Status.RemoveChildStatus(Status); //Status.RemoveChildStatus(core.Status); //core.Status.RemoveParentStatus(Status); } } }
/// <summary> /// デフォーマーごとの使用頂点設定 /// 使用頂点に対して AddUseVertex() / RemoveUseVertex() を実行する /// </summary> /// <param name="sw"></param> /// <param name="deformer"></param> /// <param name="deformerIndex"></param> protected override void SetDeformerUseVertex(bool sw, BaseMeshDeformer deformer, int deformerIndex) { // BoneClothには不要 }
/// <summary> /// デフォーマーごとの使用頂点設定 /// 使用頂点に対して AddUseVertex() / RemoveUseVertex() を実行する /// </summary> /// <param name="sw"></param> /// <param name="deformer"></param> /// <param name="deformerIndex"></param> protected abstract void SetDeformerUseVertex(bool sw, BaseMeshDeformer deformer, int deformerIndex);
void CreateClothData(MagicaMeshSpring scr, SpringData sdata, BaseMeshDeformer deformer) { SpringData.DeformerData data = new SpringData.DeformerData(); // 中心位置と方向 var spos = scr.CenterTransform.position; var sdir = scr.CenterTransformDirection; var srot = scr.CenterTransform.rotation; var sscl = scr.Params.SpringRadiusScale; // 半径 float sradius = scr.Params.SpringRadius; // マトリックス var mat = Matrix4x4.TRS(spos, srot, sscl); var imat = mat.inverse; // メッシュデータ List <Vector3> wposList; List <Vector3> wnorList; List <Vector3> wtanList; int vcnt = deformer.GetEditorPositionNormalTangent(out wposList, out wnorList, out wtanList); // 使用頂点とウエイト List <int> selectionList = Enumerable.Repeat(SelectionData.Invalid, vcnt).ToList(); // 仮のセレクションデータ List <int> useVertexIndexList = new List <int>(); List <float> weightList = new List <float>(); for (int i = 0; i < vcnt; i++) { // 範囲チェック var lpos = imat.MultiplyPoint(wposList[i]); var dist = lpos.magnitude; if (dist <= sradius) { // 距離割合 var dratio = Mathf.InverseLerp(0.0f, sradius, dist); var dpower = scr.Params.GetSpringDistanceAtten(dratio); // 方向割合 var dir = wposList[i] - spos; var ang = Vector3.Angle(sdir, dir); var aratio = Mathf.InverseLerp(0.0f, 180.0f, ang); var apower = scr.Params.GetSpringDirectionAtten(aratio); // ウエイト算出 float weight = Mathf.Clamp01(dpower * apower * scr.Params.SpringIntensity); // 登録 useVertexIndexList.Add(i); weightList.Add(weight); selectionList[i] = SelectionData.Move; } } // 利用頂点とトライアングル接続する頂点をウエイト0でマークする // クロスデータ用にセレクションデータを拡張する // (1)無効頂点の隣接が移動/固定頂点なら拡張に変更する selectionList = deformer.MeshData.ExtendSelection(selectionList, true, false); // 拡張となった頂点を固定としてウエイト0でマークする for (int i = 0; i < vcnt; i++) { if (selectionList[i] == SelectionData.Extend) { useVertexIndexList.Add(i); weightList.Add(0.0f); } } // デフォーマーデータ登録 data.deformerDataHash = deformer.GetDataHash(); data.vertexCount = deformer.MeshData.VertexCount; data.useVertexIndexList = useVertexIndexList.ToArray(); data.weightList = weightList.ToArray(); sdata.deformerData = data; // 設計時スケール Transform influenceTarget = scr.Params.GetInfluenceTarget() ? scr.Params.GetInfluenceTarget() : scr.transform; sdata.initScale = influenceTarget.lossyScale; }