레이트레이싱 - 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
에 대한 sum
및 Vector3
정의에 대해 걱정해야 했고 갑자기 흥미를 잃었습니다.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
를 정의합니다. 이것이 표준 정의입니다.결론
다음 단계는 색상 조사를 시작하는 것입니다. 저는 이를 위해 의도된 것과 상당히 다른 것을 가지고 있습니다. 그래서 당분간 이 글은 여기서 끊도록 하겠습니다.
Reference
이 문제에 관하여(레이트레이싱 - 1부: 개요), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jamestadleygreen/raytracing-part-i-overview-4jjk텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)