벡터 교차 곱을 사용하여 정점 위치에서 법선을 계산하는 것은 매우 간단합니다.
두 벡터 의 교차 곱유 과 V (유명한 U × V또는 때로는 U ∧ v)은에 직교하는 벡터입니다 유 과 V길이 | | u×v | | = | | u | | ⋅ | | v | | sin(θ)와 θ 사이의 각도 유 과 V. 벡터의 방향은 곱셈 순서에 따라 다릅니다.U × V ~의 반대이다 v × u (평면에 수직 인 두 방향).
교차 제품에 익숙하지 않은 경우, 이에 대해 읽고 익숙해 지도록 초대합니다. 그러면 법선이 단순 해 보일 것입니다.
플랫 셰이딩 법선
삼각형이 있다면 ㅏ B C, A B × AC는 삼각형에 수직이고 면적에 비례하는 길이를 가진 벡터입니다. 법선은 삼각형 평면에 수직 인 단위 벡터이므로 다음과 같이 법선을 얻을 수 있습니다.
엔=A B × A C| | AB×AC| |
코드에서 이것은 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 : 메쉬의 영리한 정규화에 의해이 기사를 더 자세히 설명합니다 .
법선에 대한 자세한 내용은 다음을 참조하십시오.
x
교차 제품입니다)