[Graphics] 그래픽스 수학 10

[Noise] Fractal Brownian Motion - Perlin Noise

자연현상을 묘사하기 위해, 우리는 펄린노이즈라는 노이즈를 사용합니다. 그냥 랜덤함수만 사용하면 너무 규칙적이기 때문에 자연현상과 너무 다르기 때문이죠. 이번에는 들판의 잔디같은 것들을 컴퓨터 그래픽스에서 어떻게 움직일 수 있는지에 대해 이해해보겠습니다. 잔디는 파동 형태로 흔들리게 할 수도 있죠. 파동의 중요한 특성은 두가지가 있는데 진폭과 주파수입니다float amplitude = 1.;float frequency = 1.;y = amplitude * sin(x * frequency); 좀 더 이것저것 합친 파형을 만들기 위해선 파동을 합칠 수 있습니다. 물리학 시간에 배웠을 수도 있는데요. 이를 superposition(중첩)이라고 합니다. 파동들을 더하면 다음과 같은 모양이 될 수도 있습니다. f..

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

우리가 유체를 표현할 때 앞에서 Projection을 통해서 유체의 흐름을 나타냈습니다. Projection을 다시 정리하자면,Divergence를 계산하고, 그 Divergence로 jacobi iteration을 돌려 압력값을 계산하고, 그 압력으로 속도를 계산하였습니다. 하지만 Curl-Noise 방식은 ∇·∇× = 0 즉, curl연산(회전미분, 회전 정도 계산)을 한 후 Divergence를 하면 반드시 0이 된다는 원리를 이용해 비 압축성 유체를 표현합니다. 본격적으로 Curl-Noise방식을 이해하기전에 Curl과 Divergence의 개념에 대해서 다시 이해해봅시다. 1. Curl은 회전미분 즉,회전 정도를 뜻합니다. 어떤 점에서 벡터장이 얼마나 회전하려는 경향이 있는지를 알아내는 계산입니..

[유체 역학] Navier-Stokes equation과 volticity적용

유체 시뮬레이션을 적용하기 위해서는 크게 Sourcing => Diffuse => Projection => Advection로 진행할 수 있습니다.이를 이해하기 위해서는 Chorin's Projection Method와 Volticity(소용돌이)를 이해해야합니다. Navier-Stokes equation은 비압축성 유체의 운동을 기술하는 편미분 방정식(PDE) 으로, 아래와 같은 비압축성(ρ=constant) 형태가 일반적으로 사용됩니다. 하지만 속도와 압력이 강하게 결합되어 있어 풀기가 어렵습니다. 따라서 Chorin의 Projection Method가 이 문제를 해결해줍니다. Chorin Projection Method는 크게 보면 두가지로 나뉘어져 있습니다.  1)2) 1)첫번째 단계는 중간속도를..

[유체역학] (Navier-Stokes)Implicit equation의 안정성

explicit equation이란 y = x^2+x같이 y가 x에 의해 딱 정의된 것이고, implicit equation은 x^2+2xy+y^2=0과 같이 x와 y는 독립적으로 딱 구분할 수 없고 x와 y로 같이 정의되는 함수를 말합니다. Navier-Stokes방정식에서 왜 implicit integeration을 적용해야 안정성이 높은지 말씀드리겠습니다. 다음 식은 Navier-Stokes방정식에서 유체가 천천히 번지는 경우(Diffuse)를 계산하는 식입니다.explicit integration은 n번째 u와 n+1번째 u를 구분하였습니다. 따라서 viscosity가 매우 클 경우, 갑자기 수치적으로 발산할 가능성이 커집니다. 이 식은 유체가 천천히 diffuse되는 방식을 구현하는 과정인데, ..

[Gradient] 스칼라 값을 벡터로 편미분하기

