2016-12-15 1 views
2

.tga 파일에서 텍스처를로드하는 .obj 및 .mtl이 있습니다. 이 모든 것은 3D 모델링 소프트웨어에서 잘 작동하는 것처럼 보이지만 객체의 자식 중 일부 (특히 무릎과 송아지 사이에 포켓과 다리와 같이)가 아닌 three.js (THREE.WebGLRenderer({ antialias: true }))가로드되면 투명 한 들쭉날쭉 한 간격/빈 삼각형이있는 것 같습니다.ThreeJS : 일부 텍스처 표면/삼각형이 렌더링되지 않습니다.

threejsHelper.helpers.loadObject('objects/pants/MaleBaggyPants.obj', 'objects/pants/MaleBaggyPants.mtl', { 
    blinn1SG: (new THREE.MeshPhongMaterial({ color: 0xffffff, transparent: false, opacity: 1.0, overdraw: 0.5, map: threejsHelper.helpers.loadTexture(app.manager, 'objects/pants/button.tga') })), 
    blinn2SG: (new THREE.MeshPhongMaterial({ color: 0xffffff, transparent: false, opacity: 1.0, overdraw: 0.5, map: threejsHelper.helpers.loadTexture(app.manager, 'objects/pants/back.tga') })), 
    blinn4SG: (new THREE.MeshPhongMaterial({ color: 0xffffff, transparent: false, opacity: 1.0, overdraw: 0.5, map: threejsHelper.helpers.loadTexture(app.manager, 'objects/pants/front.tga') })), 
    blinn5SG: (new THREE.MeshPhongMaterial({ color: 0xffffff, transparent: false, opacity: 1.0, overdraw: 0.5, map: threejsHelper.helpers.loadTexture(app.manager, 'objects/pants/pocket.tga') })), 
    blinn6SG: (new THREE.MeshPhongMaterial({ color: 0xffffff, transparent: false, opacity: 1.0, overdraw: 0.5, map: threejsHelper.helpers.loadTexture(app.manager, 'objects/pants/back.tga') })), 
    blinn7SG: (new THREE.MeshPhongMaterial({ color: 0xffffff, transparent: false, opacity: 1.0, overdraw: 0.5, map: threejsHelper.helpers.loadTexture(app.manager, 'objects/pants/front.tga') })) 
}, function (object) { 
    object.rotation.x = (-90*Math.PI/180); 
    object.rotation.z = (-90*Math.PI/180); 
    app.scene.add(object); 
    app.ready = true; 
}); 

도우미 함수 :

... 
loadTexture: function (manager, path) { 
    var texture; 
    if (path.split('.').pop() == 'tga') { 
     var loader = new THREE.TGALoader(); 
     texture = loader.load(path); 
    } else { 
     texture = new THREE.Texture(); 
     var loader = new THREE.ImageLoader(manager); 
     loader.load(path, function (image) { 
      texture.image = image; 
      texture.needsUpdate = true; 
     }); 
    } 
    return texture; 
}, 
loadMaterial: function (mtlPath, textures, complete) { 
    var loader = new THREE.MTLLoader(); 
    loader.load(mtlPath, function (materials) { 
     materials.preload(); 
     if (!!materials.materials) { 
      for (var key in materials.materials) { 
       if (key in textures) { 
        materials.materials[key] = textures[key]; 
       } 
      } 
     } 
     complete(materials); 
    }); 
}, 
loadObject: function (objPath, mtlPath, textures, complete) { 
    app.helpers.loadMaterial(mtlPath, textures, function (materials) { 
     var loader = new THREE.OBJLoader(); 
     loader.setMaterials(materials); 
     loader.load(objPath, function (object) { 
      complete(object); 
     }); 
    }); 
}, 
... 

1

로더 기능 ( 등의 오버 드로 값을 변경 투명도를 오프, 안티 앨리어싱 온 시도) 2 3

+1

'material.side = THREE.DoubleSide'로 설정하십시오. 또한 오버 드로를 제거하십시오 - 그것은'CanvasRenderer'만을위한 것입니다. – WestLangley

+0

@WestLangley 팁 주셔서 감사! 그럼에도 불구하고 그 차이는 여전히 존재합니다. * (CanvasRenderer를 사용하여 다시 시도해보십시오.'var renderer = window.WebGLRenderingContext? 새 THREE.WebGLRenderer (antialias : true)) : 새 THREE.CanvasRenderer();') * –

+0

라이브 예제. 문제가 중복되는 더 간단한 obj 파일을 작성하고 관련성이 없어야하므로 텍스처를 제거하십시오. – WestLangley

답변

2

당신은 삼각형 분할과 함께 생각할 것입니다 두 개체에 보이는 것 따라 여분의 꼭지점이있는 것 같습니다.
필요하지 않은 꼭지점을 제거하고 99 %가 문제를 해결할 것이라고 확신합니다.

extra vertices

는 또한 모델이 매우 작은 규모입니다났습니다.

+2

나는 이것도 알아 차렸다. OP의 게시물에 대한 의견에서 언급했다. 나는 제거가 틈을 남길 것이라고 생각한다. 모델의 삼각 측량 통과가 더 나은 선택입니다. 또는 OBJLoader를 4면 이상의면을 삼각형으로 다시 작성할 수 있습니다. 6 개의 정점으로 정의 된면을 보려면 obj 파일의 60067 행을 참조하십시오. OBJLoader.js는 321 행의 네 번째 정점을 허용하지만 더 이상은 아니기 때문에 Three.js의 닫히지 않은 얼굴을 허용합니다. – Radio

+1

2 알파와 @ 라디오 -이 문제에 관심을 가져 주셔서 감사합니다! – WestLangley

+0

@ 2pha이 문제를 파고 들어 주셔서 감사합니다. 문제의 근원을 실제로 찾아 낼 수있는 현상금을드립니다. 하지만 안타깝게도 나는 얻은 것을 사용해야합니다. (이 .obj 파일은 Second Life에서 제공됩니다) ... 그리고 다른 소프트웨어 (예 : 위의 finder quick look/preview의 예)로 올바르게 렌더링 할 수 있다면, three.js와 함께 올바르게 렌더링 될 수 있습니다. –

관련 문제