2016-04-25 201 views
0

我是品牌屁股new.js和webgl ...我試圖添加一個精靈(這是我自己的圖像)到這個旋轉球體。無論我在哪裏旋轉它,我都希望這個圖像在球體中保持不變,當然,球體中反射的環境仍然會移動。這是MC Escher繪畫「反光球中的自畫像」的一部分。一切似乎都工作正常,除非我不能讓精靈出現。儘管如此,它並沒有給我任何錯誤。哦,也是出於某種原因,天空盒環境最初不會加載。我必須點擊其中一個控件纔會出現。請幫忙!謝謝!這裏是我的代碼:將Sprite添加到旋轉球體

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta charset="utf-8"> 
     <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"> 
    </head> 

    <script type = "text/Javascript" src = "../FinalProject/three.min.js"></script> 
    <script type = "text/Javascript" src = "../FinalProject/OrbitControls.js"></script> 
    <script type = "text/Javascript" src = "../FinalProject/dat.gui.min.js"></script> 

    <body> 
    <script> 
     var controls, camera, scene, renderer; 
     var cameraCube, sceneCube; 
     var textureEquirec, textureCube, textureSphere; 
     var cubeMesh, sphereMesh; 
     var sphereMaterial; 
     //var refract; 

     init(); 
     animate(); 

     function init() 
     { 
      //cameras 

       camera = new THREE.PerspectiveCamera(70, window.innerWidth/window.innerHeight, 1, 100000); 
       camera.position.set(0, 0, 1000); 
       cameraCube = new THREE.PerspectiveCamera(70, window.innerWidth/window.innerHeight, 1, 100000); 

       controls = new THREE.OrbitControls(camera); 
       controls.minDistance = 500; 
       controls.maxDistance = 2500; 

      //scene 

       scene = new THREE.Scene(); 
       sceneCube = new THREE.Scene(); 

      //lights 
      var ambient = new THREE.AmbientLight(0xffffff); 
       scene.add(ambient); 

      //textures 
      var urls = [ 
       "../FinalProject/pos-x.png", 
       "../FinalProject/neg-x.png", 
       "../FinalProject/pos-y.png", 
       "../FinalProject/neg-y.png", 
       "../FinalProject/pos-z.png", 
       "../FinalProject/neg-z.png", 
      ]; 

      textureCube = new THREE.CubeTextureLoader().load(urls); 
      textureCube.format = THREE.RGBFormat; 
      textureCube.mapping = THREE.CubeReflectionMapping; 

      var textureLoader = new THREE.TextureLoader(); 

      textureEquirec = textureLoader.load("../FinalProject/environment.jpg"); 
      textureEquirec.mapping = THREE.EquirectangularReflectionMapping; 
      textureEquirec.magFiler = THREE.LinearFilter; 
      textureEquirec.minFilter = THREE.LinearMipMapLinearFilter; 

      textureSphere = textureLoader.load("../FinalProject/metal.jpg"); 
      textureSphere.mapping = THREE.SphericalReflectionMapping; 

      //materials 
      var equirectShader = THREE.ShaderLib["equirect"]; 

      var equirectMaterial = new THREE.ShaderMaterial({ 
       fragmentShader: equirectShader.fragmentShader, 
       vertexShader: equirectShader.vertexShader, 
       uniforms: equirectShader.uniforms, 
       depthWrite: false, 
       side: THREE.BackSide 
      }); 

      equirectMaterial.uniforms["tEquirect"].value = textureEquirec; 

      var cubeShader = THREE.ShaderLib["cube"]; 
      var cubeMaterial = new THREE.ShaderMaterial({ 
       fragmentShader: cubeShader.fragmentShader, 
       vertexShader: cubeShader.vertexShader, 
       uniforms: cubeShader.uniforms, 
       depthWrite: false, 
       side: THREE.Backside 
      }); 

      cubeMaterial.uniforms["tCube"].value = textureCube; 

      //Skybox 

      cubeMesh = new THREE.Mesh(new THREE.BoxGeometry(100, 100, 100), cubeMaterial); 
      sceneCube.add(cubeMesh); 

      var geometry = new THREE.SphereGeometry(400.0, 24, 24); 
      sphereMaterial = new THREE.MeshLambertMaterial({envMap: textureCube}); 
      sphereMesh = new THREE.Mesh(geometry, sphereMaterial); 

      scene.add(sphereMesh); 

      //Sprite 

      var map = new THREE.TextureLoader().load("../FinalProject/MeCutout.png"); 
      var material2 = new THREE.SpriteMaterial({map:map}); 
      var sprite1 = new THREE.Sprite(material2); 
      sprite1.position.set(128, 24, 24); 
      scene.add(sprite1); 

      //renderer 
      renderer = new THREE.WebGLRenderer(); 
      renderer.autoClear = false; 
      renderer.setPixelRatio(window.devicePixelRatio); 
      renderer.setSize(window.innerWidth, window.innerHeight); 
      renderer.setFaceCulling(THREE.CullFaceNone); 
      document.body.appendChild(renderer.domElement); 

      var params = { 
       Cube: function() { 
        cubeMesh.Material = cubeMaterial; 
        cubeMesh.visible = true; 
        sphereMaterial.envMap = textureCube; 
        sphereMaterial.needsUpdate = true; 
       }, 
       Equirectangular: function() { 
        cubeMesh.material = equirectMaterial; 
        cubeMesh.visible = true; 
        sphereMaterial.envMap = textureEquirec; 
        sphereMaterial.needsUpdate = true; 
       }, 

       Refraction: false 
      }; 

      //GUI 

      var gui = new dat.GUI(); 
      gui.add(params, 'Cube'); 
      gui.add(params, 'Equirectangular'); 
      gui.open(); 

      window.addEventListener('resize', onWindowResize, false); 
     }//end function init 

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

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

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

     function animate() 
     { 
      requestAnimationFrame(animate); 
      render(); 
      controls.update(); 
     } 

     function render() 
     { 
      var timer = -0.0002 * Date.now(); 

      camera.lookAt(scene.position); 
      cameraCube.rotation.copy(camera.rotation); 

      renderer.render(sceneCube, cameraCube); 
      renderer.render(scene, camera); 
     } 


    </script> 
    </body> 
</html> 
+0

你可以把這個在jsbin或codepen或[你最喜歡的小提琴工具]?如果你不舒服張貼你的臉,也許是一個股票肖像圖像。使調試更容易。 – user01

+0

@ user01我檢出了codepen,但無法找到要上傳圖片的地方。我錯過了什麼? – lisabits

+0

在這裏它被上傳到我的學校的服務器。您可以使用瀏覽器查看資源。 http://mcs.athens.edu/~lgeorge1/FinalProject/ @ user01 – lisabits

回答

1

你是精靈在那裏;它只是微小的和閉塞的。

Three.js Sprites只是1x1飛機,總是瞄準相機。你的球體有半徑400。您創建的精靈幾乎不會覆蓋1個像素,並且(128,24,24)處的變換完全位於球體內部(這是不透明的)。一些代碼如:

sprite1.position.set(550, 24, 24); 
sprite1.scale.set(550,550,550); 

應該有所幫助。

偉大的概念爲自畫像。

+0

啊,好的。這使得它顯現出來,它只是不正確的位置,但我可以解決這個問題。謝謝!我認爲我已經將透明的圖像背景變成了透明的,但它顯示爲白色:/我將它保存爲網頁並檢查了透明度。啊。 – lisabits