SYDLAB_inha/Metrics for Dynamic Mesh Coding

Metrics - Image-based sampling metric(IBSM)(1) / sampling / positioning

빈그레 2024. 2. 19. 16:57

 

 

 


IBSM Rendering

 

 

 

 

 

IBSM은 reference mesh와 distorted mesh를 several image로 투영하여 차이를 측정한다.

즉, 3D mesh를 2D 이미지 공간을 투영하여, reference mesh와 distorted mesh의 차이를 시각적으로 비교한다

 

 

 

6.1 Rendering of one view  //rendering 설명하는 부분인 듯

 

: Rendering은 metirc의 일부로 pcc_mmetric software안에 구현되어 있다..

 

one view(한 시점)에서의 rendering은 아래 그림과 같다.

 

 

 

- Rasterization 

 

[보충 설명]


*** Rasterization : 점,직선,곡선,다각형과 같은 물체를 사용한 벡터 그래픽 형식으로 된 이미지를 픽셀,점 또는 선 seires를 통해 표현된 래스터 이미지로 변환하는 작업이다.
ray tracing과 같은 렌더링 기법에 비해 rasterization은 매우 빠른 rendering 기법이기 때문에 실시간 3D 엔진에서 사용된다. 퍼포먼스 적은 부분에서 Rasterization이 더 우수하여, ibsm metric에서는 rasterization으로 rendering을 진행하였다.

 mesh의 ray tracing이나 Rasterization을 통해 image로부터 픽셀을 얻어낸다.

여기서 쓰이는 Rasterization은 단순화된 형태의 orthographic projection(직교 투영)만을 사용하기 때문에 perspective projection(원근 투영)을 필요로 하지 않는다.

 

 

 

 

- Bounding Sphere  & View Direction

참조 객체와 왜곡된 객체의 축에 맞춰진 바운딩 박스를 합산하고,그  결과로 나온 바운딩 박스의 대각선과 중심을 사용하여 Bounding Sphere을 만든다.  쉽게 말해, bounding sphere은 주어진 객체를 감쌀 수 있는 가장 작은 구이다. 먼저, 객체의 각 vertex들을 포함하는 가장 작은 bounding box를 찾는다 이 box의 대각선이 구의 지름이 된다 .
그리고, bounding box의 중심이 구의 중심이 된다.

Bounding sphere은 특정 view direction(vdi)를 결정하는 데 사용되며, view direction 방향은 항상 3D 공간 상에서 구의 중심을 향하게 된다

 mesh는 orthographic projection을 통해 rendering된다. projection plane은 view direction  vector에 수직이며, 구에 접하는 평면을 projection 평면으로 사용하여 3D 객체를 2D 이미지로 변환하는 방식이 orthographic projection이다.


두비가 기린 기림~

 

 

 

- Back-Face Culling 

mesh는 clockwise(시계방향, cw) back-face culling을 사용하여 rendering된다. 

back-face culling은 모든 모델 내부를 투명하게 보이게하되, 모델의 후면은 제외하고 렌더링하는 기술이다. 
게임이나 VR 시스템에서 사용되며, mesh의 triangle이 카메라를 향하지 않을 때에는 (즉, 후면일 때) 렌더링하지 않도록 함으로써 성능을 향상시킨다 

face normal(면의 정규 벡터)는 triangle의 두 edge인 e1,e2를 외적(cross product)하여 계산된다. 두 변을 어느 순서로 외적하느냐에 따라 normal vector 의 방향이 달라진다.

*** face normal vector (면의 정규 벡터) : 면의 방향을 나타내는 벡터

- 시계 방향으로 변을 따라가면서 외적을 계산하는 경우 (e1​×e2​)
: 계산된 normal vector는 삼각형의 한 면을 향하게 됩니다.
  즉, 외적의 순서에 따라 벡터는 삼각형을 바라보는 방향으로 향하게 된다.

- 반시계 방향으로 변을 따라가면서 외적을 계산하는 경우 (e2​×e1​)
: normal vector가 삼각형의 반대 면을 향하게 됩니다.
 즉, 외적의 순서를 바꿔주면 벡터의 방향도 반대로 바뀌게 된다.

Note 
: provided answer이 clockwise 방향을 기반으로 face normal vector 방향을 보존하지 않으면 metric에 대해 낮은 MSE/PSNR 점수를 받는다.


 

 

 

 

- Rendering step

 

color, mask, depth buffer를 생성하는 과정이다. 
* 모든 buffer는 2048 x 2048 pixels의 크기를 가진다.

1. [ Color Buffer ]
color buffer는 각 픽셀 i,j에 대해 가장 가까이에 투영된 삼각형의 RGB 색상 값을 저장한다.

//UV Mapping 사용하는 경우
-Textured Mesh : 텍스처가 있는 mesh의 경우, RGB 색상은 texture map의 삼각형 UV 좌표를 사용하여 bilinear interpolation으로 계산된다 이 방법은 texture image의 색상을 부드럽게 혼합하여 픽셀에 적용한다.
//UV Mapping 사용 안 하는 경우
- Vertex Color Mehses : texture map이 없고, 각 vertex에 색상이 지정된 mesh의 경우, vertex 색상은 barycentric coordinates를 사용하여 혼합된다. 삼각형 내부의 위치에 따라 vertex의 색상을 혼합하여 최종 색상을 결정한다


