【问题标题】:Adding a Sprite to a Rotating Sphere将 Sprite 添加到旋转球体
【发布时间】:2016-04-27 01:58:49
【问题描述】:

我是 three.js 和 webgl 的新手...我正在尝试向这个旋转球体添加一个精灵(这是我自己的图像)。我希望我的这个图像在球体中保持不变,无论我在哪里旋转它,当然,球体中反射的环境仍然会移动。这是对 MC Escher 的画作“反射球中的自画像”的借鉴。一切似乎都工作正常,除了我无法让精灵出现。不过,它并没有给我任何错误。哦,同样出于某种原因,天空盒环境最初不会加载。我必须单击其中一个控件才能显示它。请帮忙!谢谢!这是我的代码:

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

【问题讨论】:

  • 你能把它放在 jsbin 或 codepen 或 [你最喜欢的小提琴工具] 中吗?如果您不喜欢张贴自己的脸,也许可以使用股票肖像图像。使调试更容易。
  • @user01 我检查了 codepen,但找不到上传我正在使用的图像的位置。我错过了什么?
  • 这里上传到我学校的服务器。您可以使用浏览器查看资源。 mcs.athens.edu/~lgeorge1/FinalProject@user01
  • codepen 没有任何遗漏;他们不允许您上传二进制文件。您必须将它们托管在其他地方,例如您的学校服务器。您发布的内容将正常工作。我没有读到你有这么多资产。我倾向于使用bl.ocks 来处理这样的事情。它免费且方便。
  • 但我的形象(作为精灵实现)根本没有出现。这就是我的问题所在。 @user01

标签: three.js sprite


【解决方案1】:

你的精灵在那里;它只是很小而且被遮挡。

Three.js Sprites 只是始终对准相机的 1x1 平面。您的球体的半径为 400。您创建的精灵几乎没有覆盖 1 个像素,并且 (128, 24, 24) 处的变换很好地位于球体内(不透明)。一些代码如:

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

应该有帮助。

自画像的好概念。

【讨论】:

  • 啊,好的。这让它出现了,它只是不在正确的位置,但我可以解决这个问题。谢谢!我以为我已将我图像上的背景设为透明,但它显示为白色:/ 我将其保存在网络上并检查了透明度。呃。
猜你喜欢
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
相关资源
最近更新 更多