有時(shí)需要讓指定的物體正好在正交相機(jī)視野內(nèi),就需要實(shí)時(shí)計(jì)算合適的size,然后更新相機(jī)。
要使物體在正交相機(jī)視野內(nèi),則需要使物體在相機(jī)坐標(biāo)系中的x,y坐標(biāo)都在size范圍內(nèi),于是求出x,y的最大值即為size的值。沒(méi)有考慮z坐標(biāo)是因?yàn)閷?duì)于正交相機(jī),z不會(huì)影響物體的渲染位置。
float cameraSize = 0;
// 如果有多個(gè)目標(biāo)點(diǎn),則需要求所有這些點(diǎn)中最大的size
foreach(targetPos in targetsPos)
{
// 將物體世界坐標(biāo)轉(zhuǎn)換為相機(jī)坐標(biāo)系中的坐標(biāo)
Vector3 targetPosInCamera = cameraTrasform.InverseTransfromPoint(targetPos);
// 計(jì)算y固定時(shí)的size臨界值 size = y
size = Mathf.Max(size, targetPosInCamera.y);
// 計(jì)算x固定時(shí)的size臨界值 size = x/aspect
float tmpY = targetPosInCamera.x / camera.aspect;
size = Mathf.Max(size, tmpY);
}
// 相機(jī)size應(yīng)該有個(gè)合理的最小值
size = Mathf.max(minSize, size);
// size應(yīng)該有一個(gè)緩沖值,因?yàn)槟悴粫?huì)想讓目標(biāo)正好顯示在相機(jī)邊界上
size += sizeBufferSize
然后在平滑的設(shè)置相機(jī)的size
void FixedUpdate()
{
camera.orthographicSize = Mathf.SmoothDamp(camera.size, size, ref zoomSpeed, dampTime);
}