Пример #1
0
        static void Main(string[] args)
        {
            if (args.Length != 2)
            {
                Console.WriteLine("文件路径到vmd文件的第一个参数,请指定文件路径的输出目的地的第二个参数。");
                return;
            }
            String filePath = args[0];
            String fileDest = args[1];

            if (!File.Exists(filePath))
            {
                Console.WriteLine("指定的VMD的文件不存在。");
                return;
            }
            using (FileStream source = File.OpenRead(filePath))
            {
                MotionData data = MotionData.getMotion(source);
                //ヘッダー情報の生製
                Console.WriteLine("报头信息生成");
                VocaloidMotionEvolved vme = new VocaloidMotionEvolved();
                vme.header             = new Header();
                vme.header.versionInfo = "Vocaloid Motion Evolved";
                vme.header.modelInfo.Add(data.header.ModelName);
                //ボーンフレームのインデックス処理
                Console.WriteLine("骨指数VME生成");
                HashSet <String> boneNames = new HashSet <string>();
                foreach (var frameData in data.boneFrameList.boneFrameDatas)
                {
                    boneNames.Add(frameData.BoneName);
                }
                Dictionary <string, ulong> boneIdtable = new Dictionary <string, ulong>();
                ulong id = 0;
                foreach (var boneName in boneNames)
                {
                    boneIdtable.Add(boneName, id);
                    IDTag tag = new IDTag();
                    tag.id   = id;
                    tag.name = boneName;
                    vme.boneIDTable.Add(tag);
                    id++;
                }
                //ボーンフレームの書き出し処理
                Console.WriteLine("骨帧信息生成");
                foreach (var boneName in boneNames)
                {
                    Console.WriteLine("骨架表生成:{0}", boneName);
                    BoneFrameTable frameTable = new BoneFrameTable();
                    frameTable.id = boneIdtable[boneName];
                    foreach (var frameData in data.boneFrameList.boneFrameDatas)
                    {
                        if (frameData.BoneName.Equals(boneName))
                        {
                            BoneFrame frame = new BoneFrame();
                            frame.frameNumber        = frameData.FrameNumber;
                            frame.position           = frameData.BonePosition.ToData();
                            frame.rotation           = frameData.BoneRotatingQuaternion.ToData();
                            frame.interpolParameters = new BezInterpolParams();
                            BezInterpolParams interpol = frame.interpolParameters;
                            interpol.X1 = new bvec2()
                            {
                                x = frameData.Interpolation[0][0][0],
                                y = frameData.Interpolation[0][1][0]
                            };
                            interpol.X2 = new bvec2()
                            {
                                x = frameData.Interpolation[0][2][0],
                                y = frameData.Interpolation[0][3][0]
                            };
                            interpol.Y1 = new bvec2()
                            {
                                x = frameData.Interpolation[0][0][1],
                                y = frameData.Interpolation[0][1][1]
                            };
                            interpol.Y2 = new bvec2()
                            {
                                x = frameData.Interpolation[0][2][1],
                                y = frameData.Interpolation[0][3][1]
                            };
                            interpol.Z1 = new bvec2()
                            {
                                x = frameData.Interpolation[0][0][2],
                                y = frameData.Interpolation[0][1][2]
                            };
                            interpol.Z2 = new bvec2()
                            {
                                x = frameData.Interpolation[0][2][2],
                                y = frameData.Interpolation[0][3][2]
                            };
                            interpol.R1 = new bvec2()
                            {
                                x = frameData.Interpolation[0][0][3],
                                y = frameData.Interpolation[0][1][3]
                            };
                            interpol.R2 = new bvec2()
                            {
                                x = frameData.Interpolation[0][2][3],
                                y = frameData.Interpolation[0][3][3]
                            };
                            frameTable.frames.Add(frame);
                        }
                    }
                    frameTable.frames.Sort(new FrameComparator());
                    vme.boneFrameTables.Add(frameTable);
                }
                Console.WriteLine("ボーンフレームリスト生成完了");
                Console.WriteLine("モーフ用フレームリスト生成");
                HashSet <String> faceNames = new HashSet <string>();
                foreach (var frameData in data.morphFrameList.morphFrameDatas)
                {
                    faceNames.Add(frameData.Name);
                }
                Dictionary <string, ulong> faceIdtable = new Dictionary <string, ulong>();
                id = 0;
                foreach (var faceName in faceNames)
                {
                    faceIdtable.Add(faceName, id);
                    IDTag tag = new IDTag();
                    tag.id   = id;
                    tag.name = faceName;
                    vme.morphIDTable.Add(tag);
                    id++;
                }
                foreach (var morphName in faceNames)
                {
                    Console.WriteLine("モーフフレームテーブル生成:{0}", morphName);
                    MorphFrameTable frameTable = new MorphFrameTable();
                    frameTable.id = faceIdtable[morphName];
                    foreach (var frameData in data.morphFrameList.morphFrameDatas)
                    {
                        if (frameData.Name.Equals(morphName))
                        {
                            MorphFrame frame = new MorphFrame();
                            frame.frameNumber = frameData.FrameNumber;
                            frame.value       = frameData.MorphValue;
                            frameTable.frames.Add(frame);
                        }
                    }
                    frameTable.frames.Sort(new FrameComparator());
                    vme.morphFrameTables.Add(frameTable);
                }
                Console.WriteLine("モーフフレーム生成完了");
                if (data.CameraFrames.CameraFrameCount > 0)
                {
                    Console.WriteLine("カメラ用フレームリスト生成");
                    IDTag camTag = new IDTag();
                    camTag.id   = 0;
                    camTag.name = "Default";
                    vme.cameraIDTable.Add(camTag);
                    CameraFrameTable table = new CameraFrameTable();
                    table.id = camTag.id;
                    foreach (var cameraFrame in data.CameraFrames.CameraFrames)
                    {
                        CameraFrame frame = new CameraFrame();
                        frame.frameNumber        = cameraFrame.FrameNumber;
                        frame.position           = cameraFrame.CameraPosition.ToData();
                        frame.rotation           = cameraFrame.CameraRotation.ToData();
                        frame.viewAngle          = cameraFrame.ViewAngle;
                        frame.perspective        = cameraFrame.Perspective;
                        frame.distance           = cameraFrame.Distance;
                        frame.interpolParameters = new BezInterpolParams();
                        BezInterpolParams interpol = frame.interpolParameters;
                        interpol.X1 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[0][0],
                            y = cameraFrame.Interpolation[1][0]
                        };
                        interpol.X2 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[2][0],
                            y = cameraFrame.Interpolation[3][0]
                        };
                        interpol.Y1 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[0][1],
                            y = cameraFrame.Interpolation[1][1]
                        };
                        interpol.Y2 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[2][1],
                            y = cameraFrame.Interpolation[3][1]
                        };
                        interpol.Z1 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[0][2],
                            y = cameraFrame.Interpolation[1][2]
                        };
                        interpol.Z2 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[2][2],
                            y = cameraFrame.Interpolation[3][2]
                        };
                        interpol.R1 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[0][3],
                            y = cameraFrame.Interpolation[1][3]
                        };
                        interpol.R2 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[2][3],
                            y = cameraFrame.Interpolation[3][3]
                        };
                        CameraExtraBezParams camInterpol = frame.cameraInterpolParams = new CameraExtraBezParams();
                        camInterpol.L1 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[0][4],
                            y = cameraFrame.Interpolation[1][4]
                        };
                        camInterpol.L2 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[2][4],
                            y = cameraFrame.Interpolation[3][4]
                        };
                        camInterpol.V1 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[0][5],
                            y = cameraFrame.Interpolation[1][5]
                        };
                        camInterpol.V2 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[2][5],
                            y = cameraFrame.Interpolation[3][5]
                        };

                        table.frames.Add(frame);
                    }
                }
                if (data.LightFrames.LightCount > 0)
                {
                    Console.WriteLine("ライト用フレームリストの生成");
                    IDTag lightTag = new IDTag();
                    lightTag.id   = 0;
                    lightTag.name = "Default";
                    vme.lightIDTable.Add(lightTag);
                    LightFrameTable table = new LightFrameTable();
                    table.id = lightTag.id;
                    foreach (var lightFrame in data.LightFrames.LightFrames)
                    {
                        LightFrame frame = new LightFrame();
                        frame.frameNumber = lightFrame.FrameNumber;
                        frame.position    = lightFrame.LightPosition.ToData();
                        frame.color       = lightFrame.LightColor.ToData();
                        table.frames.Add(frame);
                    }
                }
                if (File.Exists(fileDest))
                {
                    File.Delete(fileDest);
                }
                using (FileStream fs = File.OpenWrite(fileDest))
                {
                    Serializer.Serialize(fs, vme);
                }
            }
        }
