private void WriteCameraFrame([NotNull] VmdCameraFrame frame) { _writer.Write(frame.FrameIndex); _writer.Write(frame.Length); _writer.Write(frame.Position); _writer.Write(frame.Orientation); WriteMultidimArray(frame.Interpolation); _writer.Write(frame.FieldOfView); WriteMultidimArray(frame.Unknown); }
private void ReadCameraFrames([NotNull] VmdMotion motion) { var frameCount = _reader.ReadInt32(); var frames = new VmdCameraFrame[frameCount]; for (var i = 0; i < frameCount; ++i) { frames[i] = ReadCameraFrame(); } motion.CameraFrames = frames; }
private VmdCameraFrame ReadCameraFrame() { var frame = new VmdCameraFrame(); frame.FrameIndex = _reader.ReadInt32(); frame.Distance = _reader.ReadSingle(); frame.Position = _reader.ReadVector3(); frame.Orientation = _reader.ReadVector3(); ReadMultiDimArray(frame.Interpolation); frame.FieldOfView = _reader.ReadSingle(); ReadMultiDimArray(frame.Unknown); return(frame); }
private VmdCameraFrame[] CreateCameraFrames([CanBeNull] CharacterImasMotionAsset mainCamera, [NotNull] ScenarioObject baseScenario, [CanBeNull] CharacterImasMotionAsset cameraAppeal, uint fixedFov, AppealType appealType) { // Here we reuse the logic in MVD camera frame computation var mvdCreator = new MvdCreator(_conversionConfig, _scalingConfig) { ProcessCameraFrames = true, ProcessBoneFrames = false, ProcessFacialFrames = false, ProcessLightFrames = false, }; var mvdMotion = mvdCreator.CreateCameraMotion(mainCamera, baseScenario, cameraAppeal, appealType); var mvdFrames = mvdMotion.CameraMotions[0].CameraFrames; var cameraFrameList = new List <VmdCameraFrame>(); foreach (var mvdFrame in mvdFrames) { var vmdFrame = new VmdCameraFrame((int)mvdFrame.FrameNumber); vmdFrame.Length = mvdFrame.Distance * 0.1f; vmdFrame.Position = mvdFrame.Position; vmdFrame.Orientation = mvdFrame.Rotation + new Vector3(MathHelper.Pi, 0, MathHelper.Pi); // VMD does not have good support for animated FOV. So here just use a constant to avoid "jittering". // The drawback is, some effects (like the first zooming cut in Shooting Stars) will not be able to achieve. //var fov = FocalLengthToFov(frame.FocalLength); //vmdFrame.FieldOfView = (uint)fov; vmdFrame.FieldOfView = fixedFov; cameraFrameList.Add(vmdFrame); } return(cameraFrameList.ToArray()); }
private IReadOnlyList <VmdCameraFrame> CreateCameraFrames([NotNull] CharacterImasMotionAsset cameraMotion, uint fixedFov) { var animation = CameraAnimation.CreateFrom(cameraMotion); var animationFrameCount = animation.CameraFrames.Count; var cameraFrameList = new List <VmdCameraFrame>(); for (var i = 0; i < animationFrameCount; ++i) { if (_conversionConfig.Transform60FpsTo30Fps) { if (i % 2 == 1) { continue; } } int frameIndex; if (_conversionConfig.Transform60FpsTo30Fps) { frameIndex = i / 2; } else { frameIndex = i; } var frame = animation.CameraFrames[i]; var vmdFrame = new VmdCameraFrame(frameIndex); var pos = new Vector3(frame.PositionX, frame.PositionY, frame.PositionZ); pos = pos.FixUnityToOpenTK(); if (_conversionConfig.ScaleToVmdSize) { pos = pos * _scalingConfig.ScaleUnityToVmd; } vmdFrame.Position = pos; var target = new Vector3(frame.TargetX, frame.TargetY, frame.TargetZ); target = target.FixUnityToOpenTK(); if (_conversionConfig.ScaleToVmdSize) { target = target * _scalingConfig.ScaleUnityToVmd; } var delta = target - pos; vmdFrame.Length = delta.Length; var lookAtMatrix = Matrix4.LookAt(pos, target, Vector3.UnitY); var q = lookAtMatrix.ExtractRotation(); var rot = q.DecomposeRad(); rot.Z = MathHelper.DegreesToRadians(frame.AngleZ); rot.Y = MathHelper.Pi - rot.Y; if (rot.Y < 0) { rot.Y += MathHelper.TwoPi; } if (delta.Z < 0) { rot.Y = -(MathHelper.Pi + rot.Y); } if (rot.X < -MathHelper.PiOver2) { rot.X = rot.X + MathHelper.Pi; } else if (rot.X > MathHelper.PiOver2) { rot.X = -(MathHelper.Pi - rot.X); } rot.X = -rot.X; rot.Y -= MathHelper.Pi; vmdFrame.Orientation = rot; // VMD does not have good support for animated FOV. So here just use a constant to avoid "jittering". // The drawback is, some effects (like the first zooming cut in Shooting Stars) will not be able to achieve. //var fov = FocalLengthToFov(frame.FocalLength); //vmdFrame.FieldOfView = (uint)fov; vmdFrame.FieldOfView = fixedFov; cameraFrameList.Add(vmdFrame); } return(cameraFrameList); }
private VmdMotion ReadMotion() { var signature = ReadString(20); if (signature != "Vocaloid Motion Data") { throw new FormatException("VMD signature is not found."); } var motion = new VmdMotion(); var formatVersionString = ReadString(10); motion.Version = Convert.ToInt32(formatVersionString); motion.ModelName = ReadString(20); ReadBoneFrames(); ReadFacialFrames(); ReadCameraFrames(); ReadLightFrames(); // Unknown 2 _reader.ReadBytes(4); if (_reader.BaseStream.Position != _reader.BaseStream.Length) { ReadIKFrames(); } if (_reader.BaseStream.Position != _reader.BaseStream.Length) { throw new FormatException("The VMD file may contain other data that this reader does not recognize."); } return(motion); void ReadBoneFrames() { var frameCount = _reader.ReadInt32(); var frames = new VmdBoneFrame[frameCount]; for (var i = 0; i < frameCount; ++i) { frames[i] = ReadBoneFrame(); } motion.BoneFrames = frames; } void ReadFacialFrames() { var frameCount = _reader.ReadInt32(); var frames = new VmdFacialFrame[frameCount]; for (var i = 0; i < frameCount; ++i) { frames[i] = ReadFacialFrame(); } motion.FacialFrames = frames; } void ReadCameraFrames() { var frameCount = _reader.ReadInt32(); var frames = new VmdCameraFrame[frameCount]; for (var i = 0; i < frameCount; ++i) { frames[i] = ReadCameraFrame(); } motion.CameraFrames = frames; } void ReadLightFrames() { var frameCount = _reader.ReadInt32(); var frames = new VmdLightFrame[frameCount]; for (var i = 0; i < frameCount; ++i) { frames[i] = ReadLightFrame(); } motion.LightFrames = frames; } void ReadIKFrames() { var frameCount = _reader.ReadInt32(); var frames = new VmdIKFrame[frameCount]; for (var i = 0; i < frameCount; ++i) { frames[i] = ReadIKFrame(); } motion.IKFrames = frames; } }