Kevin Trogant
ffbe68606b
First (sort-of) working version of a pinhole camera model. Improvement idea: - Stretch result image to the whole size
60 lines
1.5 KiB
C
60 lines
1.5 KiB
C
#include <defocus/base.h>
|
|
|
|
#include <math.h>
|
|
|
|
df_v3 df_add_v3(df_v3 a, df_v3 b)
|
|
{
|
|
df_v3 v = {a.x + b.x, a.y + b.y, a.z + b.z};
|
|
return v;
|
|
}
|
|
|
|
df_v3 df_sub_v3(df_v3 a, df_v3 b)
|
|
{
|
|
df_v3 v = {a.x - b.x, a.y - b.y, a.z - b.z};
|
|
return v;
|
|
}
|
|
|
|
float df_dot_v3(df_v3 a, df_v3 b) { return a.x * b.x + a.y * b.y + a.z * b.z; }
|
|
|
|
df_v3 df_mul_v3(float t, df_v3 v)
|
|
{
|
|
df_v3 r = {t * v.x, t * v.y, t * v.z};
|
|
return r;
|
|
}
|
|
|
|
df_v3 df_normalize_v3(df_v3 v)
|
|
{
|
|
float len_square = df_dot_v3(v, v);
|
|
float len = sqrtf(len_square);
|
|
df_v3 n = {v.x / len, v.y / len, v.z / len};
|
|
return n;
|
|
}
|
|
|
|
df_line_plane_intersection df_calc_line_plane_intersection(df_line line, df_plane plane)
|
|
{
|
|
/* check case */
|
|
float dot = df_dot_v3(line.direction, plane.normal);
|
|
df_v3 base_diff = df_sub_v3(plane.base, line.base);
|
|
float dot2 = df_dot_v3(base_diff, plane.normal);
|
|
if (dot != 0) {
|
|
float t = dot2 / dot;
|
|
df_v3 point = df_add_v3(line.base, df_mul_v3(t, line.direction));
|
|
df_line_plane_intersection intersection = {
|
|
.type = df_line_plane_intersection_vector,
|
|
.vec = point,
|
|
};
|
|
return intersection;
|
|
} else {
|
|
if (dot2 == 0) {
|
|
df_line_plane_intersection intersection = {
|
|
.type = df_line_plane_intersection_contained,
|
|
};
|
|
return intersection;
|
|
} else {
|
|
df_line_plane_intersection intersection = {
|
|
.type = df_line_plane_intersection_none,
|
|
};
|
|
return intersection;
|
|
}
|
|
}
|
|
} |