Пример #2
0
        protected override void Read(BinaryReaderEx br)
        {
            br.BigEndian  = false;
            br.VarintLong = false;

            bool isBigEndian = br.AssertInt32(1, 0x1000000) != 1;

            br.BigEndian = isBigEndian;

            br.Skip(0x24);

            uint NumAnimValues = br.ReadUInt32();

            Vector3[] AnimationData = new Vector3[NumAnimValues];

            br.Skip(0x14C);

            CameraName = br.ReadASCII();

            br.Pad(4);
            br.Skip(4);

            NumFrames = br.ReadUInt32();
            FrameRef[] FrameRefs = new FrameRef[NumFrames];
            CameraAnimation = new List <CameraFrame>((int)NumFrames);

            br.Skip(0x20);

            for (int i = 0; i < NumFrames; i++)
            {
                FrameRefs[i].Index                  = br.ReadUInt32();
                FrameRefs[i].PositionIndex          = br.ReadUInt32();
                FrameRefs[i].PositionDiffPrevIndex1 = br.ReadUInt32();
                FrameRefs[i].PositionDiffPrevIndex2 = br.ReadUInt32();
                FrameRefs[i].RotationIndex          = br.ReadUInt32();
                FrameRefs[i].RotationDiffPrevIndex1 = br.ReadUInt32();
                FrameRefs[i].RotationDiffPrevIndex2 = br.ReadUInt32();
                FrameRefs[i].ScaleIndex             = br.ReadUInt32();
            }

            InitialFoV = br.ReadSingle();

            br.ReadInt32();
            NumFoVData = br.ReadUInt32();
            br.ReadInt32();

            FoVDataList = new List <FoVData>((int)NumFoVData);

            for (int i = 0; i < NumFoVData; i++)
            {
                FoVDataList.Add(new FoVData()
                {
                    FrameIdx = br.ReadUInt32(), FoV = br.ReadSingle(), TanIn = br.ReadSingle(), TanOut = br.ReadSingle()
                });
            }

            for (int i = 0; i < NumAnimValues; i++)
            {
                AnimationData[i].X = br.ReadSingle();
                AnimationData[i].Y = br.ReadSingle();
                AnimationData[i].Z = br.ReadSingle();
            }

            //Done reading

            FrameRef currFrameRef;

            for (int i = 0; i < NumFrames; i++)
            {
                CameraFrame CamFrame = new CameraFrame();
                currFrameRef              = FrameRefs[i];
                CamFrame.Index            = currFrameRef.Index;
                CamFrame.Position         = AnimationData[currFrameRef.PositionIndex];
                CamFrame.PositionDiffPrev = AnimationData[currFrameRef.RotationDiffPrevIndex1];
                CamFrame.Rotation         = AnimationData[currFrameRef.RotationIndex];
                CamFrame.RotationDiffPrev = AnimationData[currFrameRef.RotationDiffPrevIndex1];
                CamFrame.Scale            = AnimationData[currFrameRef.ScaleIndex];
                CameraAnimation.Add(CamFrame);
            }
        }
