Reputation: 419
I have a local file in which I try to load texture like this:
var texture = THREE.ImageUtils.loadTexture( 'image.jpg' );
var cubeGeo = new THREE.CubeGeometry( 50, 50, 50 );
var cubeMat = new THREE.MeshBasicMaterial( { map: texture } );
var cube = new THREE.Mesh( cubeGeo, cubeMat );
scene.add( cube );
The image doesn't show (the cube is black). When I move the whole folder to a server, and load it from there, the image is displayed.
My question is, why does it work when the files are on a server and not when they are on my computer? All files have been copied so it is not a problem with missing files. I also tried with absolute path but still no result. Do I have to change some settings on my computer? I am trying this on Windows 7 with Chrome 32.0.1700.76 m (latest version at the time of writing this) and I am using THREE.js r64. No other libraries are used.
Upvotes: 6
Views: 16639
Reputation: 104833
Your problem is due to security restrictions.
Run a local server.
For more info, see the three.js wiki article How to Run Things Locally.
three.js r.112
Upvotes: 9
Reputation: 302
If you need to use textures in your project, you can convert images to base64 strings and then just assign them to your variables
Here is the sample: https://codepen.io/tamlyn/pen/RNrQVq
var texture = new THREE.Texture();
texture.image = image;
image.onload = function() {
texture.needsUpdate = true;
};
Where image was read from the base64 string
So you can create res.js and just write there all the textures :) it's not very good, because if you change some images, you have to reconvert them to base64, but it works in any browser (even Ms edge)
Upvotes: 3
Reputation: 335
Probably late to the party, again.
You actually can do that without setting up a node server, unless ofcourse, you need a backend anyways.
You can basically do this by loading your local image into the browser by converting it into a Base64 string using the FileReader
object.
After you convert the image to a Base64 string you can either save it to sessionStorage
(limited to ~4 Mb on average), or keep the string saved in some variable while your "app" is running.
You can then convert the base64 string to a three.js texture, and apply it to an object in your scene. Note the asynchronous render call in the example below; You have to render the scene after the texture fully loads, otherwise, it simply won't show.
In the below case, I load the three.texture with my image that I've uploaded to sessionStorage
.
TEXTURE = THREE.ImageUtils.loadTexture(
sessionStorage.getItem('myBase64Img');
{},
function () { renderScene(); /* async call after texture is loaded */ }
);
Cheers!
Upvotes: 1
Reputation: 1553
To further explain (because I was confused as well), you can install a local server (I used node - http://nodejs.org/download/ to download node).
After, to install server cd to your project directory and run in command line:
npm install http-server -g
To run:
http-server
Then go to the default local page
http://localhost:8080/
and you should see your project there.
Upvotes: 1