2016-07-20 16 views
2

I 3D-Modell eines Autos mit three.js sichtbar zu machen versuche, und ich habe einige Probleme (mein Code unten):three.js - Objekte auswählen, erhalten Objektmaterial

1) Die 3d Das Modell wird in Maya 2016 erstellt und dann als .obj- und .mtl-Dateien exportiert. Ich will, dass die Teile des Autos auswählbar sind (ich meine, wenn du es auswählst, hebt es in grüner Farbe hervor, wenn du wieder auf das ausgewählte Teil klickst, geht es wieder auf normale Farbe zurück.) Das habe ich schon gemacht, aber das Problem ist, dass die Raycast im Pfad des Strahls alle Objekte auswählt, meine ich, wenn ich Tür wählen, wird alles dahinter ausgewählt und ich möchte nur die Tür wählen.

2) das zweite Problem, dass der Renderer visualisiert keine transparenten Materialien für ex. die Fenster und Scheinwerfer. Und ich habe einige 3D-Auto-Visualisierer gesehen, die transparente Materialien anzeigen können. Das dritte Problem geht auf Nummer 1 zurück. Wenn ich ein Teil auswähle, möchte ich seine vorherige Materialfarbe speichern (bevor ich die Hervorhebungsfarbe anwende), also wenn ich es abwähle, könnte es kommen Zurück die normale Farbe, habe ich die Farbe der Autolackierung, die nur falsch ist, da, wenn ich Windows deaktivieren sie rot gehen.

So, hier ist mein index.html Code:

<code><html> 
    <head> 

    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=0.1"> 

    <script src="JavaScript/three.js"></script> 
    <script src="JavaScript/Detector.js"></script> 
    <script src="JavaScript/OrbitControls.js"></script> 
    <script src="JavaScript/OBJLoader.js"></script> 
    <script src="JavaScript/MTLLoader.js"></script> 
    <script src="JavaScript/Projector.js"></script> 

    <link rel="stylesheet" type="text/css" href="css/site.css"> 

    </head> 
    <body> 

    <div class="left"> 
     <p>Low-Poly Croupière<p> 
     <p><a href="https://manu.ninja/" target="_top">manu.ninja</a></p> 
    </div> 

     <div id="test" class="left" hidden="true"> 
     <p>xaxaxaxaxaaxaaxx<p> 
     </div> 

    <a class="right" href="https://github.com/Lorti/webgl-3d-model-viewer-using-three.js" target="_top"> 
     <img src="https://camo.githubusercontent.com/652c5b9acfaddf3a9c326fa6bde407b87f7be0f4/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6f72616e67655f6666373630302e706e67"> 
    </a> 
