2014-02-14 6 views
0

저는 RayTracer에서 작업 중입니다. 원뿔과의 교차점을 계산하려고 할 때 내가 잘못하고있는 것을 파악할 수 없습니다. 나는 광선 벡터와 축이있는 원뿔의 위치를가집니다. 간단한 축을 따라 원뿔을 계산하는 것은 쉽지만 임의의 축을 사용하여 원한다는 것을 알고 있습니다. 나는 그것을 회전 할 수 있도록임의의 축을 따라 원뿔을 Raytracing

alpha = cone->angle * (PI/180); 
axe.x = 0; 
axe.y = 1; 
axe.z = 0; 

delt_p = vectorize(cone->position, ray.origin); 
tmp1.x = ray.vector.x - (dot_product(ray.vector, axe) * axe.x); 
tmp1.y = ray.vector.y - (dot_product(ray.vector, axe) * axe.y); 
tmp1.z = ray.vector.z - (dot_product(ray.vector, axe) * axe.z); 
tmp2.x = (delt_p.x) - (dot_product(delt_p, axe) * axe.x); 
tmp2.y = (delt_p.y) - (dot_product(delt_p, axe) * axe.y); 
tmp2.z = (delt_p.z) - (dot_product(delt_p, axe) * axe.z); 

a = (pow(cos(alpha), 2) * dot_product(tmp1, tmp1)) - (pow(sin(alpha), 2) * dot_product(ray.vector, axe)); 
b = 2 * ((pow(cos(alpha), 2) * dot_product(tmp1, tmp2)) - (pow(sin(alpha), 2) * dot_product(ray.vector, axe) * dot_product(delt_p, axe))); 
c = (pow(cos(alpha), 2) * dot_product(tmp2, tmp2)) - (pow(sin(alpha), 2) * dot_product(delt_p, axe)); 
delta = pow(b, 2) - (4 * a * c); 

if (delta >= 0) 
{ 
    t1 = (((-1) * b) + sqrt(delta))/(2 * a); 
    t2 = (((-1) * b) - sqrt(delta))/(2 * a); 
    t = (t1 < t2 ? t1 : t2); 
    return (t); 
} 

내가 y 축으로 내 축 초기화 :

여기 콘 방정식에 대해 (7-8 페이지)을 링크 http://mrl.nyu.edu/~dzorin/rend05/lecture2.pdf를 사용하고있어 내 코드입니다. 다음은 내가 얻은 것입니다. http://i.imgur.com/l3kaavc.png 원뿔 대신 오른쪽에 포물선 모양의 빨간색이 있으며, 원뿔과 거의 같은 방정식입니다.

답변

0

은 각 프리미티브에 대해 임의의 방향을 지원하는 대신 동질적인 매트릭스를 사용하여 기본 요소에 임의의 변형을 구현해야합니다.

예를 들어 광선 추적기가 원점에 기준점이 있고 세로 축을 기준으로 원뿔을 지원하는 것은 드문 일이 아닙니다. 원뿔 모양을 올바른 위치와 방향으로 이동시키기 위해 아핀 변환을 사용합니다.

내 자신의 레이 트레이서 (비행기, 상자 및 구체 만 지원하는)는 동일한 문제가 있으며 구현 변환 매트릭스가 다음 작업입니다.

+0

구현해야 할 필요가 있음을 알고 있습니다. 그러나 지금은 공식이 올바른지, 내가 잘 사용했는지 알고 싶었습니다. – Frolanta

+0

@Frolanta 흠, 행운을 빌어 요 - 게시 한 PDF 링크를 읽으려고하는데 그 안에 수학 표기법이 있습니다. – Alnitak

+0

알았지 만 내가 찾은 유일한 사람이었다. 신경 쓰지 마라. 내가 구현 한 방식을 바꿨다. 이제는 더 일반적으로 이차 방정식의 해를 구합니다. 시도해 줘서 고마워! – Frolanta

관련 문제