Exemple #1
0
		public override string ToString() {
			return Frames.ToString().PadLeft(4, ' ') + (Jump ? ",Jump" : "") + (Save ? ",Save" : "") + (Fire ? ",Fire" : "") + (Bash ? ",Bash" : "") +
				(ChargeJump ? ",CJump" : "") + (Glide ? ",Glide" : "") + (Start ? ",Start" : "") + (Select ? ",Select" : "") + (UI ? ",UI" : "") +
				(Action ? ",Action" : "") + (Esc ? ",Esc" : "") + (Dash ? ",Dash" : "") + (Grenade ? ",Grenade" : "") +
				Axis() + (DLoad ? ",DLoad" : "") + (DSave ? ",DSave" : "") + (SaveSlot >= 0 ? ",Slot," + (SaveSlot + 1) : "") +
				(!Position ? "" : ",Pos," + PositionX.ToString("0.####") + "," + PositionY.ToString("0.####")) +
				(!Speed ? "" : ",Speed," + SpeedX.ToString("0.####") + "," + SpeedY.ToString("0.####")) +
				(XP >= 0 ? ",XP," + XP : "") + (Color ? ",Color" : "") + (Random >= 0 ? ",Random," + Random : "") +
				(!EntityPos ? "" : ",EntityPos," + EntityPosX.ToString("0.####") + "," + EntityPosY.ToString("0.####")) +
				(!BlockPos ? "" : ",BlockPos," + BlockPosX.ToString("0.####") + "," + BlockPosY.ToString("0.####")) +
				(EntityHP < 0 ? "" : ",EntityHP," + EntityHP.ToString("0.##")) + (HP >= 0 ? ",HP," + HP.ToString("0.#") : "") + (EN >= 0 ? ",EN," + EN.ToString("0.##") : "") +
				(Restore ? ",Restore" : "") + (Copy >= 0 ? ",Copy," + (Copy + 1) : "") + (SkillTree >= 0 ? ",SkillTree," + SkillTree : "") +
				(MouseX < 0 && MouseY < 0 ? "" : ",Mouse," + MouseX.ToString("0.####") + "," + MouseY.ToString("0.####"));
		}
    void RealTimeSerialWithAvg()
    {
        //Update the LastAccel
        LastAccelX = AccelX;
        LastAccelY = AccelY;
        LastAccelZ = AccelZ;

        LastSpeedX = SpeedX;
        LastSpeedY = SpeedY;
        LastSpeedZ = SpeedZ;

        LastDispX = DispX;
        LastDispY = DispY;
        LastDispZ = DispZ;

        //Read a serial message and update Quat and Accel data
        WholeLine = GameObject.Find("RacketPviot").GetComponent <SerialController>().ReadSerialMessage();

        if (WholeLine != null)
        {
            QAData = WholeLine.Split(new[] { ',' });

            if (QAData.Length != 7)
            {
                //Invalid input, use the same data as the last update
                Debug.Log("Invalid input, keep last valid data.");
            }
            else
            {
                //Valid input, update raw Quat and Accel data
                float.TryParse(QAData[0], out QuatW);
                float.TryParse(QAData[1], out QuatX);
                float.TryParse(QAData[2], out QuatY);
                float.TryParse(QAData[3], out QuatZ);

                float.TryParse(QAData[4], out AccelX);
                float.TryParse(QAData[5], out AccelY);
                float.TryParse(QAData[6], out AccelZ);

                if (RecordPlaybackRaw)
                {
                    SW.WriteLine(WholeLine);
                }
            }
        }
        else
        {
            //Empty serial message, use the same data as the last update
            Debug.Log("Empty serial message, keep last valid data");
        }

        //Update the average
        SumAccelX = AvgAccelX * (AvgSize - 1) + AccelX;
        AvgAccelX = SumAccelX / AvgSize;
        SumAccelY = AvgAccelY * (AvgSize - 1) + AccelY;
        AvgAccelY = SumAccelY / AvgSize;
        SumAccelZ = AvgAccelZ * (AvgSize - 1) + AccelZ;
        AvgAccelZ = SumAccelZ / AvgSize;

        // Use a threshold to filter the mechanical noise
        float MagnitudeAccel = Mathf.Sqrt(AvgAccelX * AvgAccelX + AvgAccelY * AvgAccelY + AvgAccelZ * AvgAccelZ);

        if (MagnitudeAccel < MagnitudeAccelThreshold)
        {
            AccelX = 0;
            AccelY = 0;
            AccelZ = 0;

            SpeedX = 0;
            SpeedY = 0;
            SpeedZ = 0;

            DispX = 0;
            DispY = 0;
            DispZ = 0;
        }
        else
        {
            //TODO:Use AvgAccel or Zero mean version Accel?
            AccelX = AvgAccelX - SStateAccelX;
            AccelY = AvgAccelY - SStateAccelY;
            AccelZ = AvgAccelZ - SStateAccelZ;

            //Apply the double integration
            SpeedX = LastSpeedX + LastAccelX * Time.fixedDeltaTime + (AccelX - LastAccelX) * Time.fixedDeltaTime / 2f;
            SpeedY = LastSpeedY + LastAccelY * Time.fixedDeltaTime + (AccelY - LastAccelY) * Time.fixedDeltaTime / 2f;
            SpeedZ = LastSpeedZ + LastAccelZ * Time.fixedDeltaTime + (AccelZ - LastAccelZ) * Time.fixedDeltaTime / 2f;

            DispX = LastDispX + LastSpeedX * Time.fixedDeltaTime + (SpeedX - LastSpeedX) * Time.fixedDeltaTime / 2f;
            DispY = LastDispY + LastSpeedY * Time.fixedDeltaTime + (SpeedY - LastSpeedY) * Time.fixedDeltaTime / 2f;
            DispZ = LastDispZ + LastSpeedZ * Time.fixedDeltaTime + (SpeedZ - LastSpeedZ) * Time.fixedDeltaTime / 2f;
        }

        Rotate = new Quaternion(-QuatX, -QuatZ, -QuatY, QuatW);

        //Apply the transform

        if (ShowDisp)
        {
            this.transform.Translate(SpeedX, SpeedZ, SpeedY, Space.Self);

            /*
             * this.transform.Translate(Vector3.right * DispX);
             * this.transform.Translate(Vector3.up * DispZ);
             * this.transform.Translate(Vector3.forward * DispY);
             */
        }

        this.transform.rotation = Rotate;

        if (RecordPlayback)
        {
            string RecordLine = QuatW.ToString() + "," + QuatX.ToString() + "," + QuatY.ToString() + "," + QuatZ.ToString() +
                                "," + SpeedX.ToString() + "," + SpeedY.ToString() + "," + SpeedZ.ToString();

            SW.WriteLine(RecordLine);
        }
    }