Code Monkey home page Code Monkey logo

minirt's Introduction

minirt's People

Contributors

corvvs avatar ryo-manba avatar

Stargazers

 avatar

Watchers

 avatar  avatar

minirt's Issues

[質問] 幅を2.0に固定する

現状、ビューポートの高さは2.0で固定されており、幅は縦横比に応じて変わるようになっています。
ですが、カメラのパラメータFOVは「水平方向」の視野角になっています。
そのため、ビューポートの幅の方を固定した方が良いような気がしています。
検討をお願いします。

[Task] RTファイル読み込み

今考えている処理フロー

  1. ファイルの内容を全て単一の文字列に入れる
  2. 文字列を改行でsplitし、文字列配列に分解する。
  3. 文字列配列をスペースでsplitし、文字列配列に分解する。
  4. 文字列配列がなんらかの要素にマッチするなら、その要素として判定する。
  5. 文字列配列を要素structに変換する。

[協議] ライト`L`はただ1つか?

今までライトLは複数あることを想定していましたが、課題PDFをよく読むとライトも1つっぽいです。
今ライトは複数あることを前提にしていますが、複数対応しているとMandatoryのレビューで落とされる可能性がなくもないと思います。
これについて対応を協議したいです。

[質問] 色ベクトル*など*について

色ベクトルt_rgbは各要素がintになってますが、できればdoubleに変えたいです。不都合ありますでしょうか?
また、FOVもintになっていますが、これもdoubleにしたいです。
(というかオブジェクトの数値はすべてdoubleにしたい。)

[WIP] テスター作成

rtfileの読み込みが正しく動作するかを確認するテスターを作成します。

[質問] `make -C rd re && make`を繰り返すとエラーになる

正常終了とエラーとが交互に起きるっぽい。
なぜこうなる?

bash-3.2$ make -C rd re && make
rm -f -rf rd_file.o rd_error.o rd_scene.o rd_after_read.o rd_scene_destroyer.o rd_vector.o rd_element_predicate.o rd_scalar_predicate.o rd_vector_predicate.o rd_double.o rd_extractor.o rd_element_slot.o rd_field_extractor.o rd_attach_attribute.o rd_after_extraction.o rd_debug.o 
rm -f libread.a
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_file.o rd_file.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_error.o rd_error.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_scene.o rd_scene.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_after_read.o rd_after_read.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_scene_destroyer.o rd_scene_destroyer.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_vector.o rd_vector.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_element_predicate.o rd_element_predicate.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_scalar_predicate.o rd_scalar_predicate.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_vector_predicate.o rd_vector_predicate.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_double.o rd_double.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_extractor.o rd_extractor.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_element_slot.o rd_element_slot.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_field_extractor.o rd_field_extractor.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_attach_attribute.o rd_attach_attribute.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_after_extraction.o rd_after_extraction.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_debug.o rd_debug.c
ar rcs libread.a rd_file.o rd_error.o rd_scene.o rd_after_read.o rd_scene_destroyer.o rd_vector.o rd_element_predicate.o rd_scalar_predicate.o rd_vector_predicate.o rd_double.o rd_extractor.o rd_element_slot.o rd_field_extractor.o rd_attach_attribute.o rd_after_extraction.o rd_debug.o
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g  -Llibft -Lminilibx-linux -Lrd -lmlx -L//usr/X11/include/../lib -lXext -lX11 -lm -lread -lft -o miniRT
Undefined symbols for architecture x86_64:
  "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [miniRT] Error 1
