Beispiel #1
0
    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);
     }
 }
Beispiel #3
0
        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);
            }
        }
Beispiel #4
0
        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);
            }
        }
Beispiel #5
0
 public BodyPart(GameObject gameObject, BVHElement bvhElement)
 {
     GameObject = gameObject;
     BVHElement = bvhElement;
 }