#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);
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)
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();
}
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
}
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;
}