示例#1
0
        public static BvhMotion Parse(BvhDocument doc, BvhTokenizer tokenizer)
        {
            var rt = new BvhMotion();

            if (tokenizer.Current.EnsureKind(BvhTokenizer.IdentifierTokenKind).Text == "MOTION")
                tokenizer.MoveNext();

            tokenizer.MoveNext(BvhTokenizer.NewLineTokenKind);

            var frames = tokenizer.Current.EnsureKind(BvhTokenizer.IdentifierTokenKind).Text == "Frames" ? int.Parse(tokenizer.MoveNext().Text) : 0;

            tokenizer.MoveNext();
            tokenizer.MoveNext(BvhTokenizer.NewLineTokenKind);

            if (tokenizer.Current.EnsureKind(BvhTokenizer.IdentifierTokenKind).Text == "Frame")
                tokenizer.MoveNext();

            rt.FrameTime = tokenizer.Current.EnsureKind(BvhTokenizer.IdentifierTokenKind).Text == "Time" ? float.Parse(tokenizer.MoveNext().Text) : 0;
            tokenizer.MoveNext();

            var joints = GetJoints(doc.Root).ToArray();

            for (int i = 0; i < frames; i++)
            {
                var values = tokenizer.TakeWhile(_ => _.Kind != BvhTokenizer.NewLineTokenKind).Select(_ => _.Text).Select(float.Parse).ToArray();
                var j = 0;

                rt.Frames.Add(joints.ToDictionary(_ => _, _ =>
                {
                    var jm = new BvhJointMotion();
                    var position = new float[3];
                    var rotation = new float[3];

                    foreach (var c in _.Channels)
                        switch (c)
                        {
                            case BvhChannel.XPosition:
                            case BvhChannel.YPosition:
                            case BvhChannel.ZPosition:
                                jm.Position = position;
                                position[(int)c] = values[j++];

                                break;
                            case BvhChannel.XRotation:
                            case BvhChannel.YRotation:
                            case BvhChannel.ZRotation:
                                jm.Rotation = rotation;
                                rotation[c - BvhChannel.XRotation] = values[j++];

                                break;
                        }

                    return jm;
                }));
            }

            return rt;
        }
示例#2
0
        public static BvhMotion Parse(BvhDocument doc, BvhTokenizer tokenizer)
        {
            var rt = new BvhMotion();

            if (tokenizer.Current.EnsureKind(BvhTokenizer.IdentifierTokenKind).Text == "MOTION")
            {
                tokenizer.MoveNext();
            }

            tokenizer.MoveNext(BvhTokenizer.NewLineTokenKind);

            var frames = tokenizer.Current.EnsureKind(BvhTokenizer.IdentifierTokenKind).Text == "Frames" ? int.Parse(tokenizer.MoveNext().Text) : 0;

            tokenizer.MoveNext();
            tokenizer.MoveNext(BvhTokenizer.NewLineTokenKind);

            if (tokenizer.Current.EnsureKind(BvhTokenizer.IdentifierTokenKind).Text == "Frame")
            {
                tokenizer.MoveNext();
            }

            rt.FrameTime = tokenizer.Current.EnsureKind(BvhTokenizer.IdentifierTokenKind).Text == "Time" ? float.Parse(tokenizer.MoveNext().Text) : 0;
            tokenizer.MoveNext();

            var joints = GetJoints(doc.Root).ToArray();

            for (int i = 0; i < frames; i++)
            {
                var values = tokenizer.TakeWhile(_ => _.Kind != BvhTokenizer.NewLineTokenKind).Select(_ => _.Text).Select(float.Parse).ToArray();
                var j      = 0;

                rt.Frames.Add(joints.ToDictionary(_ => _, _ =>
                {
                    var jm       = new BvhJointMotion();
                    var position = new float[3];
                    var rotation = new float[3];

                    foreach (var c in _.Channels)
                    {
                        switch (c)
                        {
                        case BvhChannel.XPosition:
                        case BvhChannel.YPosition:
                        case BvhChannel.ZPosition:
                            jm.Position      = position;
                            position[(int)c] = values[j++];

                            break;

                        case BvhChannel.XRotation:
                        case BvhChannel.YRotation:
                        case BvhChannel.ZRotation:
                            jm.Rotation = rotation;
                            rotation[c - BvhChannel.XRotation] = values[j++];

                            break;
                        }
                    }

                    return(jm);
                }));
            }

            return(rt);
        }