示例#1
0
    } // //////////////////////////////////////////////////////////////////////////////////////////////////

    void getAngle(d2p cam, d2p pnt, float diam, out float min, out float max)
    {
        float dist = cam.dist(pnt);
        float alfa = Mathf.Atan2(diam / 2, dist);
        float beta = Mathf.PI - cam.rad(pnt);

        beta = d2p.normrad(beta);
        min  = Mathf.Min(beta - alfa, beta + alfa);
        max  = Mathf.Max(beta - alfa, beta + alfa);
    } // //////////////////////////////////////////////////////////////////////////////////
示例#2
0
    } // ////////////////////////////////////////////////////////////////////////////////////////

    static public d2p rotateRefQQQ(d2p Base, d2p p, float rad)
    {
        float len  = Base.dist(p);
        d2p   nrm  = new d2p(p.x - Base.x, p.z - Base.z);
        float alfa = -Mathf.Asin(nrm.z / len);
        float beta = alfa - rad;
        float x    = len * Mathf.Cos(beta);
        float z    = len * Mathf.Sin(beta);

        return(new d2p(Base.x + x, Base.z + z));
    } // ////////////////////////////////////////////////////////////////////////////////////
示例#3
0
    } // //////////////////////////////////////////////////////////////////////////////////////

    void setCamera(d2p ptarget)
    {
        if (studyProcess.layout == null)
        {
            Debug.Break();
        }
        Layout lay     = studyProcess.layout;
        d2p    pcam    = getPCameraHoriz(ptarget, lay.pcue);
        float  camdist = pcam.dist(lay.pcue);

        if (camdist < Field.distCueCam)
        {
            pcam = d2p.setDist(lay.pcue, pcam, Field.distCueCam);
        }

        d2p   pbnd  = new d2p(bounds); //  far point arc
        float wfar  = pcam.dist(pbnd);
        float wnear = pcam.dist(lay.pcue);
        float h     = plcamera.transform.position.y;

        float degcamnear = d2p.rad2deg(Mathf.Atan2(h, wnear));
        float degcamfar  = d2p.rad2deg(Mathf.Atan2(h - bounds.transform.position.y, wfar));
        float degcamavg  = (degcamnear + degcamfar) / 2;

        float aCueTarget = lay.pcue.rad(ptarget);
        float agCueCam   = d2p.rad2deg(aCueTarget - Mathf.PI / 2);

        Quaternion rotation = Quaternion.Euler(degcamavg, agCueCam, 0);

        plcamera.transform.SetPositionAndRotation(
            new Vector3(pcam.x, plcamera.transform.position.y, pcam.z),
            rotation);

        float sectorHor  = getHorSector(pcam, lay.pcue, lay.paim, lay.pluze, Mathf.PI - aCueTarget);
        float sectorVert = degcamnear - degcamfar;
        float sectorMax  = Mathf.Max(sectorVert, sectorHor);

        plcamera.fieldOfView = 1.05f * sectorMax;
    } // //////////////////////////////////////////////////////////////////////////////////////
示例#4
0
    } // ///////////////////////////////////////////////////////////////////////////

    public static d2p addDist(d2p baza, d2p other, float add)
    {
        float len = baza.dist(other);

        if (len == 0)
        {
            return(new d2p(other.x - add, other.z + add));
        }
        float k  = (len + add) / len;
        float dx = k * (other.x - baza.x);
        float dz = k * (other.z - baza.z);

        return(new d2p(baza.x + dx, baza.z + dz));
    } // ///////////////////////////////////////////////////////////////////////////
示例#5
0
    }                                                              // ///////////////

    public static d2p setDist(d2p baza, d2p other, float newsize)
    {
        float len = baza.dist(other);

        if (len == 0)
        {
            return(new d2p(baza));
        }
        float k  = newsize / len;
        float dx = k * (other.x - baza.x);
        float dz = k * (other.z - baza.z);

        return(new d2p(baza.x + dx, baza.z + dz));
    } // ///////////////////////////////////////////////////////////////////////////
示例#6
0
    } // //////////////////////////////////////////////////////////////////////////////////////

    d2p getPCameraHoriz(d2p ptarget, d2p pcue)
    {
        float alfa = -ptarget.rad(pcue);

        if (alfa == 0)
        {
            return(new d2p(-xmax, pcue.z));
        }
        else if (alfa == -Mathf.PI / 2)
        {
            return(new d2p(pcue.x, -zmax));
        }
        else if (alfa > 0 && alfa < Mathf.PI / 2)
        {
            // y = ax + b
            float a        = (ptarget.z - pcue.z) / (ptarget.x - pcue.x); // >0
            float b        = pcue.z - a * pcue.x;
            float z        = b - a * xmax;
            float x        = (-zmax - b) / a;
            d2p   camshort = new d2p(-xmax, z);
            d2p   camlong  = new d2p(x, -zmax);
            if (camshort.dist(pcue) <= camlong.dist(pcue))
            {
                return(camshort);
            }
            return(camlong);
        }
        else if (alfa < 0 && alfa > -Mathf.PI / 2)
        {
            // y = ax + b
            float a        = (ptarget.z - pcue.z) / (ptarget.x - pcue.x); // <0
            float b        = pcue.z - a * pcue.x;
            float z        = b - a * xmax;
            float x        = (zmax - b) / a;
            d2p   camshort = new d2p(-xmax, z);
            d2p   camlong  = new d2p(x, zmax);
            if (camshort.dist(pcue) <= camlong.dist(pcue))
            {
                return(camshort);
            }
            return(camlong);
        }
        else if (alfa > Mathf.PI / 2 && alfa < Mathf.PI)
        {
            // y = ax + b
            float a        = (pcue.z - ptarget.z) / (pcue.x - ptarget.x); // <0
            float b        = pcue.z - a * pcue.x;
            float z        = b + a * xmax;
            float x        = (-zmax - b) / a;
            d2p   camshort = new d2p(xmax, z);
            d2p   camlong  = new d2p(x, -zmax);
            if (camshort.dist(pcue) <= camlong.dist(pcue))
            {
                return(camshort);
            }
            return(camlong);
        }
        else
        {
            Debug.Break();
        }
        return(null);
    } // //////////////////////////////////////////////////////////////////////////////////////////////////