2017-10-02 6 views
0

고유 한 모델 형식을 만들고 싶습니다. 그 목적을 위해 사용자 지정 지오메트리를 만들려고합니다. 지오메트리를 올바르게 가져올 수 있습니다. 버 얼굴 법선은 도형에 추가하더라도 렌더링되지 않습니다. 여기 Three.js면 법선이 올바르게 렌더링되지 않습니다.

# Coordinates 
    0e+0 0e+0 0e+0 
    1e+0 0e+0 0e+0 
    1e+0 0e+0 1e+0 
    0e+0 0e+0 1e+0 
    0e+0 1e+0 0e+0 
    1e+0 1e+0 0e+0 
    1e+0 1e+0 1e+0 
    0e+0 1e+0 1e+0 
# Normals 
0e+0 0e+0 -1e+0 
0e+0 -1e+0 0e+0 
0e+0 0e+0 1e+0 
0e+0 1e+0 0e+0 
1e+0 0e+0 0e+0 
-1e+0 0e+0 0e+0 

# Connectivity List 
1 2 6 5 
1 2 3 4 
3 4 8 7 
6 5 8 7 
2 6 7 3 
1 5 8 4 

내가 그것을 가져 오는 방법입니다 :

여기에 입력 파일입니다. I는 얼굴 삼각형 쿼드로 변환하고 코드 (연결리스트) FACE4 동안 어레이에서

var geometry = new THREE.Geometry(); 

    //Add all positions to geometry 
    for (var g=0;g<coordinates.length;g++){ 
     geometry.vertices.push(coordinates[g]); 

    } 

    for(var l=0;l<connectivity.length;l++){ 

     //sml file have rectangular faces but three js uses triangular faces (THREE.Face4 is deprecated) so converting 4 vertex faces to 3 verex faces 
     var index0= connectivity[l][3]-1; 
     var index1= connectivity[l][4]-1; 
     var index2= connectivity[l][5]-1; 
     var index3= connectivity[l][6]-1; 

     //If normals is exist thenaddthem to face array too 

     if(normals.length==connectivity.length){ 

      console.log("Normals are exist"); 

      var face0= new THREE.Face3(index0,index1,index2); 
      face0.normal.set(normals[l]); 

      geometry.faces.push(face0); 

      var face1= new THREE.Face3(index2,index3,index0); 
      face1.normal.set(normals[l]); 

      geometry.faces.push(face1); 

     } else{ 

      console.log("Normals are not exist"); 

      var face0= new THREE.Face3(index0,index1,index2); 
      geometry.faces.push(face0); 
      var face1= new THREE.Face3(index2,index3,index0); 

      geometry.faces.push(face1); 
     } 
    } 

    geometry.computeBoundingBox(); 
    // geometry.compteVertexNormals(); 
    geometry.computeFaceNormals(); 

는 thee.js. 의해 사용되지 그리고 저는 같은 쿼드를 공유하는 두 삼각형 모두에 동일한 법선을 할당하고 있습니다. 여기

는이 상자를 렌더링하는 방법입니다 :

Box Render

오전 내가 모르는 뭔가가?

+0

얼굴 법선 목록이 있거나 그렇지 않은 경우 얼굴 법선을 계산해도 문제가 발생하지 않습니다. 나는 코드 스 니펫'geometry.computeFaceNormals();'의 끝 부분에서이 줄로 인해 묻습니다. – prisoner849

+0

예, 그 선 앞에 조건을 넣어야합니다. 하지만 그것은 현재의 문제와 관련이 없습니다. 어쨌든 고마워. – user3160302

+0

'.computeFaceNormals()'는 호출 될 때 지오메트리의면에 대한 법선을 자동으로 계산합니다. 또한 조건 블록에서 동일한 작업을 두 번 수행합니다. 두 개의 얼굴을 만듭니다. 유일한 차이점은 법선을 추가한다는 것입니다. 따라서 조건 블럭에서 얼굴을 생성하고 조건이 '참'일 때 법선을 추가하는 것이 더 나을 것입니다. – prisoner849

답변

0

다음 줄은 올바른 구문을 사용하지 않습니다.

face0.normal.set(normals[l]); 
... 
face1.normal.set(normals[l]); 

Face3.normalVector3Vector3.set takes 3 parameters입니다.

x, yz 특성을 normals[l]이있는 경우 :

face0.normal.set(normals[l].x, normals[l].y, normals[l].z); 

올바르게 설정합니다.

대체로 이라는 일반 문자를 Face3 생성자로 전달할 수 있습니다. 새로운 정보를 바탕으로 See the docs here for more info.

:

normals[l] 이후 이미 Vector3, 당신은 Vector3.copy 대신 set를 사용해야합니다 : 그것은 Vector3 때문에, 말했다

face0.normal.copy(normals[l]); 

, 위에서 언급 한 것처럼 생성자에 실제로 포함시켜야합니다.

+0

또는 THREE.Vector3()의'.copy()'메소드를 사용하여 법선을 설정하십시오. – prisoner849

+1

@ prisoner849'normals [l]'이 이미'Vector3' 인 경우 맞을 수도 있습니다. 유감스럽게도 제공된 코드는 알 수 없습니다. 그게 기하학을 알아 차리게 만들었 어. 정점들.push (좌표 [g]);'이므로 좌표 [g]도'Vector3'입니다. – TheJim01

+0

예 둘 다 이미 vector3입니다. 긴 스크립트 인 동안 나는 그들을 포함시키지 않았다. – user3160302