2014-08-18 4 views
0

나는 그 위에 마우스를 올리면 색상을 변경하고 싶은 입방체가 있습니다. 이것은 하나의 텍스처 만 사용하는 경우에 작동하지만, 지금은 텍스처 배열을 사용하여 이것을 하나의 면당 하나의 텍스처로 사용하고 싶습니다.Three.js 텍스처링 및 강조 표시 문제

if (intersects.length > 0) 
{ 
// if the closest object intersected is not the currently stored intersection object 
    if (intersects[ 0 ].object != INTERSECTED) 
    { 
     // restore previous intersection object (if it exists) to its original color 
     if (INTERSECTED) 
      INTERSECTED.material.color.setHex(INTERSECTED.currentHex); 
      // store reference to closest object as current intersection object 
      INTERSECTED = intersects[ 0 ].object; 
      // store color of closest object (for later restoration) 
      INTERSECTED.currentHex = INTERSECTED.material.color.getHex(); 
      // set a new color for closest object 
      INTERSECTED.material.color.setHex(0x118D08); 
    } 

나는이 작동하지 않습니다 호버에서이 색상 변경을하고 나는 이러한 오류를 얻을 때 :

catch되지 않은 형식 오류 : 정의되지 않은 [반복 13 회]의 속성을 읽을 수 없습니다 'setHex'

을 Uncaught TypeError : 정의되지 않은 'getHex'속성을 읽을 수 없습니다.

큐브는 내가 원하는 방식으로 텍스처링되어 있으므로 오류가 발생하지 않습니다. 내 생각에는 MeshFaceMaterial에는 색상 매개 변수가없는 것과 관련이 있다고 생각합니다. 아무도 내가하려고하는 것이 가능하거나 내가 잘못 가고있는 아이디어가 있다면 말해 줄 수 있습니까?

+0

그래서 'MeshBasicMaterial'을'MeshFaceMaterial'으로 변경 했습니까? 'INTERSECTED'와'intersects [0]'에 대해 더 자세히 설명해 주시겠습니까? 후자는 (Face3 인스턴스에 첨부 된 'materialIndex'를 사용하여) 삼각형 단위로 인덱싱되는 다른 머티리얼의 컨테이너 일뿐입니다. 색인을 생성해야합니다. sidenote로 : 루프와 조건에서 항상 중괄호를 사용하십시오 ([세미콜론 삽입] 참조) (http://stackoverflow.com/questions/2846283/what-are-theules-for-javascripts-automatic-semicolon-insertion -asi)) –

+0

intersects [0]은 장면의 객체 배열의 요소이고 INTERSECTED는 마우스가 교차 한 객체와 색상을 변경하려는 객체입니다. MeshFaceMaterial의 색상을 변경하는 것이 가능한지 정말로 알고 싶습니다. 다음 줄을 생각해 봅니다 : INTERSECTED.material.color.setHex (INTERSECTED.currentHex); 변경하려는 요소가 정확하지 않기 때문에 오류가 발생합니다. –

+0

['MeshFaceMaterial'] (http://threejs.org/docs/index.html#Reference/Materials/MeshFaceMaterial)에는 색상 자체가 없습니다. 상자의 개별면에 설정된 기타 재료를 집계합니다. 다른 재질을 만들어 메시 위에 직접 설정해보십시오. 코드를 최소화하고 [jsfiddle] (http://jsfiddle.net/)에 업로드하십시오. –

답변

0

당신은 지금처럼 '물질'에서 '물질의 배열'을 얻을 수 있습니다

for(var p =0; p < INTERSECTED.material.materials.length; p++){ 
    INTERSECTED.currentHex = INTERSECTED.material.materials[p].emissive.getHex(); 
} 

이 방법은 당신이 MeshFaceMaterial하지만 각면에 사용하는 MeshLambertMaterial 또는 MeshBasicMaterial을 선택하지 않습니다. 이미지를 텍스처로 사용하는 경우 해당 질문에 대한 빠른 대답을 확인하려면 Three.js material texture and color을 확인하는 것이 좋습니다.

희망이 도움이되었다!