[Graphics] Mathematical Concepts

[유체역학] Curl-Noise와 비압축성 유체(incompressible fluids)

doyyy_0 2025. 2. 26. 11:14

우리가 유체를 표현할 때 앞에서 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