Curvature Based Silhouette Rendering
Post

Curvature Based Silhouette Rendering

1. Line Strip, 각 Point들의 Angle 얻기

img1

위 그림에서

img2

라고 할 경우, 두 벡터 V1, V2 가 이루는 각은

img3

이다.

프로그램 코드는 아래와 같다.

1
2
3
4
5
6
7
8
9
float calcAngle(
    const Point2D& p1,
    const Point2D& p2,
    const Point2D& p3,
) {
    Vector2D v1 = p2 - p1;
    Vector2D v2 = p2 - p3;
    return acos(v1.dot(v2) / (v1.length() * v2.length()));
}

2. Line Strip에 접하는 원

img5

위 그림의 Line Strip은 3개의 Angle이 생기고 따라서 3개의 내접원을 얻을 수 있다.

img6

A와 선분 AB를 알고 있으므로 원의 반지름은 아래와 같이 얻을 수 있다.

tan

원의 좌표에 대한 두 가지의 경우는 다음과 같다.

  • CW(Clock Wise): 아래 그림의 B
  • CCW(Counter Clock Wise): 아래 그림의 C

img7

Line Strip L이 L(A, B, C, D)로 구성되어 있을 경우, 원O는 CW에 의해 생성되지만, 원P는 CCW에 의해 생성된다. 따라서 Line Strip에 포함된 3개의 점(그림 4의 경우, ABC 와 BCD)이 CCW로 감기는지, CW로 감기는지 알아야 한다. 이는 외적을 통해 알 수 있다.

img8

라고 하자,

V1V2외적을 구한다고 할 경우, 두 벡터 모두 2차원 평면상의 점이므로 (x, y, 0)의 형태로 표현된다. 따라서, 외적은 아래와 같이 표현할 수 있다.

img9

여기서, C.z의 값이 0보다 작으면 CW, 0보다 크면 CCW라고 판단할 수 있다.

V1과 수직이고, 원의 중심을 향하는 벡터 O는 아래와 같이 표현할 수 있다.

img10

이제 원의 좌표는

img11

이다.

3. Curvature Based Stroke Thickness

아래 그림읜 Curvature Based Stroke Thickness를 표현할 결과이다. 검은색 라인(중앙선)이 Input로 사용된 Line Strip이고, 붉은색 라인(중앙선을 중심으로 양쪽에 있는선)이 Thickness를 나타내는 Line이다.

img12

Curvature에 따른 Thickness의 변화는 아래와 같다.

img13

  • X축: Curvature
  • Y축: Thickness

Curvature에 따른 Thickness는 위의 수식을 기본으로 한다.

min/max를 적용하면 아래와 같다.

img14

참고

  • S. Saito et al., Curvature-based Stroke Rendering, Visual Comput (2008)