bash-3.2$ make -C rd re && make
rm -f -rf rd_file.o rd_error.o rd_scene.o rd_after_read.o rd_scene_destroyer.o rd_vector.o rd_element_predicate.o rd_scalar_predicate.o rd_vector_predicate.o rd_double.o rd_extractor.o rd_element_slot.o rd_field_extractor.o rd_attach_attribute.o rd_after_extraction.o rd_debug.o 
rm -f libread.a
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_file.o rd_file.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_error.o rd_error.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_scene.o rd_scene.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_after_read.o rd_after_read.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_scene_destroyer.o rd_scene_destroyer.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_vector.o rd_vector.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_element_predicate.o rd_element_predicate.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_scalar_predicate.o rd_scalar_predicate.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_vector_predicate.o rd_vector_predicate.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_double.o rd_double.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_extractor.o rd_extractor.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_element_slot.o rd_element_slot.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_field_extractor.o rd_field_extractor.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_attach_attribute.o rd_attach_attribute.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_after_extraction.o rd_after_extraction.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_debug.o rd_debug.c
ar rcs libread.a rd_file.o rd_error.o rd_scene.o rd_after_read.o rd_scene_destroyer.o rd_vector.o rd_element_predicate.o rd_scalar_predicate.o rd_vector_predicate.o rd_double.o rd_extractor.o rd_element_slot.o rd_field_extractor.o rd_attach_attribute.o rd_after_extraction.o rd_debug.o
mkdir -p ./objs/
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/debug.o srcs/debug.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/main.o srcs/main.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/mr_mlx_utils.o srcs/mr_mlx_utils.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/mr_mlx_hooks.o srcs/mr_mlx_hooks.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/mr_vec3_utils.o srcs/mr_vec3_utils.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/mr_vec3_operator.o srcs/mr_vec3_operator.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/mr_vec3_operator2.o srcs/mr_vec3_operator2.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/mr_vec3_operator_composit.o srcs/mr_vec3_operator_composit.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/mr_reading_imagefile.o srcs/mr_reading_imagefile.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/mr_error.o srcs/mr_error.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_raytracer.o srcs/rt_raytracer.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_color.o srcs/rt_color.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_reflection.o srcs/rt_reflection.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_tangent.o srcs/rt_tangent.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_object_sphere.o srcs/rt_object_sphere.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_object_plane.o srcs/rt_object_plane.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_object_cylinder.o srcs/rt_object_cylinder.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_object_paraboloid.o srcs/rt_object_paraboloid.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_object_cone.o srcs/rt_object_cone.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_hit_util.o srcs/rt_hit_util.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_vector_rotation.o srcs/rt_vector_rotation.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_is_shadow.o srcs/rt_is_shadow.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_texture_plane.o srcs/rt_texture_plane.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_texture_sphere.o srcs/rt_texture_sphere.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_texture_cylinder.o srcs/rt_texture_cylinder.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_texture_paraboloid.o srcs/rt_texture_paraboloid.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_texture_cone.o srcs/rt_texture_cone.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_ambient.o srcs/rt_ambient.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_diffuse.o srcs/rt_diffuse.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_specular.o srcs/rt_specular.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_coord_util.o srcs/rt_coord_util.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_equation.o srcs/rt_equation.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_bumpfunc.o srcs/rt_bumpfunc.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g -c -o objs/rt_fmath.o srcs/rt_fmath.c
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g ./objs/debug.o ./objs/main.o ./objs/mr_mlx_utils.o ./objs/mr_mlx_hooks.o ./objs/mr_vec3_utils.o ./objs/mr_vec3_operator.o ./objs/mr_vec3_operator2.o ./objs/mr_vec3_operator_composit.o ./objs/mr_reading_imagefile.o ./objs/mr_error.o ./objs/rt_raytracer.o ./objs/rt_color.o ./objs/rt_reflection.o ./objs/rt_tangent.o ./objs/rt_object_sphere.o ./objs/rt_object_plane.o ./objs/rt_object_cylinder.o ./objs/rt_object_paraboloid.o ./objs/rt_object_cone.o ./objs/rt_hit_util.o ./objs/rt_vector_rotation.o ./objs/rt_is_shadow.o ./objs/rt_texture_plane.o ./objs/rt_texture_sphere.o ./objs/rt_texture_cylinder.o ./objs/rt_texture_paraboloid.o ./objs/rt_texture_cone.o ./objs/rt_ambient.o ./objs/rt_diffuse.o ./objs/rt_specular.o ./objs/rt_coord_util.o ./objs/rt_equation.o ./objs/rt_bumpfunc.o ./objs/rt_fmath.o -Llibft -Lminilibx-linux -Lrd -lmlx -L//usr/X11/include/../lib -lXext -lX11 -lm -lread -lft -o miniRT
bash-3.2$ make -C rd re && make
rm -f -rf rd_file.o rd_error.o rd_scene.o rd_after_read.o rd_scene_destroyer.o rd_vector.o rd_element_predicate.o rd_scalar_predicate.o rd_vector_predicate.o rd_double.o rd_extractor.o rd_element_slot.o rd_field_extractor.o rd_attach_attribute.o rd_after_extraction.o rd_debug.o 
rm -f libread.a
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_file.o rd_file.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_error.o rd_error.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_scene.o rd_scene.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_after_read.o rd_after_read.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_scene_destroyer.o rd_scene_destroyer.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_vector.o rd_vector.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_element_predicate.o rd_element_predicate.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_scalar_predicate.o rd_scalar_predicate.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_vector_predicate.o rd_vector_predicate.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_double.o rd_double.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_extractor.o rd_extractor.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_element_slot.o rd_element_slot.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_field_extractor.o rd_field_extractor.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_attach_attribute.o rd_attach_attribute.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_after_extraction.o rd_after_extraction.c
gcc -Wall -Wextra -Werror -g -I/usr/X11/include -I../minilibx-linux -I../includes -I../common -I../libft   -c -o rd_debug.o rd_debug.c
ar rcs libread.a rd_file.o rd_error.o rd_scene.o rd_after_read.o rd_scene_destroyer.o rd_vector.o rd_element_predicate.o rd_scalar_predicate.o rd_vector_predicate.o rd_double.o rd_extractor.o rd_element_slot.o rd_field_extractor.o rd_attach_attribute.o rd_after_extraction.o rd_debug.o
gcc -Werror -Wall -Wextra -I/usr/X11/include -Iminilibx-linux -Ilibft -Iincludes -Icommon -Ird -g  -Llibft -Lminilibx-linux -Lrd -lmlx -L//usr/X11/include/../lib -lXext -lX11 -lm -lread -lft -o miniRT
Undefined symbols for architecture x86_64:
  "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [miniRT] Error 1
