Hi. I need to know if a point can be seen by a certain camera or not. Now I'm converting the point world coordinates (as Vector3) to camera Viewport coordinates using Camera.WorldToViewportPoint, then I check if x and y values are outside the range [0..1] for both axis, but I suspect there is an easier way. Any ideas?
use Camera.WorldToViewportPoint, check if X and Y are within 0…1 range AND check Z>0
(if Z is not greater than 0 it means the point is behind the camera.)
Your way is actually one of the easier ways actually - the alternative way I can think of is to check if the point lays in the camera's frustum, which is probably more code
@patrik
Hello! I know you already have some answers but incase someone needs some code for this I will provide it. Also, these answers do not take into account the point being behind an object. Here is some tested and ran code that does it.
public Camera camera;
public bool PointInCameraView(Vector3 point) {
Vector3 viewport = camera.WorldToViewportPoint(point);
bool inCameraFrustum = Is01(viewport.x) && Is01(viewport.y);
bool inFrontOfCamera = viewport.z > 0;
RaycastHit depthCheck;
bool objectBlockingPoint = false;
Vector3 directionBetween = point - camera.transform.position;
directionBetween = directionBetween.normalized;
float distance = Vector3.Distance(camera.transform.position, point);
if(Physics.Raycast(camera.transform.position, directionBetween, out depthCheck, distance + 0.05f)) {
if(depthCheck.point != point) {
objectBlockingPoint = true;
}
}
return inCameraFrustum && inFrontOfCamera && !objectBlockingPoint;
}
public bool Is01(float a) {
return a > 0 && a < 1;
}
(This thing stings people every time it’s used, haha. Solidarity!).
I think you need to ensure both x and y are within [0-1] ( not outside )
- if any value is outside 0-1 range then the point is not visible
- also if z < 0 then I think object is behind camera