베 지어 표면을 레이트 레이싱하는 방법?


18

나는 math.SE에서이 질문을 시도 했고 놀랍게도 그 대답은 "방정식이 너무 거칠다 . 단지 함수를 수치 루트 파인더에 공급하는 것"이었다. 그러나 당신이 나 같은 "그래픽 녀석"이라고 생각하고 디자인 작업을 위해 베 지어 곡선으로 광범위하게 연주했다면 더 잘 할 수 있다고 믿어야합니다. Kajiya가 게시 한 알고리즘이 있습니다 (Sylvester Matrices)를 이해하는 배경은 없지만 math에 대한 관련 조언은 결과가 t에서 18-18 다항식이며 여전히 해결해야한다는 것입니다. 수치 적으로. 비슷한 결과를 가진 또 다른 아이디어가있었습니다 .

따라서 Ray / Bezier-surface 교차점을 대수적으로 해결하여 명시 적으로 코드를 작성하고 초고속으로 매끄럽게 만드는 것이 가능한 것은 전체 파이프의 꿈입니까?

그것을 제외하고,이 계산을 수행하는 가장 빠른 방법은 무엇입니까? 재귀 세분화를위한 긴밀한 경계 (및 목표)를 얻기 위해 "위글을 찾을 수 있습니까?" 수치 루트 파인더 (한숨)를 사용해야하는 경우 어떤 속성이 필요하며 속도에 가장 적합한 선택이 있습니까?

내 원래 생각은 삼각형에 대한 다른 수학 질문에 대한 답변에서 설명한 것처럼 Laplace 확장과 비슷한 특정 표면을 준비하는 것에 관한 것입니다 . 그러나 일반적인 방법에도 관심이 있습니다. 유타 주전자 같은 고정 된 모양의 집합을 생각하고 있습니다. 그러나 애니메이션 프레임에서 시간적 일관성을 최적화하는 방법에 매우 관심이 있습니다.


임의의 베 지어 표면에 적용 할 수있는 일반적인 방법이나 특정 표면에 대한 빠른 방법을 준비하는 방법을 찾고 있습니까? 런타임 전에 표면 모양이 고정됩니까?
trichoplax

1
베 지어 표면을 레이트 레이싱하는 것보다 훨씬 쉽게 레이 마치 할 수 있습니다. 또한 다른 종류보다 훨씬 쉽게 레이트 레이싱 또는 레이 마치 일 변량 표면을 만들 수 있습니다! blog.demofox.org/2015/07/28/rectangular-bezier-patches
Alan Wolfe

답변:


14

먼저 Kajiya, Ray Tracing Parametric Patches , SIGGRAPH 82 등을 생각합니다 . 기술 보고서 ​​버전 이 더 유익 할 수 있습니다.

내가 당신이 얻는 희망은 불가능하지 않으며 대수 기하학과 복잡한 숫자로 손을 더럽히는 것을 좋아하지 않는다면 개념적으로 어렵지 않다는 것입니다. 그러나 직접 수행하는 것은 터무니없이 비쌉니다.

"실제"광선 추적기는 다음 두 가지 조합을 수행하는 경향이 있습니다.

  • 숫자 루트 파인더에 적합한 "초기 값"을 얻기 위해 패치에 경계 계층 구조 (예 : AABB)를 배치합니다. 이 작업을 잘 수행하면 "주름"문제를 피할 수 있습니다.
  • 패치를 DDG 쉘에 테 셀링하고 다각형 메쉬처럼 레이트 레이싱합니다.

마지막 점은 "슈퍼 부드러움"요구 사항을 없애는 것처럼 들리지만 레이 디퍼렌셜을 사용하는 것만 큼 나쁘지는 않습니다 . 테셀레이션 수준을 광선의 "크기"와 일치 시키면 오류가 잘 발생합니다. 또한 어쨌든 텍스처 좌표에 차이가 필요할 수 있으므로 교차 테스트의 정확도를 제어하는 ​​데에도 사용할 수 있습니다.

시간적 일관성을 악용하는 것은 나쁜 생각이 아니지만 정확하게 어떻게하는지는 장면 그래프 표현에 달려 있습니다. 광선 일관성을보고 싶을 수도 있습니다. 레이 패킷 추적레이 재정렬 에 대해 즐겨 찾는 검색 엔진에 문의하십시오 .


9

Ray / Bezier-surface 교차로를 대수적으로 해결하기를 희망하는 것은 완벽한 파이프 꿈입니까?

예, 파이프 꿈입니다. 이중 입방체 베 지어 패치는 18 도의 대수 표면입니다.이 표면과 광선을 교차 시키려면 18 도의 다항식의 근을 찾아야합니다.이 근에 대한 공식은 없습니다-수치 방법으로 찾아야합니다 . 사실, 수학적인 결과 ( Abel-Ruffini 정리 )는 우리에게 학위 4 이상의 방정식의 근본에 대한 공식은 절대 존재할 수 없다는 것을 말해줍니다. 수학은 공식이 아직 발견되지 않았다고 말하지 않습니다. 그들은 존재할 수 없기 때문에 결코 찾을 수 없다고 말합니다.

