我在本地尝试时出现Three.js错误(CORS策略)

时间:2018-08-04 10:39:20

标签: javascript three.js 3d cors

我是这个网站的新手,我想开始学习javascript。

我只想开始复制此示例https://threejs.org/examples/#webgl_animation_cloth 但是我所得到的是: Photo with the error I have and no animation, background neither

因此,我在电脑中下载了three.js,并在文件/ js中放入了three.js和three.min.js文件,如图所示。

我看到了一些类似Allow anything through CORS Policy的帖子,试图让所有内容都通过CORS,但我不知道它的工作原理或该文本的放置位置。 这是另一篇类似的帖子Cors policy not allowing upload,但我不了解。

正如我所说的,我刚开始,我不太懂英语,我更愿意为假人回答。 TY。

代码:

c = a.add(b)
print(c)

编辑1: @ prisoner849我尝试了第二种方法,但仍然无法正常工作。我也不确定我是否做得正确,是否可以放置公共google驱动器链接?还是必须在特定服务器上?我也在不和谐的网站上尝试过,当我单击链接时,我看到了照片,但仍然有同样的问题。 我只用如下路径更改了行:

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>three.js webgl - cloth simulation</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
        <style>
            body {
                font-family: Monospace;
                background-color: #000;
                color: #000;
                margin: 0px;
                overflow: hidden;
            }
            #info {
                position: absolute;
                padding: 10px;
                width: 100%;
                text-align: center;
            }
            a {
                text-decoration: underline;
                cursor: pointer;
            }
        </style>
    </head>

    <body>
        <div id="info">Simple Cloth Simulation<br/>
            Verlet integration with relaxed constraints<br/>
            <a onclick="wind = !wind;">Wind</a> |
            <a onclick="sphere.visible = !sphere.visible;">Ball</a> |
            <a onclick="togglePins();">Pins</a>
        </div>

        <script src="../build/three.js"></script>

        <script src="js/Detector.js"></script>
        <script src="js/controls/OrbitControls.js"></script>
        <script src="js/libs/stats.min.js"></script>

        <script src="js/Cloth.js"></script>

        <script>
            /* testing cloth simulation */
            var pinsFormation = [];
            var pins = [ 6 ];
            pinsFormation.push( pins );
            pins = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
            pinsFormation.push( pins );
            pins = [ 0 ];
            pinsFormation.push( pins );
            pins = []; // cut the rope ;)
            pinsFormation.push( pins );
            pins = [ 0, cloth.w ]; // classic 2 pins
            pinsFormation.push( pins );
            pins = pinsFormation[ 1 ];
            function togglePins() {
                pins = pinsFormation[ ~~ ( Math.random() * pinsFormation.length ) ];
            }
            if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
            var container, stats;
            var camera, scene, renderer;
            var clothGeometry;
            var sphere;
            var object;
            init();
            animate();
            function init() {
                container = document.createElement( 'div' );
                document.body.appendChild( container );
                // scene
                scene = new THREE.Scene();
                scene.background = new THREE.Color( 0xcce0ff );
                scene.fog = new THREE.Fog( 0xcce0ff, 500, 10000 );
                // camera
                camera = new THREE.PerspectiveCamera( 30, window.innerWidth / window.innerHeight, 1, 10000 );
                camera.position.set( 1000, 50, 1500 );
                // lights
                var light, materials;
                scene.add( new THREE.AmbientLight( 0x666666 ) );
                light = new THREE.DirectionalLight( 0xdfebff, 1 );
                light.position.set( 50, 200, 100 );
                light.position.multiplyScalar( 1.3 );
                light.castShadow = true;
                light.shadow.mapSize.width = 1024;
                light.shadow.mapSize.height = 1024;
                var d = 300;
                light.shadow.camera.left = - d;
                light.shadow.camera.right = d;
                light.shadow.camera.top = d;
                light.shadow.camera.bottom = - d;
                light.shadow.camera.far = 1000;
                scene.add( light );
                // cloth material
                var loader = new THREE.TextureLoader();
                var clothTexture = loader.load( 'textures/patterns/circuit_pattern.png' );
                clothTexture.anisotropy = 16;
                var clothMaterial = new THREE.MeshLambertMaterial( {
                    map: clothTexture,
                    side: THREE.DoubleSide,
                    alphaTest: 0.5
                } );
                // cloth geometry
                clothGeometry = new THREE.ParametricGeometry( clothFunction, cloth.w, cloth.h );
                // cloth mesh
                object = new THREE.Mesh( clothGeometry, clothMaterial );
                object.position.set( 0, 0, 0 );
                object.castShadow = true;
                scene.add( object );
                object.customDepthMaterial = new THREE.MeshDepthMaterial( {
                    depthPacking: THREE.RGBADepthPacking,
                    map: clothTexture,
                    alphaTest: 0.5
                } );
                // sphere
                var ballGeo = new THREE.SphereBufferGeometry( ballSize, 32, 16 );
                var ballMaterial = new THREE.MeshLambertMaterial();
                sphere = new THREE.Mesh( ballGeo, ballMaterial );
                sphere.castShadow = true;
                sphere.receiveShadow = true;
                scene.add( sphere );
                // ground
                var groundTexture = loader.load( 'textures/terrain/grasslight-big.jpg' );
                crossOrigin: null
                groundTexture.wrapS = groundTexture.wrapT = THREE.RepeatWrapping;
                groundTexture.repeat.set( 25, 25 );
                groundTexture.anisotropy = 16;
                var groundMaterial = new THREE.MeshLambertMaterial( { map: groundTexture } );
                var mesh = new THREE.Mesh( new THREE.PlaneBufferGeometry( 20000, 20000 ), groundMaterial );
                mesh.position.y = - 250;
                mesh.rotation.x = - Math.PI / 2;
                mesh.receiveShadow = true;
                scene.add( mesh );
                // poles
                var poleGeo = new THREE.BoxBufferGeometry( 5, 375, 5 );
                var poleMat = new THREE.MeshLambertMaterial();
                var mesh = new THREE.Mesh( poleGeo, poleMat );
                mesh.position.x = - 125;
                mesh.position.y = - 62;
                mesh.receiveShadow = true;
                mesh.castShadow = true;
                scene.add( mesh );
                var mesh = new THREE.Mesh( poleGeo, poleMat );
                mesh.position.x = 125;
                mesh.position.y = - 62;
                mesh.receiveShadow = true;
                mesh.castShadow = true;
                scene.add( mesh );
                var mesh = new THREE.Mesh( new THREE.BoxBufferGeometry( 255, 5, 5 ), poleMat );
                mesh.position.y = - 250 + ( 750 / 2 );
                mesh.position.x = 0;
                mesh.receiveShadow = true;
                mesh.castShadow = true;
                scene.add( mesh );
                var gg = new THREE.BoxBufferGeometry( 10, 10, 10 );
                var mesh = new THREE.Mesh( gg, poleMat );
                mesh.position.y = - 250;
                mesh.position.x = 125;
                mesh.receiveShadow = true;
                mesh.castShadow = true;
                scene.add( mesh );
                var mesh = new THREE.Mesh( gg, poleMat );
                mesh.position.y = - 250;
                mesh.position.x = - 125;
                mesh.receiveShadow = true;
                mesh.castShadow = true;
                scene.add( mesh );
                // renderer
                renderer = new THREE.WebGLRenderer( { antialias: true } );
                renderer.setPixelRatio( window.devicePixelRatio );
                renderer.setSize( window.innerWidth, window.innerHeight );
                container.appendChild( renderer.domElement );
                renderer.gammaInput = true;
                renderer.gammaOutput = true;
                renderer.shadowMap.enabled = true;
                // controls
                var controls = new THREE.OrbitControls( camera, renderer.domElement );
                controls.maxPolarAngle = Math.PI * 0.5;
                controls.minDistance = 1000;
                controls.maxDistance = 5000;
                // performance monitor
                stats = new Stats();
                container.appendChild( stats.dom );
                //
                window.addEventListener( 'resize', onWindowResize, false );
                sphere.visible = ! true;
            }
            //
            function onWindowResize() {
                camera.aspect = window.innerWidth / window.innerHeight;
                camera.updateProjectionMatrix();
                renderer.setSize( window.innerWidth, window.innerHeight );
            }
            //
            function animate() {
                requestAnimationFrame( animate );
                var time = Date.now();
                var windStrength = Math.cos( time / 7000 ) * 20 + 40;
                windForce.set( Math.sin( time / 2000 ), Math.cos( time / 3000 ), Math.sin( time / 1000 ) )
                windForce.normalize()
                windForce.multiplyScalar( windStrength );
                simulate( time );
                render();
                stats.update();
            }
            function render() {
                var p = cloth.particles;
                for ( var i = 0, il = p.length; i < il; i ++ ) {
                    clothGeometry.vertices[ i ].copy( p[ i ].position );
                }
                clothGeometry.verticesNeedUpdate = true;
                clothGeometry.computeFaceNormals();
                clothGeometry.computeVertexNormals();
                sphere.position.copy( ballPosition );
                renderer.render( scene, camera );
            }
        </script>
    </body>
</html>

var clothTexture = loader.load('https://cdn.discordapp.com/attachments/402574308532027422/475765536735756302/circuit_pattern.png');

2 个答案:

答案 0 :(得分:0)

耦合事物。使用Three.js,您需要一个正在运行的Web服务器。如果您仅安装了NPM:

npm install http-server -g

cd /path/to/project/root

http-server

如果不这样做,请先安装Node然后再安装NPM并运行上面的命令。

https://nodejs.org/en/download/

https://www.npmjs.com/get-npm

第二,不,开箱即用,您不能链接到外部源。您必须将跨域设置为“匿名”。试试这个,这应该可以解决问题。

var loader = new THREE.TextureLoader();
loader.setCrossOrigin("anonymous");
var clothTexture = loader.load( 'textures/patterns/circuit_pattern.png' );

答案 1 :(得分:0)

当我在chrome快捷方式中放置--allow-file-access-from-files标志时,它也起作用。谢谢大家。