project from file obj

Hi, I should create a drawing with three.js starting from a file obj but I do not know where to start.
Can you give me some advice?
Thank you

You can use the following example as a starter template:

https://threejs.org/examples/webgl_loader_obj.html

1 Like

I have made a simple example:
http://threejs.hofk.de/OBJLoader/loadExampleObject.html

view-source:http://threejs.hofk.de/OBJLoader/spiner.obj
view-source:http://threejs.hofk.de/OBJLoader/spiner.mtl

License information for the object only in German.

1 Like

Hello, using the sample does not display anything.
this is the code

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

	<script>
		var container;
		var camera, scene, renderer;
		var mouseX = 0, mouseY = 0;
		var windowHalfX = window.innerWidth / 2;
		var windowHalfY = window.innerHeight / 2;
		init();
		animate();
		function init() {
			container = document.createElement( 'div' );
			document.body.appendChild( container );
			camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 2000 );
			camera.position.z = 50;
			// scene
			scene = new THREE.Scene();
			var ambientLight = new THREE.AmbientLight( 0xcccccc, 0.4 );
			scene.add( ambientLight );
			var pointLight = new THREE.PointLight( 0xffffff, 0.8 );
			camera.add( pointLight );
			scene.add( camera );
			// texture
			var manager = new THREE.LoadingManager();
			manager.onProgress = function ( item, loaded, total ) {
				console.log( item, loaded, total );
			};
			var textureLoader = new THREE.TextureLoader( manager );
			var texture = textureLoader.load( 'textures/UV_Grid_Sm.jpg' );
			// model
			var onProgress = function ( xhr ) {
				if ( xhr.lengthComputable ) {
					var percentComplete = xhr.loaded / xhr.total * 100;
					console.log( Math.round(percentComplete, 2) + '% downloaded' );
				}
			};
			var onError = function ( xhr ) {
			};
			var loader = new THREE.OBJLoader( manager );
			loader.load( 'js/note.obj', function ( object ) {
				object.traverse( function ( child ) {
					if ( child instanceof THREE.Mesh ) {
						child.material.map = texture;
					}
				} );
				object.position.y = - 10;
				scene.add( object );
			}, onProgress, onError );
			//
			renderer = new THREE.WebGLRenderer();
			renderer.setPixelRatio( window.devicePixelRatio );
			renderer.setSize( window.innerWidth, window.innerHeight );
			container.appendChild( renderer.domElement );
			document.addEventListener( 'mousemove', onDocumentMouseMove, false );
			//
			window.addEventListener( 'resize', onWindowResize, false );
		}
		function onWindowResize() {
			windowHalfX = window.innerWidth / 2;
			windowHalfY = window.innerHeight / 2;
			camera.aspect = window.innerWidth / window.innerHeight;
			camera.updateProjectionMatrix();
			renderer.setSize( window.innerWidth, window.innerHeight );
		}
		function onDocumentMouseMove( event ) {
			mouseX = ( event.clientX - windowHalfX ) / 2;
			mouseY = ( event.clientY - windowHalfY ) / 2;
		}
		//
		function animate() {
			requestAnimationFrame( animate );
			render();
		}
		function render() {
			camera.position.x += ( mouseX - camera.position.x ) * .05;
			camera.position.y += ( - mouseY - camera.position.y ) * .05;
			camera.lookAt( scene.position );
			renderer.render( scene, camera );
		}
	</script>

Thanks!

Live demo with a different model: https://jsfiddle.net/f2Lommf5/8358/

If I replace the OBJ with the original model of the repo, everything works fine. So there has to be a problem with your note.obj. Please share the file in this thread.

1 Like

note.obj (9.2 KB)

Your OBJ file renders fine. Just remove in your code object.position.y = - 10; and add object.rotation.x = - Math.PI * 0.5; instead. You should see the model in front of the camera. The texture is not displayed since the model has no uv coordinates.

image

1 Like

Ok, I display it with Firefox and not with Chrome.
Would there be a way to enlarge the design?
Thank you

Do you mean scaling the model? Try e.g. object.scale.set( 2, 2, 2 );.

1 Like

Nothing changes and not display with Chrome

Hello, I solved the problem of size but I display the drawing only on Firefox?
How I solve.
Thanks again

Please provide a live example that with your current progress. Otherwise it will be hard to help you further.

1 Like
note.obj body { margin: 0; }
<script src="https://threejs.org/build/three.js"></script>
<script src="https://threejs.org/examples/js/loaders/OBJLoader.js"></script>

<script>
var container;
var camera, scene, renderer;
var mouseX = 0, mouseY = 0;
var windowHalfX = window.innerWidth / 2;
var windowHalfY = window.innerHeight / 2;
init();
animate();
function init() {
	container = document.createElement('div');
	document.body.appendChild(container);
	camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 2000);
	camera.position.z = 250;
	// scene
	scene = new THREE.Scene();
	var ambientLight = new THREE.AmbientLight(0xcccccc, 0.4);
	scene.add(ambientLight);
	var pointLight = new THREE.PointLight(0xffffff, 0.8);
	camera.add(pointLight);
	scene.add(camera);
	// texture
	var manager = new THREE.LoadingManager();
	manager.onProgress = function (item, loaded, total) {
		console.log(item, loaded, total);
	};
	var textureLoader = new THREE.TextureLoader(manager);
	var texture = textureLoader.load('https://threejs.org/examples/textures/UV_Grid_Sm.jpg');
	// model
	var onProgress = function (xhr) {
		if (xhr.lengthComputable) {
			var percentComplete = xhr.loaded / xhr.total * 100;
			console.log(Math.round(percentComplete, 2) + '% downloaded');
		}
	};
	var onError = function (xhr) {
	};
	var loader = new THREE.OBJLoader(manager);
	loader.load('js/note.obj', function (object) {
		object.traverse(function (child) {
			if (child instanceof THREE.Mesh) {
				child.material.map = texture;
			}
		});
		object.position.y = - Math.PI * 0.5;
		object.scale.set( 20, 20, 20 ); 
		scene.add(object);
	}, onProgress, onError);
	//
	renderer = new THREE.WebGLRenderer();
	renderer.setPixelRatio(window.devicePixelRatio);
	renderer.setSize(window.innerWidth, window.innerHeight);
	container.appendChild(renderer.domElement);
	document.addEventListener('mousemove', onDocumentMouseMove, false); 
	//
	window.addEventListener('resize', onWindowResize, false);
}
function onWindowResize() {
	windowHalfX = window.innerWidth / 2;
	windowHalfY = window.innerHeight / 2;
	camera.aspect = window.innerWidth / window.innerHeight;
	camera.updateProjectionMatrix();
	renderer.setSize(window.innerWidth, window.innerHeight);
}
function onDocumentMouseMove(event) {
	mouseX = (event.clientX - windowHalfX) / 2;
	mouseY = (event.clientY - windowHalfY) / 2;
}
//
function animate() {
	requestAnimationFrame(animate);
	render();
}
function render() {
	camera.position.x += (mouseX - camera.position.x) * 0.05;
	camera.position.y += (- mouseY - camera.position.y) * 0.05;
	camera.lookAt(scene.position);
	renderer.render(scene, camera);
}

</script>

Message conslole chrome:
three.js:31844 Failed to load file:///C:/Users/anton/Desktop/progetto-threejs/js/note.obj: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.

Please read: https://threejs.org/docs/index.html#manual/introduction/How-to-run-things-locally

2 Likes