0

I'm new in this site and I want to start learning javascript.

I just want to start copying this example https://threejs.org/examples/#webgl_animation_cloth but all i get is this: Photo with the error I have and no animation, background neither

So I downloaded the three.js in my pc and also put in the /js the files three.js and three.min.js as you can see in the picture.

I saw some post like this one Allow anything through CORS Policy that try to allow all the things through CORS but i dont know if its works or where i should put that text. Here is another similar post Cors policy not allowing upload but I don't understand all.

As I said I just started and I don't understand English very well and I would prefer an answer for dummies. TY.

The code:

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

EDIT 1: @prisoner849 I tried the second method but it still does not work. I'm also not sure if I did it correctly, does putting a public google drive link should work? Or does it have to be on a particular server? I tried also in a discord web and when i click the link i see the photo but i still have the same problem. I only changed the lines with the path like this:

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

and

var groundTexture = loader.load('https://drive.google.com/open?id=1VdGnJBALOWDsp9GWbskwa6rnqF_gghP9' );
Kangyx
  • 11
  • 2
  • 2
    Have a look at this [article](https://threejs.org/docs/index.html#manual/introduction/How-to-run-things-locally). – prisoner849 Aug 04 '18 at 10:55

2 Answers2

0

Couple things. With Three.js you need a running web server. If you have NPM installed just:

npm install http-server -g

cd /path/to/project/root

http-server

If you don't, install Node and then NPM and run the commands above.

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

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

And second, no, out of the box, you can't link to an external source. You have to set cross-origin to "anonymous". Try this, this should do the trick.

var loader = new THREE.TextureLoader();
loader.setCrossOrigin("anonymous");
var clothTexture = loader.load( 'textures/patterns/circuit_pattern.png' );
Shawn S.
  • 9
  • 5
0

It also worked when I put the flag --allow-file-access-from-files in the chrome shortcut. Thanks all.

Kangyx
  • 11
  • 2