2014-11-21 2 views
0

3d 모델을 블렌더에서 three.js 파일로 내 보냈습니다. 그것은 그것의 다른 부분에 적용되는 2 개의 재료가 있습니다. 여기에는 코드를 게시하지 않으므로 정점과 uv 좌표가 많이 있습니다. 나는 정말로 그것이 2 개의 물질을 가지고 있다는 것을 알 수있다. 그래서 나는 나의 오류가 내 three.js 코드에 있음을 확신한다. 0 개의 뼈, 모프 타겟, 색을 가지고 있습니다. 그게 내 응용 프로그램에 대한 중요하거나 안다면, 그래서 내 오류가 거기에 있을지 모르겠다. 여기 여러 재질의 메쉬 렌더링시 undef의 속성 'uniform'을 읽을 수 없습니다.

는 내가 지금까지 무엇을 가지고 :

var camera, scene1, scene2, raycaster, renderer, staticMesh , loader; 

var highlighted, standard; 

var mouse = new THREE.Vector2(), INTERSECTED; 

init(); 
animate(); 

function init() { 

    standard = new THREE.MeshLambertMaterial({ color: 0x9999ff }); 
    highlighted = new THREE.MeshLambertMaterial({ color: 0xff0000 }) 

    camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 1, 10000); 
    camera.position.z = 15; 

    scene1 = new THREE.Scene(); 
    scene2 = new THREE.Scene(); 

    loader = new THREE.JSONLoader(); 

    loader.load("abs.json", function(geometry) { 
     var mesh = new THREE.Mesh(geometry, new THREE.MeshLambertMaterial({ color: 0x9999ff })); 
     //mesh.scale.set(10, 10, 10); 
     mesh.position.y = -6; 
     mesh.position.x = 0; 
     scene2.add(mesh); 
    }); 

    loader.load("bodyTest.json", function(geometry, material) { 
      material[0] = new THREE.Mesh(geometry, new THREE.MeshLambertMaterial({ color: 0x9999ff })); 
      material[1] = new THREE.Mesh(geometry, new THREE.MeshLambertMaterial({ color: 0x9999ff })); 
      var materials = new THREE.MeshFaceMaterial(material); 
      staticMesh = new THREE.Mesh(geometry, materials); 
      scene1.add(staticMesh); 
    }); 



    var directionalLight = new THREE.DirectionalLight(0xffffff); 
    directionalLight.position.set(-1, -1, -1).normalize(); 
    scene1.add(directionalLight); 

    directionalLight = new THREE.DirectionalLight(0xffffff); 
    directionalLight.position.set(1, 1, 1).normalize(); 
    scene1.add(directionalLight); 

    directionalLight = new THREE.DirectionalLight(0xffffff, .5); 
    directionalLight.position.set(1, 0, 0).normalize(); 
    scene1.add(directionalLight); 

    directionalLight = new THREE.DirectionalLight(0xffffff, .5); 
    directionalLight.position.set(-1, 0, 0).normalize(); 
    scene1.add(directionalLight); 

    raycaster = new THREE.Raycaster(); 


    renderer = new THREE.WebGLRenderer({ antialiasing: true}); 
    renderer.setClearColor(0xffffff); 
    renderer.setSize(window.innerWidth, window.innerHeight); 
    renderer.sortObjects = false; 


    document.body.appendChild(renderer.domElement); 
    document.addEventListener('mousemove', onDocumentMouseMove, false); 
    window.addEventListener('resize', onWindowResize, false); 
} 

function onWindowResize() { 

    camera.aspect = window.innerWidth/window.innerHeight; 
    camera.updateProjectionMatrix(); 

    renderer.setSize(window.innerWidth, window.innerHeight); 

} 

function onDocumentMouseMove(event) { 
    event.preventDefault(); 

    mouse.x = (event.clientX/window.innerWidth) * 2 - 1; 
    mouse.y = - (event.clientY/window.innerHeight) * 2 + 1; 
} 

function animate() { 

    requestAnimationFrame(animate); 

    scene1.rotation.y += 0.007; 
    scene2.rotation.y += 0.007; 

/*  
    var vector = new THREE.Vector3(mouse.x, mouse.y, 1).unproject(camera); 

    raycaster.set(camera.position, vector.sub(camera.position).normalize()); 

    var intersects = raycaster.intersectObjects(scene2.children); 

    if (intersects.length > 0) { 

     if (INTERSECTED != intersects[ 0 ].object) { 

      if(staticMesh) staticMesh.material.materials[1] = staticMesh.currentMat; 

      INTERSECTED = intersects[ 0 ].object; 
      staticMesh.currentMat = staticMesh.material.materials[1] 
      staticMesh.material.materials[1] = highlighted; 
     } 

    } else { 

     if(staticMesh) staticMesh.material.materials[1] = staticMesh.currentMat; 

      INTERSECTED = null; 
    } 
*/ 

    renderer.render(scene2, camera); 
    renderer.render(scene1, camera); 

} 

당신은 이미 내가 오류에서 오는 줄 알았는데 부분을 주석 볼 수 있듯이. 나는 또한 renderer.render(scene1, camera);가 주석 처리 된 상태로 실행하려고 시도했지만 오류가 없었습니다.

+0

'material [0] = new THREE.Mesh (...)'??? – WestLangley

+0

와우 !!! 나는 그것을 어떻게 놓쳤는가? 내가 그것을 볼 때마다 저는 LambertMaterial을 계속 보았습니다. 괜찮아 보인다. – Sammy

답변

0

이 문제를 어떻게 해결했는지 완전히 이해하지 못했지만 다른 예제에서이를 발견하고 작업이 끝났습니다. 표준은 이전에 정의한 램버트 소재입니다.

loader.load("bodyTest.json", function(geometry) { 
      var material = []; 
      material.push(standard); 
      material.push(standard); 
      var materials = new THREE.MeshFaceMaterial(material); 
      staticMesh = new THREE.Mesh(geometry, materials); 
      scene1.add(staticMesh); 
    }); 

내 문제가 무엇인지 아는 사람이라면 여전히 설명해 주시면 감사하겠습니다.

관련 문제