koodev

'전체 글'에 해당되는 글 75건

  1. macOS 앱에서 dylib 이 로드되지 않는 문제
  2. Manifold
  3. Blender Vertex ID 지정해서 선택하기

macOS 앱에서 dylib 이 로드되지 않는 문제

Programming

Xcode로 macOS 앱을 만들다가 외부 라이브러리를 사용할 일이 있어서 dylib을 링크하려 했는데, 해당 dylib을 로드할 수 없다는 런타임 에러메시지가 나왔다. 그 프로젝트는 이미 a 파일을 링크해서 쓰고 있었고, a 파일 때와 같은 방법으로 dylib을 셋팅하고 있었다.

생각해보니 dylib은 추가적으로 해 주어야 하는 일이 있었다. a 파일은 심볼이 타겟 바이너리에 복사되어 들어가기 때문에 그냥 쓰면 되는 것이었고, dylib은 so 같은것이기 때문에 타겟 머신(macOS 컴퓨터)에 dylib을 설치하거나(/usr/lib 같은데다), 아니면 번들로 앱 패키지에 심어 넣어야 하는 것이다.

설치를 하는 것은 번거로우니까 스킵하고, 번들로 심는 방법을 적어본다. Xcode의 Navigator 에서 프로젝트 파일을 누른 다음, General - Frameworks, Libraries, and Embedded Content 항목을 살펴보자. 안에 테이블에서 해당하는 dylib 파일의 Embed 속성에서 'Embed & Sign' 옵션을 선택하면 끝.

참고로 설치하는 방법은 install_name_tool 이라는 명령어를 사용한다. 다음 링크 참조: Embedding .dylib libraries in your application bundle.

참고

Manifold

Math

최근에 'Manifold' 라는 단어와 마주치게 되었다. 처음에는 도대체 무얼 말하는지 이해가 되질 않다가 최근에 조금씩 이해되기 시작하여 정리해 두기로 했다. 가장 결정적인 도움이 된 아티클은 http://bjlkeng.github.io/posts/manifolds/ 인데, 이 글에서 Tangent Space의 기저 변환을 다루고 있는 후반부(정확히는 Jacobian 행렬부터)는 이해하지 못했다. 여기에서는 기본 개념만 정리한다. Manifold는 한글로 '다양체'라고 불리는데, 별로 와닿지가 않아 그냥 Manifold라고 썼다.

Manifold는 정의부터 들어가면 이해하기 어려울 것 같고, 예제를 먼저 나열해 보자. 여러 아티클 및 서적에서 1D Manifold의 예로 원(Circle)을, 2D Manifold의 예로 구체(Sphere)를 예로 들고 있다. 그 밖에 도넛(torus)이나 Klein Bottle 같은 이상한 도형들도 있는데, 이런 예들 중에 가장 최고는 '지도책(atlas)' 이라고 생각한다. 나는 지도책을 떠올리면서 Manifold의 개념을 직관적으로 이해할 수 있었다.

'지도책(atlas)'은 우선 '지도(map)'와는 조금 다른 개념이다. 지도책은 여러 장의 지도를 모아 놓은 것이다. Manifold를 쉽게 이해하기 위해 지도책을 "여러 장의 '연관된' 지도를 모아 놓은 것"이라고 해 두자. 좀 더 구체적인 예를 들어서 우리나라(대한민국)와 우리나라 전국 도로 교통 지도책을 떠올려보자. 여기서 A를 대한민국의 지형, B를 지도책이라고 하자.

첫 번째로 생각해야 하는 Manifold의 개념은 차원 이동이다. 대한민국의 지형은 3D이다. 3D 지형을 쉽게 풀어서 교통 및 지역정보를 제공하기 위해서 3D개념을 2D로 옮기고 복잡하고 구체적인 이미지를 단순하고 직관적인 이미지로 추상화시켜서 만든게 지도이다. 즉, A에서 B로 가면서(매핑되면서) 3D공간이 2D공간으로 바뀌는 것이다.

