From b67fd76c7b131aea9fe70298fedc7689f6623533 Mon Sep 17 00:00:00 2001 From: Peter Schaefer Date: Thu, 19 May 2016 12:55:22 +0200 Subject: [PATCH] point Frustum geht doch nicht Kugel Frustum ... damit auch nicht --- Weave/GLM.h | 3 ++- Weave/Graphix/Model/IMesh.cpp | 2 +- Weave/Graphix/Model/Model.cpp | 4 +--- Weave/Graphix/Model/Model.h | 2 +- Weave/Scene/Camera.cpp | 32 +++++++++++++++++++++++++------- Weave/Scene/Camera.h | 4 ++++ Weave/Scene/Scene.cpp | 3 ++- 7 files changed, 36 insertions(+), 14 deletions(-) diff --git a/Weave/GLM.h b/Weave/GLM.h index 61a23de..9b82470 100644 --- a/Weave/GLM.h +++ b/Weave/GLM.h @@ -42,7 +42,8 @@ typedef aiMatrix4x4t aiMatrix4x4; #define M_PI_4 0.785398163397448309615660845819875721 /* pi/4 */ #define M_1_PI 0.318309886183790671537767526745028724 /* 1/pi */ #define M_2_PI 0.636619772367581343075535053490057448 /* 2/pi */ -#define M_D_R 57.2957795131 /* 180/pi */ +#define M_R2D 57.2957795131 /* 180/pi */ +#define M_D2R 0.01745329251 /* pi/180 */ __declspec(deprecated("Use glm::lenght(vec3)")) float VektorAbs(const vec3& vek); diff --git a/Weave/Graphix/Model/IMesh.cpp b/Weave/Graphix/Model/IMesh.cpp index 89ef044..89e5c34 100644 --- a/Weave/Graphix/Model/IMesh.cpp +++ b/Weave/Graphix/Model/IMesh.cpp @@ -41,7 +41,7 @@ using std::array; IMesh::IMesh(const aiMesh* _mesh, const vec3& _scale) : modelpath("IMesh") { loadMesh(_mesh, _scale); - + //box_init(); //bindModel(); } diff --git a/Weave/Graphix/Model/Model.cpp b/Weave/Graphix/Model/Model.cpp index 9866b51..9803deb 100644 --- a/Weave/Graphix/Model/Model.cpp +++ b/Weave/Graphix/Model/Model.cpp @@ -461,10 +461,8 @@ void Model::box_init(const mat4& _model) box = Box((max + min) * .5f, (max - min) * .5f); } -Box Model::getBox() +Box Model::getBox() const { - if (box.size() == vec3(0.f)) - box_init(); return box; } diff --git a/Weave/Graphix/Model/Model.h b/Weave/Graphix/Model/Model.h index 60daeff..bda41f9 100644 --- a/Weave/Graphix/Model/Model.h +++ b/Weave/Graphix/Model/Model.h @@ -58,7 +58,7 @@ public: virtual void bt_setMargin(btScalar margin); virtual void box_init(const mat4& modelMat = mat4(1.f)); - virtual Box getBox(); + virtual Box getBox() const; // Mesh Speichern? bool loadMesh(const std::string& modelpath, uint mindex = 0); diff --git a/Weave/Scene/Camera.cpp b/Weave/Scene/Camera.cpp index ed83211..da5dc8e 100644 --- a/Weave/Scene/Camera.cpp +++ b/Weave/Scene/Camera.cpp @@ -6,8 +6,8 @@ using glm::lookAt; using glm::perspective; using glm::inverse; -#define VIEW_PITCH_MAX 0.3f -#define VIEW_PITCH_MIN -0.9f +#define VIEW_PITCH_MAX 10.3f +#define VIEW_PITCH_MIN -10.9f #define WORLD_UP vec3(0.f, 1.f, 0.f) @@ -20,7 +20,10 @@ Camera::Camera(float _yFov, float _xyRatio, float _zNear, float _zFar) : pitch(0.f), yaw(0.f), dist(2.f), //DIST - cPosition(0.f) + cPosition(0.f), + tan_alphaY(tan(_yFov * (float)M_D2R * .5f)), + Icos_alphaX(1.f/cos(atan(tan_alphaY*_xyRatio))), + Icos_alphaY(1.f/cos(_yFov * (float)M_D2R * .5f)) { updateVectors(); } @@ -108,18 +111,21 @@ void Camera::updateProjection(float _yFov, float _xyRatio, float _zNear, float _ zNear = _zNear; zFar = _zFar; + tan_alphaY = tan(yFov / 2.f); + Icos_alphaX = 1.f / cos(yFov / 2.f*xyRatio); + Icos_alphaY = 1.f / cos(yFov / 2.f); + projection = perspective(yFov, xyRatio, zNear, zFar); } Camera::FC_stat Camera::frustum_sphere(vec3 _center, float _radius) const { - FC_stat result = FC_INSIDE; - + //return result; vec3 v(_center - cCenter); vec3 pVCam(dot(v,cRight), dot(v,cUpVector), dot(v,cFront)); - float h2 = pVCam.z * tan(yFov/2); + float h2 = pVCam.z * tan_alphaY; float w2 = h2 * xyRatio; //float d = _radius * cos @@ -135,11 +141,23 @@ Camera::FC_stat Camera::frustum_sphere(vec3 _center, float _radius) const } else { + float d_y = _radius * Icos_alphaY; + float d_x = _radius * Icos_alphaX; + if (pVCam.z > zFar + _radius || pVCam.z < zNear - _radius) return FC_OUTSIDE; - if (pVCam.z > zFar - _radius || pVCam.z < zNear + _radius) result = FC_INTERSECT; + + if (pVCam.y > h2 + d_y || pVCam.y < -h2 - d_y) + return FC_OUTSIDE; + if (pVCam.y > h2 - d_y || pVCam.y < -h2 + d_y) + result = FC_INTERSECT; + + if (pVCam.x > w2 + d_x || pVCam.x < -w2 - d_x) + return FC_OUTSIDE; + if (pVCam.x > w2 - d_x || pVCam.x < -w2 + d_x) + result = FC_INTERSECT; } diff --git a/Weave/Scene/Camera.h b/Weave/Scene/Camera.h index 9e0fe5d..cb046b0 100644 --- a/Weave/Scene/Camera.h +++ b/Weave/Scene/Camera.h @@ -51,6 +51,10 @@ protected: vec3 cPosition, cCenter, cFront, cUpVector, cRight; float pitch, yaw; float dist; + + /*Frustum*/ + float tan_alphaY; + float Icos_alphaX, Icos_alphaY; }; diff --git a/Weave/Scene/Scene.cpp b/Weave/Scene/Scene.cpp index 9cf7aa4..5ea2672 100644 --- a/Weave/Scene/Scene.cpp +++ b/Weave/Scene/Scene.cpp @@ -327,7 +327,8 @@ void Scene::drawSceneObjects(drawTarget _target) const for (auto i = SceneObjects.cbegin(); i != SceneObjects.cend(); ++i) { - auto result = camera.frustum_sphere((*i)->getPosition()); + + auto result = camera.frustum_sphere((*i)->getPosition() + (*i)->gModel()->getBox().center());// , (*i)->gModel()->getBox().radius()); if (result == camera.FC_OUTSIDE) continue; (*i)->draw(_target); -- 2.47.3