정점 법선을 프로그래밍 방식으로 생성


11

Kinect Face api로 작업하고 있는데 얼굴 이미지를 만들기 위해 렌더링 할 삼각형에 대한 정점과 인덱스 배열을 제공합니다.

키 넥트가 제공하는 인덱스뿐만 아니라 배열의 정점 수와 순서는 항상 일정합니다.

그러나 API는 UV 데이터 및 정점 법선에 대한 정보를 제공하지 않습니다.

이 응용 프로그램은 얼굴 움직임에 따라 3D 공간에서의 위치가 변경되므로 3D 편집 소프트웨어에서 uv 및 법선을 생성하는 것은 문제가 없으므로 키 넥트가 제시 한 정점 순서를 유지해야합니다.

같은 평면에 정점이 거의 없기 때문에 정점 위치를 2D 평면에 투영하여 UV를 생성 할 수있었습니다.

그러나 정점 위치가 맞지 않아 실루엣이 표시되지만 정점 법선이 없으면 메쉬의 정점 법선을 생성하는 방법을 모릅니다.

정점 법선이 없기 때문에 조명이 올바르게 작동하지 않아 창백한 기능이없는 메쉬가 보입니다.

그래서 내가 가지고있는 모든 것이 정점 위치와 정점 색인으로 삼각형을 만들 때 어떻게 정점 법선을 생성합니까?


n = (v1-v0) x (v2-v0) 여기서 v0, v1 및 v2는 문제가되는 (삼각형)면의 꼭짓점입니다. 주문은 수입입니다. 정말로 필요한 경우 정규화하십시오. (및 x교차 제품입니다)
3Dave

답변:


14

벡터 교차 곱을 사용하여 정점 위치에서 법선을 계산하는 것은 매우 간단합니다.

두 벡터 의 교차 곱V (유명한 ×V또는 때로는 V)은에 직교하는 벡터입니다 V길이 ||×V||=||||||V||에스나는(θ)θ 사이의 각도 V. 벡터의 방향은 곱셈 순서에 따라 다릅니다.×V ~의 반대이다 V× (평면에 수직 인 두 방향).

교차 제품에 익숙하지 않은 경우, 이에 대해 읽고 익숙해 지도록 초대합니다. 그러면 법선이 단순 해 보일 것입니다.

플랫 셰이딩 법선

삼각형이 있다면 , ×는 삼각형에 수직이고 면적에 비례하는 길이를 가진 벡터입니다. 법선은 삼각형 평면에 수직 인 단위 벡터이므로 다음과 같이 법선을 얻을 수 있습니다.

=×||×||

코드에서 이것은 n = normalize(cross(b-a, c-a))예를 들어 보입니다 . 이것을 모든 얼굴에 적용하면 얼굴마다 법선이 적용됩니다.

For each triangle ABC
    n := normalize(cross(B-A, C-A))
    A.n := n
    B.n := n
    C.n := n

이것은 정점이 삼각형 사이에서 공유되지 않는다고 가정합니다. Kinect API에 익숙하지 않습니다. 공유 될 가능성이 있습니다.이 경우 복제하거나 다음 솔루션으로 이동해야합니다.

부드러운 음영 법선

위와 같이 계산 된 법선으로 조명 한 후에는 삼각형 모서리가 분명하다는 것을 알 수 있습니다. 이것이 바람직하지 않은 경우 동일한 정점을 공유하는 모든면을 고려하여 부드러운 법선을 대신 계산할 수 있습니다.

같은 정점이 세 개의 삼각형으로 공유되면 1, 2 예를 들어 의 평균이 될 것입니다 1, 2. 또한1 큰 삼각형이고 2 작은 것입니다, 아마도 당신은 원할 것입니다 더 영향을 받기 위해 1 ~보다 2.

교차 곱이 면적에 어떻게 비례하는지 기억하십니까? 교차 곱을 합한 다음 합계를 정규화하면 원하는 가중치 합계를 정확하게 수행합니다. 따라서 알고리즘은 다음과 같습니다.

For each vertex
    vertex.n := (0, 0, 0)

For each triangle ABC
    // compute the cross product and add it to each vertex
    p := cross(B-A, C-A)
    A.n += p
    B.n += p
    C.n += p

For each vertex
    vertex.n := normalize(vertex.n)

이 기술은 Iñigo Quilez : 메쉬의 영리한 정규화에 의해이 기사를 더 자세히 설명합니다 .


법선에 대한 자세한 내용은 다음을 참조하십시오.


나는 이것을 최대한 빨리 보내고 결과와 함께 돌아올 것이다
Allahjane

그것은 톤의 남자에게 감사했습니다, 그것은 정확히 내가 원했던
Allahjane


@ Allahjane : 잘 작동한다고 들었습니다. :)
Julien Guertault
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.