コード例 #1
0
        PathLinearInterpolator ReadPathData(BinaryReader br)
        {
            PathLinearInterpolator pi = new PathLinearInterpolator();

            pi.m_WorldMatrix   = Utility.ReadMatrix4x4(br);
            pi.m_WorldRotation = Utility.ReadQuaternion(br);

            pi.m_MaxDistance       = br.ReadSingle();
            pi.m_SampleMaxDistance = br.ReadSingle();
            pi.m_HasPathEvent      = br.ReadBoolean();
            int sampleCount = br.ReadInt32();
            int nodeCount   = br.ReadInt32();

            pi.m_NodeList       = new LinearNodeData[nodeCount];
            pi.m_SplineDataList = new SplineSampleData[sampleCount];
            for (int i = 0; i < nodeCount; ++i)
            {
                LinearNodeData node = new LinearNodeData();
                node.EventType   = br.ReadByte();
                node.Times       = br.ReadUInt16();
                pi.m_NodeList[i] = node;
            }
            m_NodeCount += sampleCount;
            for (int j = 0; j < sampleCount; ++j)
            {
                SplineSampleData node = new SplineSampleData();
                node.pos               = Utility.ReadVec3(br);
                node.rot               = Utility.ReadQuaternion(br);
                node.timeScaling       = br.ReadSingle();
                node.nodeIdx           = br.ReadInt16();
                pi.m_SplineDataList[j] = node;
            }
            return(pi);
        }
コード例 #2
0
    public float GetTimeScaling(float time, out short nodeIdx)
    {
        float t   = m_SplineDataList.Length * time;
        int   idx = (int)t;

        t -= idx;
        if (idx < m_SplineDataList.Length - 1)
        {
            nodeIdx = m_SplineDataList[idx].nodeIdx;
            return(Utility.LerpFloat(m_SplineDataList[idx].timeScaling, m_SplineDataList[idx + 1].timeScaling, t));
        }
        else
        {
            SplineSampleData node1 = m_SplineDataList[m_SplineDataList.Length - 1];
            nodeIdx = node1.nodeIdx;
            return(node1.timeScaling);
        }
    }
コード例 #3
0
    public short GetPosRotTimeScaling(float time, out Vector3 pos, out Quaternion rot)
    {
        float t   = m_SplineDataList.Length * time;
        int   idx = (int)t;

        t -= idx;
        if (idx < m_SplineDataList.Length - 1)
        {
            SplineSampleData node1 = m_SplineDataList[idx];
            SplineSampleData node2 = m_SplineDataList[idx + 1];
            pos = Vector3.Lerp(node1.pos, node2.pos, t);
            rot = Quaternion.Slerp(node1.rot, node2.rot, t);
            return(m_SplineDataList[idx].nodeIdx);
        }
        else
        {
            SplineSampleData node1 = m_SplineDataList[m_SplineDataList.Length - 1];
            pos = node1.pos;
            rot = node1.rot;
            return(node1.nodeIdx);
        }
    }
コード例 #4
0
ファイル: BezierSpline.cs プロジェクト: acosin/MMXLegacy
        private void Initialize()
        {
            m_Contolpoints = gameObject.GetComponentsInChildren <BezierSplineContolPoint>();
            m_timeInc      = 1f / NormalizeSamples;
            Vector3[] array = new Vector3[NormalizeSamples + 1];
            m_SamplePointTime = new Single[NormalizeSamples + 1];
            for (Int32 i = 0; i <= NormalizeSamples; i++)
            {
                Single p_curveTime = i * m_timeInc;
                array[i] = GetPointOnCurveTime(p_curveTime, false);
            }
            Single num = 0f;

            for (Int32 j = 1; j <= NormalizeSamples; j++)
            {
                num += Vector3.Distance(array[j - 1], array[j]);
            }
            m_SamplePointTime[0] = 0f;
            Single num2 = 0f;

            for (Int32 k = 1; k <= NormalizeSamples; k++)
            {
                num2 += Vector3.Distance(array[k - 1], array[k]) / num;
                m_SamplePointTime[k] = num2;
            }
            m_SamplePointTime[NormalizeSamples] = 1f;
            SampleData = new SplineSampleData[NormalizeSamples];
            Vector3 b = GetPointOnCurveTime(-m_timeInc);

            for (Int32 l = 0; l < SampleData.Length; l++)
            {
                Vector3    pointOnCurveTime = GetPointOnCurveTime(l * m_timeInc);
                Quaternion rot = Quaternion.LookRotation(pointOnCurveTime - b);
                b = pointOnCurveTime;
                Single speedOnCurveTime = GetSpeedOnCurveTime(l * m_timeInc);
                SampleData[l] = new SplineSampleData(pointOnCurveTime, rot, speedOnCurveTime);
            }
        }