두 번째로 생각해야 하는 것은 A가 B로 가면서 한 번에 표현되는 것이 아니라 여러 개의 subset 들이 모여서 B를 이룬다는 것이다. 대한민국을 한 장의 지도로 표현하기에는 종이도 커야 하고, 만들기도 힘들기 때문에 여러 장으로 나누어서 지도'책'을 만드는 것이다. Manifold의 제약사항에 의해서 B는 반드시 두 개 이상의 부분집합으로 표현되어야 한다. 관련된 제약사항 하나가 더 있는데, 반드시 낙장이 없어야 한다. 대한민국 지도책이라면 빠진 곳 하나 없이 대한민국의 모든 지역이 지도책에 의해 다 커버되어야 한다. 예를 들어 작은 지역이라고 독도나 작은 섬 등이 빠져서는 Manifold라고 할 수 없다!

지금까지 대한민국(A)과 지도책(B)에 대해서 이야기를 했는데, 그럼 Manifold는 무엇인가? 여기서는 대한민국이 Manifold이고 지도책은 Atlas라고 부르고(그게 그거 아닌가..), 지도책을 이루는 각 지역의 지도를 Coordinates 또는 Local Coordinates 라고 하며, 대한민국의 한 지역에서 지도 한 장으로 가는 각각의 매핑을 Chart 라고 한다. 위에서 예를 든 사항을 만족하는 A를 Manifold 라고 부르는 것이다.

그러면 이제 Manifold의 진짜 정의에 대해서 알아보자.

N차원의 Topological Manifold M은 N차원의 Topological Hausdorff 공간으로서 유한 갯수의 기저를 가지며 "지역적으로" ℝn(N차원 실수공간)에 준동형사상(Homeomorphic) 된다. 이는 M에 속하는 모든 점 p는 열린 집합 형태를 갖는 이웃점들의 집합인 U를 가지며, 각각의 U는 준동형사상(Hoemomorphic)인 φ:U → V 을 가진다. 여기서 V ⊂ n 이다. 추가적으로 아래 내용도 알아두자.

  • U에서 V로 가는 φ:U → V 이 매핑을 'Chart' 혹은 'Coordinate System'이라고 부른다.
  • U집합을 해당하는 Chart에 대한 '도메인(Domain)' 혹은 'Local Coordinates Neighborhood'라고 부른다.
  • U에 속하는 점 p(p ∈ U)의 매핑된 이미지를 φ(p) ∈ ℝ으로 표기하고, 해당하는 Chart에 대한 p의 'Coordinates' 혹은 'Local Coordinates' 라고 부른다.
  • 이런 Chart 들의 모음을 { φα | α ∈ ℕ } 라고 하자. Uα 가 도메인이라고 하고, 모든 도메인의 합집합이 M이 될 경우 Chart의 모음인 { φα | α ∈ ℕ } 를 'Atlas' 라고 한다.

위에서 'Hausdorff 공간'이라는 개념이 나오는데 크게 중요하지 않다고 한다. 그럼 좀 더 이해를 돕기 위해 아래 다이어그램을 살펴보자.

Figure 4: Two intersecting patches (green and purple with cyan/teal as the intersection) on a manifold with different charts (continuous 1-1 mappings) to   ℝn Euclidean space. Notice that the intersection of the patches have a smooth 1-1 mapping in ℝn Euclidean space, making it a differential manifold (source: Wikipedia).

위 다이어그램에서 Manifold는 X이다. 이 X는 n+k 차원의 개체이다. 그리고 X에서 서로 다른 두 개의 조각(또는 도메인 혹은 Local Coordinate Neighborhoods) Uα(초록)와 Uβ(보라)를 정의했다. X는 Manifold이기 때문에 X안의 모든 점은 각자가 지역적으로(Locally) 낮은 차원의 유클리드 공간(ℝn)으로의 매핑 φ(Chart 혹은 Coordinate System)을 각각 갖는다. 만일 우리가 Manifold X의 도메인 중 하나에서 점 p를 하나 고른다음 낮은 차원의 유클리드 공간으로 매핑을 한다면(φ를 통해서), 이렇게 매핑된 점을 해당 Chart(φ)에서 점 p에 대한 Coordinate 혹은 Local Coordinate 라고 부른다. 그리고 이러한 Chart가 여럿 있고 이들의 도메인이 전체 Manifold X를 커버한다면, 이들 Chart들을 Atlas라고 부르는 것이다.