bash-3.2$ 

[質問] 拡散反射について

  1. 衝突した点から、光源までのベクトルを求めるにはどうするか。
  2. この場合の光源は、Ambient lightningを指すのか、それとも Light の方を指すか。
  3. 衝突点から光源までのベクトルの途中で、他のオブジェクトと衝突した場合の処理はどうするか。

以上3点です。回答お願いします。

[質問] チェッカーボードについて

コードの解説

パラメータtheta, phiとは何か?

これは、それぞれ方位角・仰角と呼ばれる角度です。
半径が分かっている場合、方位角・仰角が分かれば、球面上の位置を特定することができます。

  • theta = atan2(x, z); は、X軸を横軸、Z軸を縦軸に取った時の、横軸から測った角度を表します。
    • atan2は-πから+πまでの値を取るので、thetaもそうなります。
  • phi = acos(y); は、Y軸を縦軸に取った時の、縦軸から測った角度を表します。
    • acosは0からπまでの値を取るので、phiもそうなります。

※thetaを仰角、phiを方位角とするのが一般的です。

パラメータu,vとは何か?

theta, phiはラジアン単位の角度なので、-πから+πまでの値を取ります。
これを、-1から+1までの値を取るように補正したものがu, vと考えられます。

  • u = 1 - (theta / (2 * M_PI) + 0.5)
    • thetaは-πから+πまでの値を取るので、uは1から0までの値を取ります。
  • v = 1 - (phi / M_PI)
    • phiは0から+πまでの値を取るので、vは0から1までの値を取ります。
    • y = +1の時phi = 0, y = 0の時 phi = π/2, y = -1の時phi = πとなります。
    • vはそれぞれ1, 1/2, 0となります。