<script> 

     if (!Detector.webgl) { 
      Detector.addGetWebGLMessage(); 
     } 

     var container; 

     var camera, controls, scene, renderer; 
     var lighting, ambient, keyLight, fillLight, backLight; 

     var windowHalfX = window.innerWidth/2; 
     var windowHalfY = window.innerHeight/2; 
     var objects = []; 

     init(); 
     animate(); 

     function init() { 

      container = document.createElement('div'); 
      document.body.appendChild(container); 
      document.addEventListener('mousedown', onDocumentMouseDown, false); 


      /* Camera */ 

      camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 1, 1000); 
      camera.position.z = 140; 

      /* Scene */ 

      scene = new THREE.Scene(); 
      lighting = true; 

      ambient = new THREE.AmbientLight(0xefefff, 1.0); 
      scene.add(ambient); 

      keyLight = new THREE.DirectionalLight(new THREE.Color('hsl(60, 100%, 75%)'), 3.0); 
      keyLight.position.set(-100, 0, 100); 

      fillLight = new THREE.DirectionalLight(new THREE.Color('hsl(540, 100%, 75%)'), 1.75); 
      fillLight.position.set(100, 0, 100); 

      backLight = new THREE.DirectionalLight(0xe3ffef, 1.0); 
      backLight.position.set(100, 0, -100).normalize(); 

      /* Model */ 

      var mtlLoader = new THREE.MTLLoader(); 
      mtlLoader.setBaseUrl('assets/'); 
      mtlLoader.setPath('assets/'); 
      mtlLoader.load('e46_red_5.mtl', function (materials) { 

       materials.preload(); 

       //materials.materials.default.map.magFilter = THREE.NearestFilter; 
       // materials.materials.default.map.minFilter = THREE.LinearFilter; 

       var objLoader = new THREE.OBJLoader(); 
       objLoader.setMaterials(materials); 
       objLoader.setPath('assets/'); 
       objLoader.load('e46_red_5.obj', function (object) { 



        scene.add(object); 
        objects.push(object); 

       }); 

      }); 

      /* Renderer */ 

      renderer = new THREE.WebGLRenderer(); 
      renderer.setPixelRatio(window.devicePixelRatio); 
      renderer.setSize(window.innerWidth, window.innerHeight); 
      renderer.setClearColor(new THREE.Color("hsl(0, 0%, 10%)")); 

      container.appendChild(renderer.domElement); 

      /* Controls */ 

      controls = new THREE.OrbitControls(camera, renderer.domElement); 
      controls.enableDamping = true; 
      controls.dampingFactor = 0.25; 
      controls.enableZoom = false; 

      /* Events */ 

      window.addEventListener('resize', onWindowResize, false); 
      window.addEventListener('keydown', onKeyboardEvent, false); 
      //window.addEventListener('mousemove', onMouseMove, false); 

     } 

     function onWindowResize() { 

      windowHalfX = window.innerWidth/2; 
      windowHalfY = window.innerHeight/2; 

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

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

     } 

     function onKeyboardEvent(e) { 

      if (e.code === 'KeyL') { 

       lighting = !lighting; 

       if (lighting) { 

        ambient.intensity = 0.25; 
        scene.add(keyLight); 
        scene.add(fillLight); 
        scene.add(backLight); 

       } else { 

        ambient.intensity = 1.0; 
        scene.remove(keyLight); 
        scene.remove(fillLight); 
        scene.remove(backLight); 

       } 

      } 

     } 

     function animate() { 

      requestAnimationFrame(animate); 

      controls.update(); 

      render(); 

     } 

     function render() { 

      renderer.render(scene, camera); 

     } 

    var already_selected = false; 

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

      var projector = new THREE.Projector(); 
      mouseVector = new THREE.Vector3(); 
      mouseVector.x = 2 * (event.clientX/window.innerWidth) - 1; 
      mouseVector.y = 1 - 2 * (event.clientY/window.innerHeight); 

      //var mouse3D = new THREE.Vector3((event.clientX/window.innerWidth) * 2 - 1, 
      //      -(event.clientY/window.innerHeight) * 2 + 1, 
      //      0.5);  
      //var raycaster = projector.pickingRay(mouseVector.clone(), camera); 
      var raycaster = new THREE.Raycaster();           
      raycaster.setFromCamera(mouseVector, camera); 

      var intersects = raycaster.intersectObjects(objects[0].children); 
console.log(intersects) 
      if (intersects.length > 0) { 
       var door = document.getElementById("test"); 
       door.hidden =false; 
       for (var i = 0; i < intersects.length; i++) { 

    //intersects[i].object.material.color.setHex(Math.random() * 0xffffff); 


    //var currentColor = new THREE.Color(intersects[i].object.material.color); 
    var currentColor = +'0x' + intersects[i].object.material.color.getHex().toString(16); 

    if (already_selected == true) { 
     intersects[i].object.material.color.setHex(0x380000); 
     //intersects[i].object.material.color.setHex(currentColor); 
     already_selected = false; 
    } 
    else { 
    intersects[i].object.material.color.setHex(0xccffcc); 
    already_selected = true; 
    } 
} 

      } 
    } 

    </script> 

    </body> 
</html></code> 

Antwort

1

1) Für Ihr Raycaster Problem, Array in Ihrem intersects, würden Sie wollen nur intersects[0] zugreifen, da dies das erste Objekt ist, dass die Raycast intersects . Ich habe nicht den Punkt sehen, durch die ganze Reihe in gehen, wenn Sie wollen keine fremden Gegenstände hinter dem ersten wählen

2) Um die Transparenz zu sehen, Sie haben setzen
(object here).material.transparent = true;
ich tun musste, dies, um durch Objekte zu sehen, wenn Sie darauf klicken, aber ich musste auch Deckkraft einstellen. Angenommen, Ihr Objekt bereits eine Opazität zugewiesen, dann würde es braucht nur die Transparenz Flagge, sonst kann man auch
(object here).material.opacity = some number;

3) gesetzt Was habe ich getan, als ich ein Material zu ‚Highlights‘ will, ist ich wirklich ändern intersects[0].object.material.emissive.set('#(insert color)'); Wenn Sie dann die Maus über das Objekt bewegen, setzen Sie die Emission auf #000000 zurück. Emissive ist besser, weil Sie nicht wirklich die Farbe ändern, nur eine äußere Erscheinung.

+0

Danke, Mann! Alles hat perfekt funktioniert! –

+0

Glücklich zu helfen :) – Rush2112