mat4_lookat

This commit is contained in:
gbrochar 2020-12-23 17:06:42 +01:00
parent 3aa9bf6fe3
commit be37bd8c3e
5 changed files with 159 additions and 4 deletions

View File

@ -6,7 +6,7 @@
# By: gbrochar <gbrochar@student.42.fr> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2020/12/17 19:47:03 by gbrochar #+# #+# #
# Updated: 2020/12/23 10:49:53 by gbrochar ### ########.fr #
# Updated: 2020/12/23 17:05:36 by gbrochar ### ########.fr #
# #
# **************************************************************************** #
@ -18,6 +18,8 @@ SRC_FILE = main.c \
env.c \
mat4_transpose.c \
mat4_multiply.c \
mat4_perspective.c \
mat4_lookat.c \
OBJ_FILE = $(SRC_FILE:.c=.o)
@ -31,7 +33,7 @@ SRC = $(addprefix $(SRC_DIR), $(SRC_FILE))
OBJ = $(addprefix $(OBJ_DIR), $(OBJ_FILE))
INC = $(addprefix $(INC_DIR), $(INC_FILE))
LIB =
LIB = -lm
CC = gcc

View File

@ -6,7 +6,7 @@
/* By: gbrochar <gbrochar@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/12/22 20:35:00 by gbrochar #+# #+# */
/* Updated: 2020/12/23 16:12:55 by gbrochar ### ########.fr */
/* Updated: 2020/12/23 17:04:47 by gbrochar ### ########.fr */
/* */
/* ************************************************************************** */
@ -14,6 +14,7 @@
# define MAT4_H
# include "vec4.h"
# include <math.h>
typedef struct s_mat4 t_mat4;
typedef struct s_persp_tool t_persp_tool;

View File

@ -6,7 +6,7 @@
/* By: gbrochar <gbrochar@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/12/22 12:08:22 by gbrochar #+# #+# */
/* Updated: 2020/12/22 20:15:56 by gbrochar ### ########.fr */
/* Updated: 2020/12/23 16:23:16 by gbrochar ### ########.fr */
/* */
/* ************************************************************************** */
@ -25,6 +25,8 @@
# define BUFFER_SIZE 4096
# define EPSILON 0.000001
typedef enum e_gl_buf_type t_gl_buf_type;
enum e_gl_buf_type

25
inc/vec3.h Normal file
View File

@ -0,0 +1,25 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* vec3.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: gbrochar <gbrochar@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/12/23 16:14:13 by gbrochar #+# #+# */
/* Updated: 2020/12/23 16:14:28 by gbrochar ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef VEC3_H
# define VEC3_H
typedef struct s_vec3 t_vec3;
struct s_vec3
{
double x;
double y;
double z;
};
#endif

125
src/mat4_lookat.c Normal file
View File

@ -0,0 +1,125 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* mat4_lookat.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: gbrochar <gbrochar@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/12/23 16:14:47 by gbrochar #+# #+# */
/* Updated: 2020/12/23 17:05:21 by gbrochar ### ########.fr */
/* */
/* ************************************************************************** */
#include "mat4.h"
#include "vec3.h"
#include "scop.h"
t_mat4 mat4_lookat_make_mat(t_vec3 x, t_vec3 y, t_vec3 z, t_vec3 eye)
{
t_mat4 ret;
ret.data[0] = x.x;
ret.data[1] = x.y;
ret.data[2] = x.z;
ret.data[3] = 0;
ret.data[4] = y.x;
ret.data[5] = y.y;
ret.data[6] = y.z;
ret.data[7] = 0;
ret.data[8] = z.x;
ret.data[9] = z.y;
ret.data[10] = z.z;
ret.data[11] = 0;
ret.data[12] = -(x.x * eye.x + x.y * eye.y + x.z * eye.z);
ret.data[13] = -(y.x * eye.x + y.y * eye.y + y.z * eye.z);
ret.data[14] = -(z.x * eye.x + z.y * eye.y + z.z * eye.z);
ret.data[15] = 1;
return (ret);
}
t_vec3 mat4_lookat_make_y(t_vec3 x, t_vec3 z)
{
t_vec3 y;
double len;
y.x = z.y * x.z - z.z * x.y;
y.y = z.z * x.x - z.x * x.z;
y.z = z.x * x.y - z.y * x.x;
len = y.x * y.x + y.y * y.y + y.z * y.z;
if (len - EPSILON < 0 && len + EPSILON > 0)
{
y.x = 0;
y.y = 0;
y.z = 0;
}
else
{
len = 1.0 / sqrt(len);
y.x *= len;
y.y *= len;
y.z *= len;
}
return (y);
}
t_vec3 mat4_lookat_make_x(t_vec3 z, t_vec3 up)
{
t_vec3 x;
double len;
x.x = up.y * z.z - up.z * z.y;
x.y = up.z * z.x - up.x * z.z;
x.z = up.x * z.y - up.y * z.x;
len = x.x * x.x + x.y * x.y + x.z * x.z;
if (len - EPSILON < 0 && len + EPSILON > 0)
{
x.x = 0;
x.y = 0;
x.z = 0;
}
else
{
len = 1.0 / sqrt(len);
x.x *= len;
x.y *= len;
x.z *= len;
}
return (x);
}
t_vec3 mat4_lookat_make_z(t_vec3 eye, t_vec3 target)
{
t_vec3 z;
double len;
z.x = eye.x - target.x;
z.y = eye.y - target.y;
z.z = eye.z - target.z;
len = z.x * z.x + z.y * z.y + z.z * z.z;
if (len - EPSILON < 0 && len + EPSILON > 0)
{
z.x = 0;
z.y = 0;
z.z = 1;
}
else
{
len = 1.0 / sqrt(len);
z.x *= len;
z.y *= len;
z.z *= len;
}
return (z);
}
t_mat4 mat4_lookat(t_vec3 eye, t_vec3 up, t_vec3 target)
{
t_vec3 z;
t_vec3 x;
t_vec3 y;
z = mat4_lookat_make_z(eye, target);
x = mat4_lookat_make_x(z, up);
y = mat4_lookat_make_y(x, z);
return (mat4_lookat_make_mat(x, y, z, eye));
}