u, vの「意味」を考えるために、原点(0, 0, 0)を中心とする半径1の球面を考えます。
この球の「南極」(0, -1, 0)から「北極」(0, +1, 0)に向かって、球面上に線を描きます。
これはいわゆる「経線」となります。

この時、パラメータvは「経線上の長さ」に相当します。南極から出発した直後ではv = 0,
「赤道」上ではv = 1/2, 北極についた時点でv = 1となります。

また、球面上にyを一定とする線を描くと、これは「緯線」に相当します。
パラメータuは「緯線上の長さ」に相当します。

double sines = sin(m_freq * u) * sin(m_freq * v);の意味

サイン関数sin(x)は、0 <= x <= πならば0以上、π <= x <= 2πなら0以下の値を取ります。
それ以外の範囲では、たとえば-π <= x <= 0ならば0以下の値を取る、という風に、
0以下の値、0以上の値、0以下の値・・・・という風にπごとに繰り返します。

そして、掛け算により

  • (0以下の値) x (0以下の値) = (0以上の値)
  • (0以下の値) x (0以上の値) = (0以下の値)
  • (0以上の値) x (0以下の値) = (0以下の値)
  • (0以上の値) x (0以上の値) = (0以上の値)

という風に変化します。
表にすると、

0以上の値 0以下の値 0以上の値 0以下の値
0以上の値 0以上の値 0以下の値 0以上の値 0以下の値
0以下の値 0以下の値 0以上の値 0以下の値 0以上の値
0以上の値 0以上の値 0以下の値 0以上の値 0以下の値
0以下の値 0以下の値 0以上の値 0以下の値 0以上の値

という風に、0以上と0以下がチェッカーボード状に変化します。

サイン関数を、定数aを使ってsin(ax)に書き直すと、値の変化は
0 <= x <= π/aならば0以上、π/a <= x <= 2π/aならば0以下、となります。
さらにa = πbとすると、
0 <= x <= 1/bならば0以上、1/b <= x <= 2/bならば0以下、となります。
よって、例えばa = 4πとすると、
0 <= x <= 1/4ならば0以上、1/4 <= x <= 1/2ならば0以下、となります。
つまり、一周当たり4回変化することになります。

実は

double sines = sin(m_freq * u * M_PI) * sin(m_freq * v * M_PI);
if (sines > 0)
{ ... }
else
{ ... }

は、

int sines = (int)(floor(m_freq * u) + floor(m_freq * v));
if (sines % 2 == 0)
{ ... }
else
{ ... }

とほぼ同じになります。

質問1

double phi = acos(rec->normal.y / M_PI);

M_PIで割っているのはなぜでしょう?

質問2

miniRT/main.c

Line 72 in 69559f9

double sines = sinf(m_freq * u) * sinf(m_freq * v) * sinf(m_freq * -10);

sinf(float返すバージョンのsin)を使ってるのはなぜでしょう?
(sinで良い気がします)

質問3

miniRT/main.c

Line 72 in 69559f9

double sines = sinf(m_freq * u) * sinf(m_freq * v) * sinf(m_freq * -10);

最後の * sin(m_freq * -10)はなぜ必要なのでしょうか?
(定数なので別にいらないような)

submit前チェックリスト

  • Subject最終確認
  • **(YK担当)**norminette通す
  • **(RM担当)**rtfile読み込みのテスター作成
  • **(RM担当)**それぞれの図形のrtfile追加
  • **(YK担当)**Leakチェック
  • (YK担当)nm -u で使用可能関数確認
  • (YK担当)日本語のコメント確認
  • (YK担当)ESCキーで終了
  • 解像度1080p
  • ボーナス分割?
  • leaks/valgrindを使ったリークチェック

