seongmik-s-team / miniRT

Raytracing engine written in C
2 stars 1 forks source link

[FEATURE] 주변광, 카메라, 빛, 구, 평면, 원기둥 구조체 결정 토론 #11

Open fing9 opened 7 months ago

fing9 commented 7 months ago

상세

현재 Parsing과 RayTracing으로 나눠서 코드를 짜고 있습니다. 그 과정에서 6개의 오브젝트에 대한 구조체를 결정해야 분업이 가능한 상황에 처했습니다. 주변광, 카메라, 빛, 구, 평면, 원기둥에 대한 구조체를 이 이슈에서 토론으로 정하도록 하겠습니다.

오브젝트

오브젝트 상세

(확정된다면 여기에 적어주세요)

AhnJoonSung commented 7 months ago

주변광에 대해 번쩍이는 아이디어가 떠올랐습니다. 프로그래머는 코드로 말합니다.

typedef struct s_ambient
{
    test   a;
} t_ambient;
AhnJoonSung commented 7 months ago

이거 물체의 반사율도 있어야 할까요? 과제 요구사항만 따지면 필요 없을 거 같은데

fing9 commented 7 months ago

이거 물체의 반사율도 있어야 할까요? 과제 요구사항만 따지면 필요 없을 거 같은데

제 생각에는 그부분은 만약에 필요하면 Phong lighting 구현할 때 추가하면 될 것 같아서 일단은 빼고 구조체 만들어도 될 것 같습니다.

AhnJoonSung commented 7 months ago

일단 물체들은 추가로 더 필요한건 생각 안나는데 일단 기본대로 할까요? 이거 외에 추가적으로 필요해지면 그 때 넣어도 될 거 같은데

fing9 commented 7 months ago

앰비언트 조명: A 0.2 255,255,255 식별자: A 앰비언트 조명 비율 [0.0,1.0] 범위: 0.2 R,G,B 색상 [0-255] 범위: 255, 255, 255

typedef struct s_ambient
{
    t_color3    color; // 조명색 (RGB)
    double      ratio; // 조명빛의 세기 비율 ([0, 1]범위의 값)
}    t_ambient;

위와같이 주변광은 넣으면 될 것 같습니다. 그런데 주변광이 여러개 있을 수 있으니 secen 구조체에서 주변광을 여러개 가지고 있어야할 것 같은데 이거는 조금 더 생각해봐야지 알 것 같습니다.

fing9 commented 7 months ago

일단 물체들은 추가로 더 필요한건 생각 안나는데 일단 기본대로 할까요? 이거 외에 추가적으로 필요해지면 그 때 넣어도 될 거 같은데

튜토리얼 참고해서 필요할만한거 뽑으셔도 되고 말씀하신대로 기본대로 해도 될 것 같습니다.

fing9 commented 7 months ago

카메라: C -50.0,0,20 0,0,1 70

식별자: C 시점의 x,y,z 좌표: -50.0,0,20 3차원 정규화 방향 벡터. 각 x,y,z 축에 대해 [-1,1] 범위: 0.0,0.0,1.0 FOV: 수평 시야각 (도) [0,180] 범위: 70

typedef struct s_camera
{
    t_point3   origin; // 카메라의 좌표(카메라의 원점)
    t_vec3      ov; // orientation vector (카메라가 바라보고 있는 방향을 나타내는 단위벡터)
    double      fov; // Field of view (시야각)
}    t_camera;

흠 이 구조체는 좀 더 정보가 들어가야할 듯 한데 아직 좀 더 써보겠슴다

AhnJoonSung commented 7 months ago

원기둥: cy 50.0,0.0,20.6 0.0,0.0,1.0 14.2 21.42 10,0,255 식별자: cy 원기둥 중심의 x,y,z 좌표: 50.0,0.0,20.6 원기둥의 축의 3차원 정규화 벡터. 각 x,y,z 축에 대해 [-1,1] 범위: 0.0,0.0,1.0 원기둥의 지름: 14.2 원기둥의 높이: 21.42 R,G,B 색상 [0,255] 범위: 10, 0, 255

typedef struct s_cylinder
{
    t_point3    center; // 원기둥의 중심 좌표
    t_vec3      axis; // 원기둥의 방향 벡터 [-1,1]
    double      diameter; // 반지름
    double      height; // 높이
    t_color3    color; // RGB 색상 [0-1]
}               t_cylinder;

기본에 충실했습니다.

AhnJoonSung commented 7 months ago

RGB속성 t_color로 하나요?

AhnJoonSung commented 7 months ago

평면: pl 0.0,0.0,-10.0 0.0,1.0,0.0 0,0,225 식별자: pl 평면 상의 한 점의 x,y,z 좌표: 0.0,0.0,-10.0 3차원 정규화 법선 벡터. 각 x,y,z 축에 대해 [-1,1] 범위: 0.0,1.0,0.0 R,G,B 색상 [0-255] 범위: 0,0,225

typedef struct s_plane
{
    t_point3    center; // 평면의 중심 좌표
    t_vec3      axis; // 평면의 방향 벡터
    t_color3    color; // RGB 색상 [0-1]
}   t_plane;
AhnJoonSung commented 7 months ago

구: sp 0.0,0.0,20.6 12.6 10,0,255 식별자: sp 구의 중심의 x,y,z 좌표: 0.0,0.0,20.6 구의 지름: 12.6 R,G,B 색상 [0-255] 범위: 10, 0, 255

typedef struct s_sphere
{
    t_point3    center; // 구의 중심 좌표
    double      diameter; // 구의 반지름
    t_color3    color; // RGB 색상 [0-1]
}   t_sphere;
AhnJoonSung commented 7 months ago

저 일단 치킨와서 치킨 좀 먹을게요

fing9 commented 7 months ago

치킨 맛나게 드세요 저도 조금있다가 리뷰하겠습니다.

fing9 commented 7 months ago

t_rgb는 RGB로 출력시에만 쓰는거고 내부에서는 색을 0~1사이의 값으로 다룰거라 t_color3구조체로 써주시면 됩니다.

AhnJoonSung commented 7 months ago

라이트: L -40.0,50.0,0.0 0.6 10,0,255 식별자: L 광원의 x,y,z 좌표: -40.0,50.0,0.0 광원 밝기 비율 [0.0,1.0] 범위: 0.6

typedef struct s_light
{
    t_point3 point; // 빛의 좌표
    double ratio;   // 빛의 밝기 비율 [0.0, 1.0]
}   t_light;
fing9 commented 7 months ago

현재 장면에 대한 전체 데이터를 들고있고 보관하는 scene 구조체입니다.

typedef struct s_scene
{
    int     width;
    int height;
    double aspect_ratio; // 종횡비 (스크린 가로 길이 / 세로 길이)
    t_ambient ambient;   // 주변광
    t_camera camera;     // 카메라
    t_list *light_list;  // 라이트 리스트
    t_list *object_list; // 오브젝트 리스트
}   t_scene;