SPH논문을 구현하는 중에 그레디언트 개념 정립이 필요할 것 같아서 정리를 해보려고 합니다. W=f(q)입니다. q는 위치 pi - 위치 pj로  x,y,z로 이루어져 있습니다. 우리가 원하는 것은 ∇W입니다. 즉 x,y,z로 편미분 한 값이죠. W는 q로 이루어져있어서, x,y,z로 바로 편미분 할 수 없으니 q와 x,y,z를 통해 계산합니다. 수식 정리 하기 전에 Gradient개념을 설명해드리려고 합니다. 스칼라 값을 벡터로 미분하기 위해서는 정미분으론 안되고 편미분을 해야합니다. 예를들어 V= x^2 * y * z^3이 있다면 V를 x,y,z로 각각 편미분 하면∇V = (2x*y*z^3, x^2 * z^3 , x^2 * y * 3 * z^2)입니다. 표현은 ∇V=(∂V/​ ∂x, ∂V/​ ∂y ​..

[homogeneous divide] NDC->월드좌표계, 월드좌표계 -> NDC

Perspective projection에서는 homogemeous divide가 필요합니다. 일반적인 공간변환과 다르게 투영 행렬이기 때문이고, NDC좌표계로의 변환이 필요하기 때문입니다. 일반적으로 directX의 hlsl에서는 뷰or월드 좌표계를 proj행렬을 곱하면, 클립좌표계(NDC아님)로 변환이 됩니다. 이 과정은 버텍스 쉐이더에서 이루어지고, 이 값을 픽셀 쉐이더로 넘겨줬을때 알아서 NDC좌표계로 그래픽스 파이프라인 내부적으로 변환이 됩니다. 다음 그림을 이해해 봅시다.주의할 점은 vertex shader에서 proj를 한 결과가 2차원이 아닌 3차원인 clip space라는 것입니다. 여기서 z값은 추후 깊이버퍼로 뒤 물체가 가리는지 아닌지를 판단할 때 쓰입니다. 코드는 다음과 같습니다. ..

[Quaternion] 회전 시 오일러 대신 쿼터니언 사용 이유

본 개념은 홍정모 교수님의 강의를 거의 그대로 인용한 것 입니다. 자세한 내용은 홍정모 연구소 그래픽스 새싹코스 Part3를 구매하시고 들으시면 됩니다.   3차원 개념에서는 회전 각도가 3가지가 있습니다. x축 기준회전, y축 기준 회전, z축 기준 회전이 있습니다.오일러의 3차원 자유변수(x,y,z축 각각의 회전 변수를 각 자유변수라고 함)를 행렬로 표현하면 다음과 같습니다.(단, x축 기준 회전 각도는  α, y축 기준 회전 각도는β, z축 기준회전 각도는 γ) 행렬로 표현하면 다음과 같습니다. 여기서 최종행렬은 α, β로 표현이 되죠? 따로따로 표현이 되어야 자유변수로서 성립이 되는데 α+ γ 로 합쳐져서 자유변수로서 성립이 안됩니다. 즉  α, γ 중 어떤 각도를 변환해도 어느 것을 변환했는지 ..

[Non-Uniform Scale] Scale변환 시 normal벡터 변환 방법 유도

Rasterization에서 vertex쉐이더 단계에서 삼각형을 변환할 때 Rotation, Translation Scale 행렬 등을 통해 변환합니다.  하지만 반드시 같이 변환해줘야 하는 벡터가 있는데 삼각형의 normal벡터(법선벡터)입니다. Rotation이나 Translation은 변환시 상관이 없는데 Scale변환 시 normal벡터가 변환된 삼각형과 수직이 안 될 수 있기 때문에 따로 다른 행렬을 통해 변환 시켜줘야합니다.  예를들어 다음 그림과 같이 non-uniform형식의 변환이 있다고 생각해봅시다. non-uniform형식은 x, y, z 각각이 같은 비율이 아니라 다른 비율로 변환 된다는 뜻입니다.  (a)에서 (b)로 변환되었고, (c)는 b의 normal벡터를 수직화 한 것입니다..

[Rasterization] 스크린좌표계에서 정확한 원근투영 interpolation지점 찾기

일반적으로 레스터화에서 정투영, 원근투영 모두 월드좌표계의 vertex들을 스크린 좌표계로 변환시킨 후 barycentric coordinates(무게중심좌표계)를 이용하여, uv좌표를 찾고 fragment에 알맞은 색을 입힙니다. 하지만 정투영에서는 왜 문제가 안 생기고, 원근투영에서 문제가 생길까요? 다음 그림을 보며 이상한 부분을 발견해봅시다.   격자무늬가 삐뚤어져있죠? 원래 월드좌표계에서의 모습은 잘 정렬되어져 있는 모습입니다. 왜 왜곡되게 보이는지 원리를 이해하기전에 레스터화에서 원근투영의 원리를 천천히 이해해봅시다. 다음 그림과 같이 레스터화의 원근투영은 월드좌표계의 vertex를 스크린좌표계 즉 z=0일 때로 투영시킨 지점을 찾습니다. (닮은꼴을 통해 구합니다)   Raytracing은 r..

[그래픽스]벡터의 외적 개념

벡터의 외적(cross product)은 주로 3차원 벡터에서 정의되는 연산으로, 두 벡터로부터 새로운 벡터를 만들어내는 연산입니다. 외적을 통해 얻어진 벡터는 두 벡터가 이루는 평면에 수직한 벡터(법선 벡터)가 됩니다.외적은 물리학과 컴퓨터 그래픽스에서 중요한 역할을 합니다. 특히, 두 벡터로 이루어진 평면에서 수직한 방향을 구할 때, 또는 회전과 관련된 문제를 풀 때 자주 사용됩니다.1. 벡터의 외적 공식A= (Ax,Ay,Az), B= (Bx,By,Bz) 일때A x B = (AyBz - AzBy, AzBx - AxBz, AxBy - AyBx) 이고, 이 벡터는 두 벡터에 모두 수직인 새로운 벡터입니다.2. 외적의 기하학적 의미외적의 결과는 두 벡터가 이루는 평면에 수직인 벡터를 반환합니다. 기하학적으..