곡선 모양의 분석 (대수) 광선 추적을 실제로하려면 Steiner 패치를 사용해보십시오 . 이것들은 차수가 4이므로, quartic (즉, 차수 4의 다항식)을 찾아서 광선 패치 교차점을 계산할 수 있습니다 . quartics의 근본을 찾는 공식이 있지만 상당히 불쾌하며 공식을 안정적으로 구현하는 코드를 작성하는 것은 놀랍습니다.


5

내가 수십 년 전에 사용했던 또 다른 옵션 (이크!) 은 1985 년부터 Toth의 체계 를 사용 하여 검색 공간을 좁히기 위해 간격 산술을 사용하는 것입니다. IIRC는 결국 Newton-Rhapson에 의지하지만 다시 IIRC는 좋은 해결책을 찾기 위해 한두 단계 이상이 거의 필요하지 않다고 생각합니다.

나는 그것을 보지 않았지만 (잘 살펴보기는하지만) Mitchell 은 간격 계산을 사용하여 광선 추적에 대한 최신 연구를 발표했습니다.

(베 지어 표면 만 수행하는 경우 간격과 방법은 꽃이 만발한 등의 트릭을 사용하여 경계와 도함수를 얻을 수 있기 때문에 간격 방법이 약간 "오버 킬"할 수 있다는 점을 추가해야합니다. 예를 들어 축을 중심으로 회전하면 일반성이 더 유용합니다.)


1

호환성 문제가있는 경우 https://www.shadertoy.com/results?query=bezier 연령별로 정렬 :

..., 거리를 2d 스플라인으로 되돌 리거나 3d 패치를 추적하는 많은 스플라인 서브 세트의 많은 솔루션을 보여줍니다. 스플라인 및 패치는 여러 형태로 제공됩니다. 천상의 사인은 가장 단순하고 베 지어는 단순하며 간호는 지나치게 복잡합니다. 스플라인에 구속 조건이 많을수록 더 간단 해집니다. NURBS는 확장 오버 킬입니다. -무게의 비 균일 성 ( "NU")은보다 대칭적인 스플라인과 비교하여 효율성을 감소시킵니다.-R-도 (R)는 또한 세그먼트 화 (합리화) 및 근처 세그먼트와의 혼합을 위해 약간의 복잡성을 추가합니다. (재귀 적으로 해결).

베 지어 패치 추적은 근본 문제이며 정확성에 대한 상황 별 우선 순위를 부여합니다. 이차 방정식을 푸는 순서는 무엇입니까? 이는 기하 급수적으로 복잡하고 정밀한 손실로 인해 3 차보다 높은 지수에서는 실용적이지 않습니다.

ray-marching == sphere-tracking은 루트 해결에 대한보다 간단한 휴리스틱 접근 방식으로, 대부분의 스플라인 패치를 렌더링하는 가장 간단하고 효율적인 솔루션 인 것 같습니다.

Lagrange-representation은 추적 / 마칭을 단순화합니다 (L 포인트가 스플라인에 있고 ControlVector 포인트 (정확히 동일한 스플라인에 있음)는 거의 스플라인에 없기 때문에)

stat와 end의 첫 번째 미분 값이 == 0 인 천공 스플라인의 특수한 경우입니다. 연속성을 단순화하고 차이가 적습니다 (감산이 적음). heavensine 패치가 단일 패스에서 효율적으로 추적 할 수 있습니다 : https://www.shadertoy.com/view/4djfW3 다른 입방 (또는 그 이상) 스플라인 (추론 영역 추적 / 레이 행진 접근 방식이보다 효율적 동안 " 가장 작은 양의 근을 유지하기 위해 모든 근을 분석적으로 계산하는 것보다 대담합니다 (각 근의 지수 오차를 기하 급수적으로 계산).


컴퓨터 그래픽에서 스플라인과 패치는 2006 년까지 z- 브러싱으로 거의 완전히 대체되었습니다. z- 브러싱은 균일 한 좌표를 가진 변위 맵을 사용하거나 심지어 구와 선분을 결합한 "유형"을 사용합니다 (선분의 반지름은 0, 구체의 길이는 0, 결합은 간단하고 유용합니다). 조회 테이블에 대해 상대적으로 저렴한 메모리 비용으로 성능을 크게 향상시키기 위해 정밀도가 약간 떨어지면 GPU에서 쉽게 동적으로 만들어집니다.


신경 쓰지 마. 모든 3D 패치 솔루션은 구 추적으로 수행됩니다.
ollj

패치가 단순 할 때 성능과 정밀도가 크게 향상됩니다. seamess heavensines의 패치가 몇 번의 반복으로 당신을 매우 멀리 가져갈 수있는 지점까지 :
ollj

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.