public static BoneStruct ImportFromUDK(UDKExplorer.UDK.Classes.SkeletalMesh.BoneStruct udkBone, UDKExplorer.UDK.UDKObject udkPackage, ME3Explorer.Packages.MEPackage mePackage) { BoneStruct result = new BoneStruct(0, udkBone.Flags, udkBone.Unk1, udkBone.Orientation, udkBone.Position, udkBone.NumChildren, udkBone.Parent, udkBone.BoneColor); string name = udkPackage.GetName(udkBone.Name); result.Name = mePackage.FindNameOrAdd(name); return(result); }
public BoneStruct(GameObject go) { gameObject = go; originalPosition = gameObject.transform.position; localRotation = gameObject.transform.localRotation; Transform child = null; foreach (Transform ch in go.transform) { child = ch; } if (child != null) { boneAxis = (child.transform.position - go.transform.position).normalized; boneLength = Vector3.Distance(go.transform.position, child.position); } }
private TreeNode BonesToTree() { TreeNode res = new TreeNode("Bones (" + Bones.Count + ") Depth : " + SkeletonDepth); for (int i = 0; i < Bones.Count; i++) { BoneStruct b = Bones[i]; string s = i + " : Name : \"" + Owner.GetName(b.Name) + "\" "; s += "Flags : 0x" + b.Flags.ToString("X8") + " "; s += "Unk1 : 0x" + b.Unk1.ToString("X8") + " "; s += "Orientation : X(" + b.Orientation.X + ") Y(" + b.Orientation.X + ") Z(" + b.Orientation.Z + ") W(" + b.Orientation.W + ")"; s += "Position : X(" + b.Position.X + ") Y(" + b.Position.X + ") Z(" + b.Position.Z + ")"; s += "NumChildren : " + b.NumChildren + " "; s += "Parent : " + b.Parent + " "; s += "Color : 0x" + b.BoneColor.ToString("X8"); res.Nodes.Add(s); } return(res); }
private void LateUpdate() { vertices = cloth.vertices; // 頂点コピー(メッシュ頂点⇒ボーン座標) for (int i = 0; i < boneStructs.Count; i++) { int vertexIndex = boneStructs[i].meshIndex; Vector3 v = vertices[vertexIndex]; boneStructs[i].calcClothPosition = skirtRoot.transform.TransformPoint(v); } //return; // ボーン座標から姿勢計算(親から子へ辿る) for (int i = 0; i < boneStructs.Count; i++) { //if (i > 2*2) continue; //if (i % 3 == 0) continue; //if (i % 3 == 1) continue; BoneStruct self = boneStructs[i]; BoneStruct child = boneStructs[i].child; Vector3 selfPosition = self.gameObject.transform.position; if (child == null) { continue; } // 姿勢を初期化 self.gameObject.transform.localRotation = boneStructs[i].localRotation; // 正規化(元のボーンの長さにする) if (self.boneLength != 0) { child.tempPosition = ((child.calcClothPosition - selfPosition).normalized * self.boneLength) + self.calcClothPosition;// selfPosition; } // 位置から回転を求める Vector3 aimVector = self.gameObject.transform.TransformDirection(self.boneAxis); Quaternion aimRotation = Quaternion.FromToRotation(aimVector, child.tempPosition - selfPosition); self.gameObject.transform.rotation = aimRotation * self.gameObject.transform.rotation; } }
private void SerializeBones(SerializingContainer Container) { int count = 0; if (!Container.isLoading) { count = Bones.Count(); } count = Container + count; if (Container.isLoading) { Bones = new List <BoneStruct>(); for (int i = 0; i < count; i++) { Bones.Add(new BoneStruct()); } } for (int i = 0; i < count; i++) { BoneStruct b = Bones[i]; b.Name = Container + b.Name; b.Flags = Container + b.Flags; b.Unk1 = Container + b.Unk1; b.Orientation.X = Container + b.Orientation.X; b.Orientation.Y = Container + b.Orientation.Y; b.Orientation.Z = Container + b.Orientation.Z; b.Orientation.W = Container + b.Orientation.W; b.Position.X = Container + b.Position.X; b.Position.Y = Container + b.Position.Y; b.Position.Z = Container + b.Position.Z; b.NumChildren = Container + b.NumChildren; b.Parent = Container + b.Parent; if (Owner is ME3Package) { b.BoneColor = Container + b.BoneColor; } b.BoneName = Owner.isName(b.Name) ? Owner.Names[b.Name] : "bone_" + b.Name; Bones[i] = b; } SkeletonDepth = Container + SkeletonDepth; }
private void GetChildren(GameObject go, BoneStruct parent, ref List <BoneStruct> boneStructs) { Transform children = go.GetComponentInChildren <Transform>(); if (children.childCount == 0) { return; } foreach (Transform tf in children) { BoneStruct bs = null; if (tf.name.Contains("P_Cos_") == true) { bs = new BoneStruct(tf.gameObject); if (parent != null) { parent.child = bs; } boneStructs.Add(bs); GetChildren(tf.gameObject, bs, ref boneStructs); } } }
void OnDrawGizmosSelected() { { Vector3 v0 = vertices[SelectMeshIndex]; Vector3 v1 = skirtRoot.transform.TransformPoint(v0); Gizmos.color = Color.yellow; Gizmos.DrawSphere(v1 + offset * 3, 0.01f); } // ボーンの位置表示 for (int i = 0; i < boneStructs.Count; i++) { if (i % 3 == 0) { continue; } Gizmos.color = Color.white; if (boneStructs[i].child != null) { // オリジナルボーン Gizmos.color = Color.white; Vector3 pos0 = boneStructs[i].gameObject.transform.position; Vector3 pos1 = boneStructs[i].gameObject.transform.position + boneStructs[i].boneAxis * boneStructs[i].boneLength; Gizmos.DrawLine(pos0, pos1); Gizmos.color = Color.black; // parent Gizmos.DrawSphere(boneStructs[i].gameObject.transform.position, 0.01f); // parent original //Gizmos.DrawSphere(boneStructs[i].originalPosition - offset, 0.01f); // child Gizmos.DrawSphere(boneStructs[i].child.gameObject.transform.position, 0.01f); // child original //Gizmos.DrawSphere(boneStructs[i].child.originalPosition, 0.01f); // child 計算結果(正規化) Gizmos.color = Color.grey; Gizmos.DrawSphere(boneStructs[i].child.tempPosition + offset * 2, 0.01f); // child mesh vertex Gizmos.color = Color.green; Gizmos.DrawSphere(boneStructs[i].child.calcClothPosition + offset * 2, 0.01f); } } return; // そもそも頂点とボーンの繋がりあっている? for (int i = 0; i < boneStructs.Count; i++) { if (i != 0) { continue; } int vertexIndex = boneStructs[i].meshIndex; Vector3 v0 = vertices[vertexIndex]; Vector3 v1 = skirtRoot.transform.TransformPoint(v0); boneStructs[i].calcClothPosition = v1; Gizmos.color = Color.green; Gizmos.DrawSphere(v0, 0.01f); Gizmos.color = Color.blue; Gizmos.DrawSphere(v1 + offset, 0.01f); Gizmos.color = Color.white; Gizmos.DrawSphere(boneStructs[i].gameObject.transform.position, 0.01f); Gizmos.color = Color.cyan; Gizmos.DrawSphere(boneStructs[i].child.gameObject.transform.position, 0.01f); } return; // Cloth計算結果表示 vertices = cloth.vertices; for (int i = 0; i < vertices.Length; i++) { Gizmos.color = Color.yellow; Gizmos.DrawSphere(vertices[i], 0.01f); } // Hipsの姿勢でWorldに変換 for (int i = 0; i < vertices.Length; i++) { Vector3 v = vertices[i]; Vector3 v1 = skirtRoot.transform.TransformPoint(v); Gizmos.color = Color.blue; //Gizmos.DrawSphere(v1, 0.01f); } for (int i = 0; i < boneStructs.Count; i++) { //if (i != 1) continue; BoneStruct self = boneStructs[i]; BoneStruct child = boneStructs[i].child; Vector3 v0 = self.gameObject.transform.position; //Vector3 v1 = skirtRoot.transform.TransformPoint(v0); Gizmos.color = Color.blue; Gizmos.DrawSphere(v0, 0.01f); //Gizmos.DrawSphere(child.calcClothPosition, 0.01f); } return; for (int i = 0; i < boneStructs.Count; i++) { if (i != 1) { continue; } //Gizmos.DrawSphere(boneStructs[i].calcPosition, 0.01f); if (boneStructs[i].child == null) { Gizmos.color = Color.cyan; Gizmos.DrawSphere(boneStructs[i].gameObject.transform.position, 0.01f); } else { Gizmos.color = Color.green; Gizmos.DrawSphere(boneStructs[i].gameObject.transform.position + offset, 0.01f); Gizmos.color = Color.blue; Gizmos.DrawSphere(boneStructs[i].calcPosition + offset, 0.01f); Gizmos.color = Color.white; Gizmos.DrawSphere(boneStructs[i].calcClothPosition + offset, 0.01f); Gizmos.color = Color.cyan; Gizmos.DrawSphere(boneStructs[i].child.calcClothPosition + offset, 0.01f); } } }