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); } } }
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); } }
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); } }