2012-12-03 5 views
3

I는 삼각형 다면체 (반드시 볼록하지 않음)과 같은 정보를 갖고 대향한다. 각면을 정의하는 버텍스 트리플의 목록. 정점 법선 목록 (여기에서 정점 법선은 각 정점 주변의 얼굴 법선 (아래 참조)을 평균하여 계산 한 각 정점의 벡터입니다.변환 정점 법선 법선

얼굴 법선 목록을 계산하고 싶습니다. (바깥 쪽을 향한 각면의 평면에 수직 인 정규화 된 벡터).

+0

당신이 원한다면 왜 좋지 않은가? 뉴웰의 방법 (http://www.opengl.org/wiki/Calculating_a_Surface_Normal)을 사용 했습니까? – mmgp

+0

나는 이것을 사용할 수 있기를 원하지만, 다면체의 "밖으로"어떤 방향인지 모르기 때문에 교차 제품을 사용하는 순서를 결정할 수는 없다. 이상적으로 어떤 교차 제품이 올바른지 결정하기 위해 정점 무향을 사용하는 방법이 있어야하지만 그 방법이 확실하지 않습니다. – user1873329

+0

방향을 국부적으로 정의하는 한 가지 방법은 k- 이웃 (주어진 점에 가장 가까운 k 점의 집합)에서 PCA를 고려하는 것입니다. 그러나 이것은 전체적으로 일관된 방향을 제공하지 못할 수 있습니다. 나는 또한 보나 노 폴 (Nord Amenta)과 보로 노이 폴 (Boronoi poles)에 의한 추정에 관한 여러 작품을 기억하고있다. – mmgp

답변

4

교차 된 법선의 방향은 꼭지점 법선 또는 모든 3 개의 꼭지점 중 하나를 사용하여 간단히 지정할 수 있습니다.

당신이 얻을 수있는 당신의 THREE.Face3에서 a, bc과 세 꼭지점 a, bc이 작업을 수행 할 수

Vec3 CalcNormalOfFace(Vec3 pPositions[3], Vec3 pNormals[3]) 
{ 
    Vec3 p0 = pPositions[1] - pPositions[0]; 
    Vec3 p1 = pPositions[2] - pPositions[0]; 
    Vec3 faceNormal = crossProduct(p0, p1); 

    Vec3 vertexNormal = pNormals[0]; // or you can average 3 normals. 
    float dot = dotProduct(faceNormal, vertexNormal); 

    return (dot < 0.0f) ? -faceNormal : faceNormal; 
} 
0

기본 three.js를 코드 : 여기

는 의사 코드 지오 메트릭 정점 :

var a = geometry.vertices[ face.a ]; 
var b = geometry.vertices[ face.b ]; 
var c = geometry.vertices[ face.c ]; 

var normal = new THREE.Vector3().crossVectors( 
    new THREE.Vector3().subVectors(b, a), 
    new THREE.Vector3().subVectors(c, a) 
).normalize(); 

을하지만 당신을 위해 정점과 얼굴 계산을 할 수있는 THREE.Geometry 클래스의 편리한 방법도 있습니다 : 그리고 당신은 할 computeVertexNormalscomputeFaceNormals은.

관련 문제