From: Peter Schaefer Date: Wed, 18 May 2016 15:32:01 +0000 (+0200) Subject: Point Frustum funktioniert X-Git-Url: https://git.leopard-lacewing.eu/?a=commitdiff_plain;h=937bb034347b632d2d5919260611ce0184a079da;p=cgue_weave.git Point Frustum funktioniert --- diff --git a/Weave/Scene/Camera.cpp b/Weave/Scene/Camera.cpp index 93e122a..ed83211 100644 --- a/Weave/Scene/Camera.cpp +++ b/Weave/Scene/Camera.cpp @@ -111,14 +111,27 @@ void Camera::updateProjection(float _yFov, float _xyRatio, float _zNear, float _ projection = perspective(yFov, xyRatio, zNear, zFar); } -Camera::FC_stat Camera::frustum_sphere(vec3 _center, float _radius) +Camera::FC_stat Camera::frustum_sphere(vec3 _center, float _radius) const { + + FC_stat result = FC_INSIDE; + vec3 v(_center - cCenter); vec3 pVCam(dot(v,cRight), dot(v,cUpVector), dot(v,cFront)); - if (_radius != 0) { + float h2 = pVCam.z * tan(yFov/2); + float w2 = h2 * xyRatio; + //float d = _radius * cos + + if (_radius == 0) { if (pVCam.z > zFar || pVCam.z < zNear) return FC_OUTSIDE; + + if (pVCam.y > h2 || pVCam.y < -h2) + return FC_OUTSIDE; + + if (pVCam.x > w2 || pVCam.x < -w2) + return FC_OUTSIDE; } else { @@ -126,11 +139,11 @@ Camera::FC_stat Camera::frustum_sphere(vec3 _center, float _radius) return FC_OUTSIDE; if (pVCam.z > zFar - _radius || pVCam.z < zNear + _radius) - return FC_INTERSECT; + result = FC_INTERSECT; } - return FC_INSIDE; + return result; } void Camera::updateVectors() diff --git a/Weave/Scene/Camera.h b/Weave/Scene/Camera.h index 6b17db8..9e0fe5d 100644 --- a/Weave/Scene/Camera.h +++ b/Weave/Scene/Camera.h @@ -37,7 +37,7 @@ public: FC_INSIDE }; - FC_stat frustum_sphere(vec3 center, float radius = 0.f); + FC_stat frustum_sphere(vec3 center, float radius = 0.f) const; protected: diff --git a/Weave/Scene/Scene.cpp b/Weave/Scene/Scene.cpp index a7b1590..9cf7aa4 100644 --- a/Weave/Scene/Scene.cpp +++ b/Weave/Scene/Scene.cpp @@ -327,7 +327,10 @@ void Scene::drawSceneObjects(drawTarget _target) const for (auto i = SceneObjects.cbegin(); i != SceneObjects.cend(); ++i) { - (*i)->draw(_target); + auto result = camera.frustum_sphere((*i)->getPosition()); + if (result == camera.FC_OUTSIDE) + continue; + (*i)->draw(_target); } }