91bb170b23
absoluter clutter beim versuch quads zu implementieren. refactor absolut noetig
64 lines
3.0 KiB
C
64 lines
3.0 KiB
C
#include "structs.h"
|
|
#include "math.h"
|
|
#include "helper.h"
|
|
#include "vectorOp.h"
|
|
|
|
vec3 collisionPointSphere(ray *lightray, sphere *object)
|
|
{
|
|
vec3 collisionPoint;
|
|
collisionPoint.x = -10000000;
|
|
collisionPoint.y = -10000000;
|
|
collisionPoint.z = -10000000;
|
|
double a = lightray->direction.x * lightray->direction.x + lightray->direction.y * lightray->direction.y + lightray->direction.z * lightray->direction.z;
|
|
double b = 2 * ((lightray->direction.x * (lightray->origin.x - object->origin.x)) + (lightray->direction.y * (lightray->origin.y - object->origin.y)) + (lightray->direction.z * (lightray->origin.z - object->origin.z)));
|
|
double c = (lightray->origin.x * lightray->origin.x + object->origin.x * object->origin.x - 2 * lightray->origin.x * object->origin.x)
|
|
+ (lightray->origin.y * lightray->origin.y + object->origin.y * object->origin.y - 2 * lightray->origin.y * object->origin.y)
|
|
+ (lightray->origin.z * lightray->origin.z + object->origin.z * object->origin.z - 2 * lightray->origin.z * object->origin.z)
|
|
- object->radius * object->radius;
|
|
double discriminant = b * b - 4 * a * c;
|
|
if (discriminant < 0) return collisionPoint;
|
|
if (discriminant > 0) {
|
|
double S = (-b - sqrt(discriminant)) / (2 * a);
|
|
if (S < 0) return collisionPoint;
|
|
collisionPoint.x = S * lightray->direction.x + lightray->origin.x;
|
|
collisionPoint.y = S * lightray->direction.y + lightray->origin.y;
|
|
collisionPoint.z = S * lightray->direction.z + lightray->origin.z;
|
|
if (!epsilonCheck(lightray->origin, collisionPoint)) {
|
|
return (vec3){-10000000, -10000000, -10000000};
|
|
}
|
|
|
|
return collisionPoint;
|
|
}
|
|
double S = (-b)/(2*a);
|
|
if (S < 0) return collisionPoint;
|
|
collisionPoint.x = S * lightray->direction.x + lightray->origin.x;
|
|
collisionPoint.y = S * lightray->direction.y + lightray->origin.y;
|
|
collisionPoint.z = S * lightray->direction.z + lightray->origin.z;
|
|
return collisionPoint;
|
|
}
|
|
|
|
vec3 collisionPlane(ray *lightray, plane *object) {
|
|
vec3 collisionPoint;
|
|
double r;
|
|
|
|
if (vec3Product(lightray->direction, object->normal) >= 0) return (vec3){-10000000, -10000000, -10000000};
|
|
|
|
r = vec3Product(object->normal, vec3Subtract(object->origin, lightray->origin)) * 1/(vec3Product(lightray->direction, object->normal));
|
|
|
|
collisionPoint = vec3Add(lightray->origin, vec3Scale(lightray->direction, r));
|
|
return collisionPoint;
|
|
}
|
|
|
|
vec3 collisionQuad(ray *lightray, quad *object) {
|
|
vec3 collisionPoint;
|
|
vec3 corner = vec3Add(vec3Add(object->v1, object->v2),object->origin);
|
|
plane Plane = (plane){object->origin, object->normal};
|
|
collisionPoint = collisionPlane(lightray, &Plane);
|
|
|
|
if (collisionPoint.x < corner.x && collisionPoint.y < corner.y && collisionPoint.z < corner.z && collisionPoint.x > object->origin.x && collisionPoint.y > object->origin.y && collisionPoint.z > object->origin.z) {
|
|
return collisionPoint;
|
|
}
|
|
return (vec3){-10000000, -10000000, -10000000};
|
|
|
|
|
|
} |