MeshLinesGenerator.CalculatePositionAndRotationOnMesh C# (CSharp) 메소드

CalculatePositionAndRotationOnMesh() 공개 메소드

public CalculatePositionAndRotationOnMesh ( float progressionOnMesh, float widthOffset, Vector3 &calculatedPos, Quaternion &calculatedRot, float &calculatedHeightValue ) : void
progressionOnMesh float
widthOffset float
calculatedPos Vector3
calculatedRot Quaternion
calculatedHeightValue float
리턴 void
    public void CalculatePositionAndRotationOnMesh(float progressionOnMesh, float widthOffset, out Vector3 calculatedPos, out Quaternion calculatedRot, out float calculatedHeightValue)
    {
        float fractionalIndex = progressionOnMesh * ((float)activeMeshLinesList.Count - 1);
        int ceilIndex = Mathf.CeilToInt(fractionalIndex);
        int floorIndex = Mathf.FloorToInt(fractionalIndex);
        float lerpStep = ceilIndex - fractionalIndex;

        Transform ceilTransform = activeMeshLinesList[ceilIndex].transform;
        Vector3 ceilPos = ceilTransform.position;
        Quaternion ceiltRot = ceilTransform.rotation;
        float ceilHeight = ceilTransform.GetComponent<MeshLine>().CalculateHeighOnLine(widthOffset); // might be worth caching the component

        Transform floorTransform = activeMeshLinesList[floorIndex].transform;
        Vector3 floorPos = floorTransform.position;
        Quaternion floorRot = floorTransform.rotation;
        float floorHeight = floorTransform.GetComponent<MeshLine>().CalculateHeighOnLine(widthOffset);

        Vector3 lerpedPos = Vector3.Lerp(floorPos, ceilPos, lerpStep);
        Quaternion lerpedRot = Quaternion.Slerp(floorRot, ceiltRot, lerpStep);
        float lerpedHeight = Mathf.Lerp(floorHeight, ceilHeight, lerpStep);

        calculatedPos = lerpedPos;
        calculatedRot = lerpedRot;
        calculatedHeightValue = lerpedHeight;
    }

Usage Example

예제 #1
0
    void Update()
    {
        Vector3 tempPos = transform.position;

        Vector3    calPos          = Vector3.zero;
        Quaternion calRot          = Quaternion.identity;
        float      newHeightOffset = 0;

        // updated based on velocities
        widthOffset += relativeVelocity.x * Time.deltaTime;
        widthOffset  = Mathf.Clamp(widthOffset, -meshlineWidth * 0.5f, meshlineWidth * 0.5f);
        float relativeLocationOnLine = 0.5f + widthOffset / meshlineWidth;


        // move rider forward before looking for closest meshline
        progressionOnMesh += relativeVelocity.z * Time.deltaTime;
        progressionOnMesh  = Mathf.Clamp(progressionOnMesh, 0, 0.9f);

        meshlinesGenerator.CalculatePositionAndRotationOnMesh(progressionOnMesh, relativeLocationOnLine, out calPos, out calRot, out newHeightOffset);

        HandleNewHeight(newHeightOffset);

        transform.position  = calPos;        // set base meshline postion
        transform.rotation  = calRot;
        transform.position += transform.right * widthOffset;
        transform.position += transform.up * heightOffset;


        // apply friction to velocities
        //relativeVelocity -=  linearVelocityDecay * relativeVelocity * Time.deltaTime;

        if (wasSidePressed == false)
        {
            relativeVelocity.x -= linearVelocityDecay * relativeVelocity.x * Time.deltaTime;
            if (Mathf.Abs(relativeVelocity.x) < 0.01f)
            {
                relativeVelocity.x = 0;
            }
        }
        if (wasForwardPressed == false)
        {
            relativeVelocity.z -= linearVelocityDecay * relativeVelocity.z * Time.deltaTime;
        }

        wasSidePressed    = false;
        wasForwardPressed = false;
    }