2016-04-25 20 views
0

私はthree.jsとwebglの新しさを誇るブランドです...私はこの回転球にスプライト(自分のイメージ)を追加しようとしています。私はこのイメージを私がそれを回転させても球で一定に保つことを望みます。もちろん、球に反映された環境はまだ動くでしょう。それは、MCエッシャーの描写「反射する球の自画像」を取り上げたものです。私はスプライトを表示することができない限り、すべて正常に動作しているようです。しかし、それは私にエラーを与えていない。ああ、何らかの理由でも、スカイボックス環境は最初は読み込まれません。コントロールの1つをクリックして表示させる必要があります。助けてください!ありがとうございました!ここに私のコードです:回転球にスプライトを追加する

<!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

ああ、ok。それが現れて、それは正しい位置にないだけですが、私はそれを修正することができます。ありがとうございました!私は私のイメージの背景を透明にしていたと思ったが、それは白く見えている:/私はそれをウェブ用に保存し、透明性をチェックした。ああ。 – lisabits

関連する問題