Пример #3
0
    public void OnCameraFrameAvailable(CameraFrame frame)
    {
        lock (_monitor) {
            if (_scanningInProgress)
            {
                return;
            }
        }

        var metadata = frame.ColorMetadata;
        var data     = new Color32[metadata.Width * metadata.Height];

        if (metadata.ColorSpace == FrameColorSpace.RGBA)
        {
            if (frame.ColorData.Count != 1)
            {
                Debug.LogError("Unexpected number of data planes. Expected 1, but got " + frame.ColorData.Count);
                return;
            }
            var rawBytes = new byte[frame.ColorData[0].DataSize];
            Marshal.Copy(frame.ColorData[0].Data, rawBytes, 0, (int)frame.ColorData[0].DataSize);

            for (int i = 0; i < metadata.Width * metadata.Height; ++i)
            {
                data[i] = new Color32(rawBytes[i * 4], rawBytes[i * 4 + 1], rawBytes[i * 4 + 2], rawBytes[i * 4 + 3]);
            }
        }
        else if (metadata.ColorSpace == FrameColorSpace.RGB)
        {
            if (frame.ColorData.Count != 1)
            {
                Debug.LogError("Unexpected number of data planes. Expected 1, but got " + frame.ColorData.Count);
                return;
            }

            var rawBytes = new byte[frame.ColorData[0].DataSize];
            Marshal.Copy(frame.ColorData[0].Data, rawBytes, 0, (int)frame.ColorData[0].DataSize);

            for (int i = 0; i < metadata.Width * metadata.Height; ++i)
            {
                data[i] = new Color32(rawBytes[i * 3], rawBytes[i * 3 + 1], rawBytes[i * 3 + 2], 0);
            }
        }
        else if (metadata.ColorSpace == FrameColorSpace.YUV_420_NV12 ||
                 metadata.ColorSpace == FrameColorSpace.YUV_420_NV21 ||
                 metadata.ColorSpace == FrameColorSpace.YUV_420_YV12 ||
                 metadata.ColorSpace == FrameColorSpace.YUV_420_888)
        {
            if (frame.ColorData.Count < 1)
            {
                Debug.LogError("Unexpected number of data planes. Expected at least 1, but got " + frame.ColorData.Count);
                return;
            }

            var rawBytes = new byte[frame.ColorData[0].DataSize];
            Marshal.Copy(frame.ColorData[0].Data, rawBytes, 0, (int)frame.ColorData[0].DataSize);

            for (int i = 0; i < metadata.Width * metadata.Height; ++i)
            {
                data[i] = new Color32(rawBytes[i], rawBytes[i], rawBytes[i], 0);
            }
        }

        lock (_monitor) {
            _width              = metadata.Width;
            _height             = metadata.Height;
            _data               = data;
            _scanningInProgress = true;
            Monitor.Pulse(_monitor);
        }
    }