[提案] シーン構造体

シーン、つまりRTファイルに書かれたオブジェクトの配置を表現する構造体として、次のようなものを提案します:

typedef struct s_element
{
	t_element_type		etype;
	t_vec3			position;
	t_vec3			direction;
	t_vec3			color;
	double			ratio;
	double			radius;
	double			diameter;
	double			height;
	double			fov;
	struct s_element	*next;
}	t_element;

typedef struct s_scene
{
	t_element	*ambient; // 絶対にNULLにならない
	t_element	*camera; // 絶対にNULLにならない
	size_t		n_lights; // 配列の長さ
	size_t		n_objects; // 配列の長さ
	t_element	**lights; // ポインタの配列
	t_element	**objects; // ポインタの配列
}	t_scene;

[bugfix] 鏡面反射にバグがありそう -> なかった。むしろ円錐にバグがあった。

現象

A  0.3      100,100,200
L  0,2000,0  0.8         255,0,0
C  0,0,-2  0,0,+1 90
co 0,0,10   0,0,-1   90 200,200,200

シャドウの判定をしない状態で、上のRTファイルから、次の画像が得られる:

image

状況を説明しておくと、

  • ライトは原点から遥か上空にいる。色は赤い。
  • カメラは原点のZ軸少し後方から、Z軸正方向を見ている
  • 円錐はカメラの正面にいて、カメラをすっぽり覆っている。色は明るい灰色。
    • カメラの視界はすべて円錐の内側にあり、一方ライトは円錐の外側にいる。

この状態では、円錐内にはライトの光は侵入しないはずだが、画像では赤い色がついている。
これは明らかに正しくない。

鏡面反射をカットすると赤色は消えたので、鏡面反射にバグがあると考えられる。

**Submit前最終チェック**

Submit直前に二人でやるチェックリスト。

  • もう一度make norm
    • RM
    • YK
  • もう一度make nm_grep
    • RM
    • YK
  • Linux VMで動くか?
    • RM
    • YK
  • 手元のMacで動くか?
    • RM
    • YK
  • リークはないか?
    • RM
    • YK
  • 42のリポジトリにpushしたか?
    • RM
    • YK

[TODO]残された課題一覧

Mandatory

  • 解像度を指定できるようにする(いらなかった)

Bonus

  • 色付きライト&マルチスポットライトの対応
  • 物体を1つ追加する: Cone, Hyperboloid, Paraboloid..
  • チェック柄(チェスボードみたいな柄)を扱う
  • bump map テクスチャを扱う

##他にあれば追記お願いします!##

[bug] Camera, Ambient, Lightがない場合にAbortする.

./miniRT rtfiles/invalid_rtfiles/no_ambient.rt

==75734==ERROR: AddressSanitizer: heap-use-after-free on address 0x6110000005d0 at pc 0x000106098128 bp 0x7ff7b9e8ae80 sp 0x7ff7b9e8ae78
READ of size 8 at 0x6110000005d0 thread T0
    #0 0x106098127 in free_elemlist+0x47 (miniRT:x86_64+0x100024127)
    #1 0x106098088 in rd_destroy_temp_scene_fail+0x138 (miniRT:x86_64+0x100024088)
    #2 0x1060960e5 in rd_print_error rd_error.c:19
    #3 0x10609763d in rd_after_read rd_after_read.c:44
    #4 0x10609698a in rd_read_scene rd_scene.c:109
    #5 0x10607841c in setup main.c:47
    #6 0x106078c25 in main main.c:70
    #7 0x10630b4fd in start+0x1cd (dyld:x86_64+0x54fd)

rd_scene_destroyer.c
rd_destroy_temp_scene_fail()でfree_elemlist(temp_scene->object_list);を呼ぶとアボートしてます。

rd_scene_destroyer.c
free_elemlist()でrd_destroy_element()を2回呼び出しており、
178行目 free(el)終わってるみたいです。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.