Example #1
0
    public CoLqueryData liftQuery(Vector3 refVector)
    {
        CoLqueryData qry          = new CoLqueryData();
        Vector3      testVelocity = refVector;

        speed = testVelocity.magnitude;
        float angleOfAttackRad = 0f;

        if (liftTransform != null)
        {
            angleOfAttackRad = CalculateAoA(liftTransform, testVelocity);
        }
        float liftCoeff = 2f * Mathf.PI * angleOfAttackRad;

        lift = 0.5f * liftCoeff * airDensity * (speed * speed) * wingArea;
        float aspectRatio = (span * span) / wingArea;
        float dragCoeff   = zeroLiftDrag + (liftCoeff * liftCoeff) / (Mathf.PI * aspectRatio * efficiency);

        drag = 0.5f * dragCoeff * airDensity * (speed * speed) * wingArea;

        lift *= power;
        drag *= power;

        qry.pos  += liftTransform.position;
        qry.dir  += -liftTransform.up * lift;
        qry.lift += qry.dir.magnitude;
        //qry.dir.Normalize();

        return(qry);
    }
Example #2
0
    public void OnCenterOfLiftQuery(CenterOfLiftQuery qry)
    {
        if (moduleID == 0)
        {
            CoLqueryData queryData = new CoLqueryData();
            queryData.refVector = qry.refVector;
            for (int i = 0; i < liftSurfaces.Count; i++)
            {
                CoLqueryData newQuery  = liftSurfaces[i].liftQuery(queryData.refVector);
                float        influence = new Vector2(queryData.dir.magnitude, newQuery.dir.magnitude).normalized.y;
                queryData.pos   = Vector3.Lerp(queryData.pos, newQuery.pos, influence);
                queryData.lift += newQuery.lift;
                queryData.dir   = Vector3.Lerp(queryData.dir, newQuery.dir, influence);
            }

            queryData.dir.Normalize();

            qry.dir  = queryData.dir;
            qry.lift = queryData.lift;
            qry.pos  = queryData.pos;
        }
    }
Example #3
0
    public void OnCenterOfLiftQuery(CenterOfLiftQuery qry)
    {
        if (moduleID == 0)
        {
            CoLqueryData queryData = new CoLqueryData();
            queryData.refVector = qry.refVector;
            for (int i = 0; i < liftSurfaces.Count; i++)
            {
                CoLqueryData newQuery = liftSurfaces[i].liftQuery(queryData.refVector);
                float influence = new Vector2(queryData.dir.magnitude, newQuery.dir.magnitude).normalized.y;
                queryData.pos = Vector3.Lerp(queryData.pos, newQuery.pos, influence);
                queryData.lift += newQuery.lift;
                queryData.dir = Vector3.Lerp(queryData.dir, newQuery.dir, influence);
            }

            queryData.dir.Normalize();

            qry.dir = queryData.dir;
            qry.lift = queryData.lift;
            qry.pos = queryData.pos;
        }
    }
Example #4
0
    public CoLqueryData liftQuery(Vector3 refVector)
    {
        CoLqueryData qry = new CoLqueryData();
        Vector3 testVelocity = refVector;
        speed = testVelocity.magnitude;
        float angleOfAttackRad = 0f;
        if (liftTransform != null)
            angleOfAttackRad = CalculateAoA(liftTransform, testVelocity);
        float liftCoeff = 2f * Mathf.PI * angleOfAttackRad;
        lift = 0.5f * liftCoeff * airDensity * (speed * speed) * wingArea;
        float aspectRatio = (span * span) / wingArea;
        float dragCoeff = zeroLiftDrag + (liftCoeff * liftCoeff) / (Mathf.PI * aspectRatio * efficiency);
        drag = 0.5f * dragCoeff * airDensity * (speed * speed) * wingArea;

        lift *= power;
        drag *= power;

        qry.pos += liftTransform.position;
        qry.dir += -liftTransform.up * lift;
        qry.lift += qry.dir.magnitude;
        //qry.dir.Normalize();

        return qry;
    }