seongmik-s-team / miniRT

Raytracing engine written in C
2 stars 1 forks source link

[BUG] Cylinder Rendering Bug #24

Closed AhnJoonSung closed 6 months ago

AhnJoonSung commented 6 months ago

<방향벡터 : [0, 1, 0]>

image

원기둥을 똑바로 세워서 보면 이렇게 잘 나오는데,

<방향벡터 : [0, 1, -0.3]>

image

이렇게 앞이나 뒤로 비스듬히 세우면 왜곡현상이 나타납니다. 화면 외각이라 늘어나나 했는데 원기둥을 아래로 내려도 그대로 원기둥의 윗쪽이 더 뚱뚱하게 나오네요.

오홍홍햄빠끄

fing9 commented 6 months ago

오!! 원기둥 벌써 구현하신건가요?? 근데 ㅋㅋㅋㅋㅋ 이게 머시야 원기둥 기울인 다음에 카메라 위치 바꿔서 옆에서 봐도 왜곡이 생기나요?

fing9 commented 6 months ago

지금 하신 부분까지 푸쉬 해놓으시면 제가 그 브랜치 들어가서 한번 보고싶은데 푸쉬해두셨나요?

fing9 commented 6 months ago

푸쉬되어있길래 봐봤는데.. 음.. 원기둥을 안돌리거나 1,0,0이나 0,0,1같이 직각으로 돌리면 아무 문제 없는데 여러 축 섞어서 돌리는 순간 문제 발생이네요

fing9 commented 6 months ago

근데 이거 코드가 튜토리얼이랑 똑 닮은 꼴인데 혹시 레퍼런스 있으시면 여기에 링크 남겨주실수있나요?

AhnJoonSung commented 6 months ago

아 지피티와 협업하면서 했습니다

fing9 commented 6 months ago

코드 좀 읽어보면서 저도 한번 고쳐보겠습니다!

AhnJoonSung commented 6 months ago

저는 그럼 저녁 좀 먹고 마저 보겠습니다!!!!!!!!

AhnJoonSung commented 6 months ago
image

오 일단 조명이랑 그림자 부분 성민님이 작성하신거 보고 대충 코드 쳐봤는데 적용이 되긴 하는듯요? 옆면만 적용해봤어요

fing9 commented 6 months ago

오 지리는데여? 완전 잘 적용되네요

fing9 commented 6 months ago

이거 고친거같습니다.

image
fing9 commented 6 months ago

// 원기둥의 옆면에 맞았는지 판정
t_bool  hit_cylinder_side(t_cylinder *cy, t_ray ray)
{
    t_point3    O;
    double      t;
    t_vec3      D;
    t_point3    C;
    t_vec3      V;
    double      r;
    double      a;
    double      b;
    t_vec3      OC;
    double      c;
    t_point3    P;
    t_point3    P_proj;
    double      distance;
    double      h;

    O = ray.origin;
    D = ray.direction;
    C = cy->center;
    V = vunit(cy->axis); // 단위벡터로 변경
    r = cy->diameter;
    OC = (t_vec3)vminus(O, C);
    a = vdot(D, D) - pow(vdot(D, V), 2);
    b = 2.0 * ((vdot(D, OC) - vdot(D, V) * vdot(OC, V)));
    c = vdot(OC, OC) - pow(vdot(OC, V), 2) - r * r;
    if (b * b - 4.0 * a * c > 0)
    {
        t = (-b - sqrt(b * b - 4.0 * a * c)) / (2.0 * a);
        if (t < 0)
        {
            t = (-b + sqrt(b * b - 4.0 * a * c)) / (2.0 * a);
            if (t < 0)
                return (FALSE);
        }
        P = ray_at(ray, t);                                 // 표면에 위치한 교점
        P_proj = vplus(C, vmult(V, vdot(vminus(P, C), V))); // 교점P를 원기둥 축으로의 투영
        distance = vdot(vminus(P_proj, C), V);
        // C에서 부터 투영 점 P_proj까지의 거리
        h = cy->height;
        if (distance < 0 || distance > h)
            return (FALSE);
        return (TRUE);
    }
    return (FALSE);
}
fing9 commented 6 months ago

원기둥의 방향벡터를 단위벡터로 안바꿔주고있어서 정사영에 문제가 있을거같아서 단위벡터로 바꿔줬더니 해결됐네요

fing9 commented 6 months ago

윗뚜껑만 추가로 닫아주면 되겠네요

AhnJoonSung commented 6 months ago

오 천재만재십만재 아예 파싱할 때 처리해줘야겠네요

AhnJoonSung commented 6 months ago

윗뚜껑도 닫아보겠습니다

fing9 commented 6 months ago

근데 주안님 지금 실린더 약간 잘못구현된게 하나 있는거같아요 실린더의 좌표가 실린더 바닥의 중심좌표가아니라 실린더 자체의 중앙의 좌표인데 지금은 바닥의 중심좌표로 치는거같아요

AhnJoonSung commented 6 months ago

아 그거는 중점을 바닥점으로 많이 보는거 같길래 그렇게 해뒀는데 바로 바꿀 수 있어요