Exemplo n.º 1
0
 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);
 }
Exemplo n.º 2
0
        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;
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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());
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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;
            }
        }