Closed AhnJoonSung closed 6 months ago
오!! 원기둥 벌써 구현하신건가요?? 근데 ㅋㅋㅋㅋㅋ 이게 머시야 원기둥 기울인 다음에 카메라 위치 바꿔서 옆에서 봐도 왜곡이 생기나요?
지금 하신 부분까지 푸쉬 해놓으시면 제가 그 브랜치 들어가서 한번 보고싶은데 푸쉬해두셨나요?
푸쉬되어있길래 봐봤는데.. 음.. 원기둥을 안돌리거나 1,0,0이나 0,0,1같이 직각으로 돌리면 아무 문제 없는데 여러 축 섞어서 돌리는 순간 문제 발생이네요
근데 이거 코드가 튜토리얼이랑 똑 닮은 꼴인데 혹시 레퍼런스 있으시면 여기에 링크 남겨주실수있나요?
아 지피티와 협업하면서 했습니다
코드 좀 읽어보면서 저도 한번 고쳐보겠습니다!
저는 그럼 저녁 좀 먹고 마저 보겠습니다!!!!!!!!
오 일단 조명이랑 그림자 부분 성민님이 작성하신거 보고 대충 코드 쳐봤는데 적용이 되긴 하는듯요? 옆면만 적용해봤어요
오 지리는데여? 완전 잘 적용되네요
이거 고친거같습니다.
// 원기둥의 옆면에 맞았는지 판정
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);
}
원기둥의 방향벡터를 단위벡터로 안바꿔주고있어서 정사영에 문제가 있을거같아서 단위벡터로 바꿔줬더니 해결됐네요
윗뚜껑만 추가로 닫아주면 되겠네요
오 천재만재십만재 아예 파싱할 때 처리해줘야겠네요
윗뚜껑도 닫아보겠습니다
근데 주안님 지금 실린더 약간 잘못구현된게 하나 있는거같아요 실린더의 좌표가 실린더 바닥의 중심좌표가아니라 실린더 자체의 중앙의 좌표인데 지금은 바닥의 중심좌표로 치는거같아요
아 그거는 중점을 바닥점으로 많이 보는거 같길래 그렇게 해뒀는데 바로 바꿀 수 있어요
<방향벡터 : [0, 1, 0]>
원기둥을 똑바로 세워서 보면 이렇게 잘 나오는데,
<방향벡터 : [0, 1, -0.3]>
이렇게 앞이나 뒤로 비스듬히 세우면 왜곡현상이 나타납니다. 화면 외각이라 늘어나나 했는데 원기둥을 아래로 내려도 그대로 원기둥의 윗쪽이 더 뚱뚱하게 나오네요.
오홍홍햄빠끄