레이트레이싱 - 1부: 개요

12652 단어 raytracinghaskell

📝 TL;DR - Haskell lends itself nicely to basic raytracing, simple code (not mine) creates incredible first results.




목차



1. Intro
2. Vectors
3. Geometric functions
4. Conclusion

소개



안녕하세요! 이것은 내 첫 번째 게시물이며 현실적으로 블로깅에 대한 첫 번째 실제 시도입니다. 더 이상 고민하지 않고 바로 콘텐츠로 이동합니다.

우리는 함수형 프로그래밍을 보고 있습니다. 특히 Haskell에서 몇 가지 기본적인 레이트레이싱을 구현하는 방법을 살펴보겠습니다. 첫째, 이 프로젝트의 코드는 모두 myGitHub에 있습니다. 바라건대, 앞으로 어느 시점에서 결과를 보여주기 위해 웹 사이트를 설정하게 될 것입니다.

프로젝트를 처음 시작하는 데 사용하는 몇 가지 기본 리소스가 있습니다.

  • Htrace은 우리가 분석하고 확장할 초기 작업입니다.

  • 최신 CGI 및 광선 추적이 작동하는 방식을 설명합니다. 이것의 구현은 초기 분석 이후에 이루어집니다.

  • 벡터



    일부 코드로 이동해 보겠습니다.

    type Vector3 = (Float, Float, Float)
    


    여기서 우리는 벡터의 정의를 가지고 있습니다. 여기에서 볼 수 있는 구문은 꽤 자명합니다. 3차원 벡터는 순서가 있는 3-튜플입니다. 다음으로 친숙할 몇 가지 작업에 대해 이야기하겠습니다.

    add :: Vector3 -> Vector3 -> Vector3
    add (x,y,z) (a,b,c) = (a+x, b+y, c+z)
    
    sub :: Vector3 -> Vector3 -> Vector3
    sub (a,b,c) (x,y,z) = (a-x, b-y, c-z)
    
    squared_mag :: Vector3 -> Float
    squared_mag (x,y,z) = (x*x + y*y + z*z)
    
    mag :: Vector3 -> Float
    mag v = sqrt (squared_mag v)
    


    위의 모든 것은 수학적으로 매우 기본적이며 유사하게 코드는 사소합니다. 우리는 대안적으로, 그리고 더 나쁘게는 (비록 점은 없지만) 다음을 정의할 수 있습니다.

    squared_mag :: Vector3 -> Float
    squared_mag = sum map (**2)
    


    하지만 map에 대한 sumVector3 정의에 대해 걱정해야 했고 갑자기 흥미를 잃었습니다.

    scalarmult :: Vector3 -> Float -> Vector3
    scalarmult (x,y,z) c = (x*c, y*c, z*c)
    
    dot :: Vector3 -> Vector3 -> Float
    dot (x,y,z) (a,b,c) = x*a + b*y + c*z
    
    cross :: Vector3 -> Vector3 -> Vector3
    cross (a,b,c) (x,y,z) = (b*z + c*y, -(a*z + c*x), a*y + b*x)
    
    normalize :: Vector3 -> Vector3
    normalize v
      | (mag v) /= 0 = scalarmult v (1 / mag v) 
      | otherwise    = (0,0,0)
    
    neg :: Vector3 -> Vector3
    neg (x,y,z) = (-x,-y,-z)
    


    이것들은 모두 꽤 표준적입니다. 내가 할 유일한 변경은 scalarmult 왼쪽 곱셈을 만드는 것입니다.

    scalarmult :: Float -> Vector3 -> Vector3
    scalarmult c (x,y,z) = (c*x, c*y, c*z)
    
    neg :: Vector3 -> Vector3
    neg = scalarmult (-1)
    



    기하학적 함수



    이제 더 많은 기하학적 수학으로 이동할 수 있고 더 많은 데이터 유형을 정의할 수 있습니다.

    type Point3 = Vector3
    type Direction3 = Vector3
    type Time = Float
    type Ray = (Point3, Direction3) -- base and direction
    
    position_at_time :: Ray -> Time -> Point3
    position_at_time (base, dir) t = base `add` (scalarmult dir t)
    

    position_at_time 함수는 가속이 없다고 가정합니다(빛으로 작업할 때 허용됨). 간결함을 위해 다음 몇 가지 정의에 대한 코드를 생략하고 2차 솔버와 xor를 정의합니다. 이것이 표준 정의입니다.


    결론



    다음 단계는 색상 조사를 시작하는 것입니다. 저는 이를 위해 의도된 것과 상당히 다른 것을 가지고 있습니다. 그래서 당분간 이 글은 여기서 끊도록 하겠습니다.

    좋은 웹페이지 즐겨찾기