private List <BVHElement> ReadChildren(StreamReader sr) { List <BVHElement> children = new List <BVHElement>(); while (true) { BVHElement bvhe = new BVHElement(); ReadTokens(sr); if (tokens[0] == "ROOT") { bvhe.Type = "ROOT"; bvhe.Name = tokens[1]; } else if (tokens[0] == "JOINT") { bvhe.Type = "JOINT"; bvhe.Name = tokens[1]; } else if (tokens.Length == 2 && tokens[0] == "End" && tokens[1] == "Site") { bvhe.Type = "End Site"; bvhe.Name = "End Site"; } else { return(children); } ReadTokens(sr); Assert(tokens[0] == "{", "Expected {"); ReadTokens(sr); Assert(tokens[0] == "OFFSET", "Expected OFFSET"); Assert(tokens.Length == 4, "Invalid offset"); bvhe.Offset = new Vector3( float.Parse(tokens[1], CultureInfo.InvariantCulture), float.Parse(tokens[2], CultureInfo.InvariantCulture), float.Parse(tokens[3], CultureInfo.InvariantCulture)); if (bvhe.Type == "End Site") { ReadTokens(sr); } else { ReadTokens(sr); Assert(tokens[0] == "CHANNELS", "Expected CHANNELS"); Assert(tokens.Length >= 2, "Channels not specified"); int numChannels = int.Parse(tokens[1], CultureInfo.InvariantCulture); Assert(tokens.Length == 2 + numChannels, "Invalid channels"); bvhe.Channels = tokens.Skip(2).Take(numChannels).ToArray(); bvhe.Children.AddRange(ReadChildren(sr)); } Assert(tokens[0] == "}", "Expected }"); children.Add(bvhe); } }
private void AddElements(BVHElement bvhElement) { bvhElements.Add(bvhElement); foreach (BVHElement child in bvhElement.Children) { AddElements(child); } }
private void GenerateElements(Transform parent, BVHElement bvh) { GameObject bodyPartGO = new GameObject() { name = bvh.Name }; bodyPartGO.transform.parent = parent; bodyPartGO.transform.localPosition = bvh.Offset / 10f; BodyPart bodyPart = new BodyPart(bodyPartGO, bvh); bodyPart.SetLastFrame(); BodyParts.Add(bodyPart); if (BodyData.bodySpec.ContainsKey(bvh.Name)) { foreach (PrimitiveSpec ps in BodyData.bodySpec[bvh.Name].Shapes) { GameObject go = GameObject.CreatePrimitive(ps.Type); go.transform.parent = bodyPart.GameObject.transform; go.transform.localPosition = ps.Position; go.transform.localRotation = ps.Rotation; go.transform.localScale = ps.Scale; go.layer = 8; // Body if (Material) { go.GetComponent <Renderer>().material = Material; } } } foreach (BVHElement child in bvh.Children) { GenerateElements(bodyPart.GameObject.transform, child); } }
private void GenerateElements(Transform parent, BVHElement bvh) { GameObject bodyPartGO = new GameObject() { name = bvh.Name }; bodyPartGO.transform.parent = parent; bodyPartGO.transform.localPosition = bvh.Offset / 10f; BVHElementLimit bvhLimit = bvhLimits.Limits[bvh.Name]; float meanXLimit = (bvhLimit.AngularXLow + bvhLimit.AngularXHigh) / 2f; float meanYLimit = (bvhLimit.AngularYLow + bvhLimit.AngularYHigh) / 2f; float meanZLimit = (bvhLimit.AngularZLow + bvhLimit.AngularZHigh) / 2f; bodyPartGO.transform.localRotation = Quaternion.identity; bodyPartGO.transform.localRotation *= Quaternion.AngleAxis(meanXLimit, Vector3.right); bodyPartGO.transform.localRotation *= Quaternion.AngleAxis(meanYLimit, Vector3.up); bodyPartGO.transform.localRotation *= Quaternion.AngleAxis(meanZLimit, Vector3.forward); bodyPartGO.AddComponent <Rigidbody>(); //bodyPartGO.GetComponent<Rigidbody>().useGravity = false; BodyPart bodyPart = new BodyPart(bodyPartGO, bvh); BodyParts.Add(bodyPart); if (BodyData.bodySpec.ContainsKey(bvh.Name)) { foreach (PrimitiveSpec ps in BodyData.bodySpec[bvh.Name].Shapes) { GameObject go = GameObject.CreatePrimitive(ps.Type); go.transform.parent = bodyPart.GameObject.transform; go.transform.localPosition = ps.Position; go.transform.localRotation = ps.Rotation; go.transform.localScale = ps.Scale; go.layer = 8; // Body if (Material) { go.GetComponent <Renderer>().material = Material; } } if (bvh.Name != "Hips") { bodyPartGO.AddComponent <ConfigurableJoint>(); ConfigurableJoint cj = bodyPartGO.GetComponent <ConfigurableJoint>(); cj.connectedBody = parent.GetComponent <Rigidbody>(); cj.xMotion = ConfigurableJointMotion.Locked; cj.yMotion = ConfigurableJointMotion.Locked; cj.zMotion = ConfigurableJointMotion.Locked; cj.anchor = BodyData.bodySpec[bvh.Name].JointParameters.Anchor; cj.angularXMotion = ConfigurableJointMotion.Limited; cj.angularYMotion = ConfigurableJointMotion.Limited; cj.angularZMotion = ConfigurableJointMotion.Limited; cj.lowAngularXLimit = new SoftJointLimit { limit = bvhLimit.AngularXLow - meanXLimit }; cj.highAngularXLimit = new SoftJointLimit { limit = bvhLimit.AngularXHigh - meanXLimit }; cj.angularYLimit = new SoftJointLimit { limit = bvhLimit.AngularYHigh - meanYLimit }; cj.angularZLimit = new SoftJointLimit { limit = bvhLimit.AngularZHigh - meanZLimit }; } } foreach (BVHElement child in bvh.Children) { GenerateElements(bodyPart.GameObject.transform, child); } }
public BodyPart(GameObject gameObject, BVHElement bvhElement) { GameObject = gameObject; BVHElement = bvhElement; }