} // ////////////////////////////////////////////////////////////////////////////////////////////////// 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); } // //////////////////////////////////////////////////////////////////////////////////
} // //////////////////////////////////////////////////////////////////////////////////////// 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)); } // ////////////////////////////////////////////////////////////////////////////////////
} // ////////////////////////////////////////////////////////////////////////////////////// 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; } // //////////////////////////////////////////////////////////////////////////////////////
} // /////////////////////////////////////////////////////////////////////////// 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)); } // ///////////////////////////////////////////////////////////////////////////
} // /////////////// 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)); } // ///////////////////////////////////////////////////////////////////////////
} // ////////////////////////////////////////////////////////////////////////////////////// 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); } // //////////////////////////////////////////////////////////////////////////////////////////////////