]> git.leopard-lacewing.eu Git - cgue_weave.git/commitdiff
point Frustum geht doch nicht
authorPeter Schaefer <schaeferpm@gmail.com>
Thu, 19 May 2016 10:55:22 +0000 (12:55 +0200)
committerPeter Schaefer <schaeferpm@gmail.com>
Thu, 19 May 2016 10:55:22 +0000 (12:55 +0200)
Kugel Frustum ... damit auch nicht

Weave/GLM.h
Weave/Graphix/Model/IMesh.cpp
Weave/Graphix/Model/Model.cpp
Weave/Graphix/Model/Model.h
Weave/Scene/Camera.cpp
Weave/Scene/Camera.h
Weave/Scene/Scene.cpp

index 61a23de4369679fe0591acc6321b272ed79b2333..9b824708d99abf3e97468bf40496879672021960 100644 (file)
@@ -42,7 +42,8 @@ typedef aiMatrix4x4t<float> 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);
index 89ef0443fb6cf53097e27461109aa0f04c94a695..89e5c34bc2db7771923bede09af46068008bc424 100644 (file)
@@ -41,7 +41,7 @@ using std::array;
 IMesh::IMesh(const aiMesh* _mesh, const vec3& _scale) : modelpath("IMesh")\r
 {\r
        loadMesh(_mesh, _scale);\r
-\r
+       //box_init();\r
        //bindModel();\r
 \r
 }\r
index 9866b51809fe3a2617d12fbdcdbdfb3eeb806a11..9803deb8b3e719122e881d81cccb648a9802f968 100644 (file)
@@ -461,10 +461,8 @@ void Model::box_init(const mat4& _model)
        box = Box((max + min) * .5f, (max - min) * .5f);\r
 }\r
 \r
-Box Model::getBox()\r
+Box Model::getBox() const\r
 {\r
-       if (box.size() == vec3(0.f))\r
-               box_init();\r
        return box;\r
 }\r
 \r
index 60daefff37ad8295d84bbad509f72d3afc3d310a..bda41f9962b2b7d11abecfdff0ddbc513c443632 100644 (file)
@@ -58,7 +58,7 @@ public:
        virtual void bt_setMargin(btScalar margin);\r
 \r
        virtual void box_init(const mat4& modelMat = mat4(1.f));\r
-       virtual Box getBox();\r
+       virtual Box getBox() const;\r
 \r
        // Mesh Speichern?\r
        bool loadMesh(const std::string& modelpath, uint mindex = 0);\r
index ed8321182c4f919b13aa74d22519246b8c2eec40..da5dc8e3d34c9421445f49561781691b264549f5 100644 (file)
@@ -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;
        }
 
 
index 9e0fe5d8e06ed0f37d42c3c0fdb11541d8e1814c..cb046b0c58526f028842b7a60ecafefe7db43f64 100644 (file)
@@ -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;
        
 };
 
index 9cf7aa4ddc3a06fb8bfdf53f7fd4d1261e515f5e..5ea26724dc7063d9989923fa683573433516be62 100644 (file)
@@ -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);