2. [ Mask Buffer ]
Mask buffer는 각 픽셀 i,j에 대해, 해당 픽셀에 투영이 존재하면 1, 존재하지 않으면 0인 이진 값으로 구성된다.
이는 픽셀이 화면에 보여지는 부분인지를 나타내는 지표이다


3. [ Depth Buffer ]
Depth buffer는 각 픽셀 i,j에 대해 projection planes으로부터 3차원 표면까지의 거리 d_i,j를 저장한다.
이는 3차원 공간에서의 물체의 깊이를 나타내며, 물체의 앞 뒤 관계를 결정하는 데 사용된다

이러한 buffer들은 3D 그래픽스에서 물체를 화면에 표현하기 위해 사용되는 기본적인 데이터 구조들이다.
Rendering process는 이 buffer들을 사용하여 3차원 공간에 있는 물체를 2차원 화면에 실시간으로 그려내는데 필요한 정보를 계산하고 저장한다.

 

 

 

위 과정을 통해서 reference mesh 및 distorted mesh가 여러 가지 방향에서 rendering되면, rendering process는 color,mask,depth buffer를 생성한다.

 

이후 여러 view에 대해 positioning 을 진행한다. 

 

 

 

 

 

 


Positioning of Views

 

 

 

 

3D Rendering 에서 다양한 방향에서 시각적으로 평가할 mesh model을 어떻게 위치시킬지에 대한 방법을 다룬다.

구체적으로 16개의 view를 Fibonacci sphere lattice(피보나치 구면 격자)를 사용하여 균등하게 분포시킨다. 분포는 구면 위에 점들을 균등하게 생성하는 것을 목표로 한다.

 

이러한 뷰의 위치 설정은 렌더링될 메시(mesh)가 다양한 각도에서 어떻게 보일지를 결정하는 데 중요한 역할을 한다.

그러나 실제로 메시 자체의 시점을 정하는 것이 아니라, 카메라가 메시를 바라보는 각도를 정의하는 것이다.

이는 최종 이미지에서 메시가 어떻게 보일지를 결정짓는 렌더링 프로세스의 일부이다.

 

3D 렌더링에서 카메라가 메시를 어떻게 바라볼지, 즉 카메라의 시점을 정하는 과정이다

 

아래 Figure3는 이러한 방법을 사용하여 생성된 16개의 view의 image의 예를 보여준다.

 

Computing Fibonacci sphere samples

 

const double pi = std::atan(1.0) * 4;

// golden angle in radians
Const float phi = (float)(pi * (3. - std::sqrt(5.)));

// glm::vec3 a vector of three floats, each entry a direction
std::vector<glm::vec3> camDir; 

for (size_t i = 0; i < targetNbSamples; ++i) {

	float y = 1 - (i / float(targetNbSamples - 1)) * 2;  // y goes from 1 to - 1
	float radius = std::sqrt(1 - y * y);         	     // radius at y
 	float theta = phi * i;                               // golden angle increment

	float x = std::cos(theta) * radius;
	float z = std::sin(theta) * radius;

	camDir.push_back(glm::vec3(x, y, z));
}

 

 

- up vector (vui)

  : 카메라가 '위'로 인지하는 방향

 

up vector는 주어진 방향 vdi(view direction)에 대해 카메라의 회전을 결정하며, 결과적으로 이미지 속 모델의 최종 방향을 결정한다. 마지막으로, OpenGL에서 알려진 Lookat함수를 사용하여 카메라 행렬을 얻는다.

 

*** Lookat 함수

: 카메라가 특정 지점을 바라보도록 설정하는데 사용되는 함수이다 카메라의 위치, 카메라가 바라보는 대상의 위치, 카메라의 up vector을 입력으로 받는다 . 이 세가지 vector를 사용하여 카메라의 view transformation 행렬 즉, 카메라 행렬을 생성한다.

 

*** 카메라 행렬

: 카메라 행렬을 얻는다는 것은, 3D 렌더링에서 특정 시점에서의 장면을 캡처하는데 사용되는 카메라의 위치, 방향, 그리고 up vector를 정의하는 행렬을 계산한다는 의미이다. 이를 기반은로 3D 객체를 2D 이미지로 변환하는데 사용된다. 

 

 

 

Computing viewDir (vdi) , viewUp (vui)

 

if (glm::abs(viewDir) == glm::vec3(0, 1, 0))
	viewUp = glm::vec3(0, 0, 1);
else
	viewUp = glm::vec3(0, 1, 0);

 

 

 

다시 말해, vew direction (vui)가 south pole이나 north pole을 가리키는 방향이 아닌 경우, y축 vector를 up vector(vui) 로 사용한다. 반면에 view direction이 north pole이나 south pole을 가리킬 경우 z축 vector를 up vector로 사용한다.

 

이러한 값들은 대부분의 모델들이 옆이나 앞에서 rendering될 때, 이미지 상단에 머리가 위치하도록 시각적으로 렌더링하기 위해 선택되었다. //뭐래

 

 

 

 

Distortion for one view 

 

( Distortion Evaluation )

: rendering 된 이미지의 distortion(왜곡)은 평균 제곱 오차(MSE)를 기반으로 계산된다. 이 계산은 reference 및 distorted model의 mask가 1인 부분에 대해서만 수행된다. //IBSM을 위한 Rendering과정에서 mask buffer에 값 저장된다.

 

RGB 공간에서 YUV 공간으로의 변환을 통해 인간의 시각인지와 더 일치하는 색상 공간에서 distortion 을 평가한다.

 

//다음 글에서 구체적 설명