第一種方式:
將物體的世界坐標(biāo)轉(zhuǎn)換為視口坐標(biāo)(Viewport Coordinates),得到的坐標(biāo)值會在[0,1]的范圍內(nèi),表示物體在相機(jī)視口中的位置。如果物體的位置在這個范圍內(nèi),就說明它被相機(jī)看到了。
public bool ObjectVisible(Camera camera, GameObject obj)
{
//將物體的世界坐標(biāo)轉(zhuǎn)換為視口坐標(biāo)
Vector3 viewportPosition = camera.WorldToViewportPoint(obj.transform.position);
//如果視口坐標(biāo)在[0,1]的范圍內(nèi),表示可以被相機(jī)看到
if (viewportPosition.x > 0 && viewportPosition.x < 1 && viewportPosition.y > 0 && viewportPosition.y < 1 && viewportPosition.z > 0)
{
return true;
}
return false;
}
第二種方式:
判斷物體是否完全在相機(jī)的視錐體內(nèi),可以使用相機(jī)的GeometryUtility.TestPlanesAABB()方法,該方法可以檢測一個AABB包圍盒(即物體的邊界框)是否在視錐體內(nèi),返回一個bool值。如果返回值為true,則表示物體完全在視錐體內(nèi);如果返回值為false,則表示物體不在視錐體內(nèi)。文章來源:http://www.zghlxwxcb.cn/news/detail-752083.html
public bool ObjectVisible(Camera camera, GameObject obj)
{
Bounds bounds = obj.GetComponent<Renderer>().bounds;
//GeometryUtility.TestPlanesAABB()方法,該方法可以檢測一個AABB包圍盒(即物體的邊界框)是否在視錐體內(nèi),
//返回一個bool值。如果返回值為true,則表示物體在視錐體內(nèi);如果返回值為false,則表示物體不在視錐體內(nèi)。
return GeometryUtility.TestPlanesAABB(GeometryUtility.CalculateFrustumPlanes(camera), bounds);
}
在Update中調(diào)用該方法。文章來源地址http://www.zghlxwxcb.cn/news/detail-752083.html
到了這里,關(guān)于Unity判斷物體是否被某個相機(jī)可見的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!