Figure 4 다이어그램을 조금 더 살펴보면 Uα(초록)와 Uβ(보라)에서 교집합 부분(하늘색)에서 각각의 Chart에 의해 매핑된 저차원의 공간에서 또 다른 매핑이 존재한다. 즉, 두 매핑 φαβ = φβ ∘ φα-1φβα = φα ∘ φβ-1 이고, 이들의 도메인은 각각 φα(Uα ∩ Uβ)와 φβ(Uα ∩ Uβ) 로 제한되며, 이들 매핑을 'Transition Map'이라고 부른다. 이 Transition 매핑을 궂이 언급한 이유가 있다. 이들 Transition 매핑이 미분가능(differentialble)하면 Differentiable Manifold라는 클래스로 정의된다. Differentiable Manifold는 Ck로 표기하고 k는 k번 미분 가능하다는 뜻이다. 특히 이들 Transition 매핑이 무한 번 미분 가능하다면(Infinitely Differentiable, C) 이것을 'Smooth Manifold'라고 부른다.

참고로 무한 번 미분 가능하다는 것은 말 그대로 (해당 구간에서) 고계도 미분을 끝도 없이 할 수 있다는 의미이다. 다항함수(Polynomial)는 무한 번 미분 가능하기 때문에 모든 함수가 무한 번 미분 가능해 보인다. 하지만 y=|x|⋅x 같은 경우 한 번 미분은 가능하지만(2⋅|x|) 두 번째 부터는 x=0 지점에서 미분이 불가능하여 모든 실수 구간에서 Infinitely Differentiable 하지 않다.

Smooth Manifold가 중요한 이유는 미적분같은 기법들을 적용하여 Manifold를 분석할 수 있기 때문이다. Chart를 통해 변환된 저차원의 유클리드 공간에서는 원본 Manifold에서보다 훨씬 쉽게 분석 기법들을 적용할 수 있게 된다(전국도로교통 지도책을 생각해보자).

참고

'Math' 카테고리의 다른 글

Rank  (0) 2020.10.13
미분 Chain Rule  (0) 2019.07.31
미분 곱의 법칙 (Product rule)  (0) 2019.07.22
미분 관련 수학 기호  (1) 2019.06.07
Right Coset  (0) 2017.06.27

Blender Vertex ID 지정해서 선택하기

Computer

특정 Vertex ID(번호)에 해당하는 점이 모델에서 어디에 위치해 있는지 알아야 할 필요가 있어서 그런 툴을 만들어 봐야 하나 생각해 봤는데, Blender에서 파이썬 스크립트 사용하여 해결할 수 있었다. 이에 대한 내용을 정리해 보았다.

우선 정점 인덱스가 잘 선택되었는지 알아보기 위해 Blender를 디버그 모드로 띄웠다. https://koodev.tistory.com/39 참고. 그리고 대상 모델을 로드하자.

Blender의 좌상단 메뉴 막대 Help 옆에 보면 "Choose Screen layout." 콤보박스에 "Default" 가 선택되어 있다. 이것을 "Scripting" 으로 바꾸자.

그러면 위와 같이 3분할된 화면 구성으로 바뀔 것이다. 이 3분할에서 좌상단이 Text Editor 인데, "+ New" 버튼을 누른 다음 입력창에 아래 코드를 입력한다.

import bpy
import bmesh

def select(*args):
    obj = bpy.context.object
    me = obj.data
    bm = bmesh.from_edit_mesh(me)

    vertices= [e for e in bm.verts]
    oa = bpy.context.active_object

    for vert in vertices:
        if vert.index in args:
            vert.select = True
        else:
            vert.select = False

    bmesh.update_edit_mesh(me, True)

(참고로 이 코드는 하단의 "Console" 창에 입력하면 바로 사용할 수 있다. 그런데, 인터프리터에서 들여쓰기를 자동으로 해 주기 때문에 한 번에 붙여넣을 수 없고 한줄씩 붙여넣어야 한다.)

이제 텍스트 에디터의 코드를 하단의 콘솔로 가져와야 한다. 콘솔창에 아래 명령어를 차례로 입력한다.

import bpy
code = bpy.data.texts['Text'].as_string()
exec(code)

이제 준비가 완료되었다. 콘솔에서 select 함수를 실행하여 정점 번호를 지정해 주면 된다.

참고