우리가 유체를 표현할 때 앞에서 Projection을 통해서 유체의 흐름을 나타냈습니다. Projection을 다시 정리하자면,
Divergence를 계산하고, 그 Divergence로 jacobi iteration을 돌려 압력값을 계산하고, 그 압력으로 속도를 계산하였습니다.
하지만 Curl-Noise 방식은 ∇·∇× = 0 즉, curl연산(회전미분, 회전 정도 계산)을 한 후 Divergence를 하면 반드시 0이 된다는 원리를 이용해 비 압축성 유체를 표현합니다.
본격적으로 Curl-Noise방식을 이해하기전에 Curl과 Divergence의 개념에 대해서 다시 이해해봅시다.
1. Curl은 회전미분 즉,회전 정도를 뜻합니다. 어떤 점에서 벡터장이 얼마나 회전하려는 경향이 있는지를 알아내는 계산입니다.
2. Divergence란 어떤 한 지점에서 발산하려는 정도를 뜻합니다. 비 압축성 유체이기 때문에 반드시 Divergence는 0이 되어야합니다.
Curl-noise방식은 회전 정도를 구해서 그걸 속도로 이용해서 속도에 dt를 곱해서 위치 값을 갱신하는 방식으로 진행이 됩니다. 방식은 3차원에서와 2차원에서의 방식이 조금 다른데 각 방식은 다음과 같습니다.
1) 3차원에서의 속도 구하기
=> 3차원 벡터 퍼센셜 위치를 이용합니다
ψ = (ψ1,ψ2,ψ3) 이렇게 벡터 퍼텐셜 필드를 정의합니다. 그 필드를 curl연산하면 다음과 같이 됩니다.
v(x,y,z) = (∂ψ3 / ∂ y − ∂ψ2 /∂ z , ∂ψ1/ ∂ z − ∂ψ3 / ∂ x , ∂ψ2 / ∂ x − ∂ψ1 / ∂ y )
이걸 다시 divergence하면 0이되는데, 매우 쉬우니 직접 증명해보는 것도 좋은 방법일 것 같습니다
2) 2차원에서의 속도 구하기
=>2차원 스칼라 필드 장 이용합니다
원리는 회전 미분과 같습니다. 하지만, curl계산을 이용하지않고 "stream function"이라는 유동함수의 원리를 이용합니다. 3차원과는 달리 하나의 퍼텐셜 장(스칼라 장)을 이용합니다. 그것을 ψ라고하면, v(x, y) = ( ∂ψ / ∂ y , − ∂ψ / ∂ x )과 같습니다. 여기다가 Divergence하면 0이나오는 결과를 확인할 수 있습니다.
여기서 노이즈를 생성하는 방식(퍼텐셜 장을 생성하는 방식)은 랜덤함수를 이용하는 것입니다. 하지만 아무 랜덤함수나 사용하면 안됩니다. 왜냐하면 랜덤함수가 함수여야 하기 때문입니다. 함수가 아니라면 미분을 할 수 없기 때문입니다. 즉 어떤 값을 넣으면 하나의 어떤 정해진 결과값이 나오는 함수여야 합니다. 보통 noise를 생성할 때 Perlin’s eponymous noise function를 사용합니다.
참고자료 :
Curl-noise 논문
https://www.cs.ubc.ca/~rbridson/docs/bridson-siggraph2007-curlnoise.pdf
벡터 퍼텐셜 개념 :
https://ko.wikipedia.org/wiki/%EB%B2%A1%ED%84%B0_%ED%8D%BC%ED%85%90%EC%85%9C
stream function(유동함수) 개념 :
https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8F%99_%ED%95%A8%EC%88%98
'[Graphics] Mathematical Concepts' 카테고리의 다른 글
[Noise] Fractal Brownian Motion - Perlin Noise (0) | 2025.04.20 |
---|---|
[유체 역학] Navier-Stokes equation과 volticity적용 (0) | 2025.02.25 |
[유체역학] (Navier-Stokes)Implicit equation의 안정성 (0) | 2025.02.23 |
[Gradient] 스칼라 값을 벡터로 편미분하기 (0) | 2025.02.19 |
[homogeneous divide] NDC->월드좌표계, 월드좌표계 -> NDC (0) | 2025.01.24 |