Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Picking selected mesh from an OBJ file #2052

Closed
jiebaoer opened this issue Jun 12, 2012 · 3 comments
Closed

Picking selected mesh from an OBJ file #2052

jiebaoer opened this issue Jun 12, 2012 · 3 comments

Comments

@jiebaoer
Copy link

Hi,

I'm using the OBJLoader to load a large 3D model (described in a .obj file) but it loads the whole file as a single Object3D object. Using scene.add(object) it adds the whole object to the scene.

I need to pick the selected mesh and change some of its properties, but when I add mouse function and use Ray.intersectObjects try to get the selected mesh it never works. I can not find where I made mistakes.

Would love some help with trying to get this working. Thanks!

loader.load( "obj/male02/male02.obj", function ( object ) {

    for ( var i = 0, l = object.children.length; i < l; i ++ ) {

        object.children[ i ].material.map = texture;

    }

    object.position.y = - 80;
    object.position.z = - 160;
    scene.add( object );
    objects.push( object );

} );
function onDocumentMouseDown( event ) {

    event.preventDefault();

    // find intersections
    _mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
    _mouse.y = - (event.clientY / window.innerHeight) * 2 + 1;

    var vector = new THREE.Vector3( _mouse.x, _mouse.y, 1 );
    _projector.unprojectVector( vector, camera );

    var ray = new THREE.Ray( camera.position, vector.subSelf(camera.position ).normalize() );

    var intersects = ray.intersectObjects( scene.children );

    if ( intersects.length > 0 ) {
            alert("selected!");
            _SELECTED_DOWN = true;

    }   

}
@ColasMarko
Copy link
Contributor

Try this:

function onDocumentMouseDown( event ) {

    event.preventDefault();
    _mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
    _mouse.y = - (event.clientY / window.innerHeight) * 2 + 1;

    var vector = new THREE.Vector3( _mouse.x, _mouse.y, 1 );

    var ray = _projector.pickingRay( vector, camera );

    var intersects = ray.intersectObjects( scene.children );

    if ( intersects.length > 0 ) {
            alert("selected!");
            _SELECTED_DOWN = true;
    }    
}   

@jiebaoer
Copy link
Author

Thank you for your sulotion. But I tried and it did not work. It confused me for couples of days. The following is all my code:

<!doctype html>
<html lang="en">
    <head>
        <title>three.js webgl - loaders - OBJ loader</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: #fff;
                margin: 0px;
                overflow: hidden;
            }
            #info {
                color: #fff;
                position: absolute;
                top: 10px;
                width: 100%;
                text-align: center;
                z-index: 100;
                display:block;
            }
            #info a, .button { color: #f00; font-weight: bold; text-decoration: underline; cursor: pointer }
        </style>
    </head>

    <body>
        <div id="info">
        <a href="http://github.com/mrdoob/three.js" target="_blank">three.js</a> - OBJLoader test
        </div>

        <script src="../build/Three.js"></script>
        <script src="js/loaders/OBJLoader.js"></script>

        <script src="js/Detector.js"></script>
        <script src="js/Stats.js"></script>

        <script>

            var container, stats;

            var camera, scene, renderer;

            var mouseX = 0, mouseY = 0;

            var windowHalfX = window.innerWidth / 2;
            var windowHalfY = window.innerHeight / 2;

            var _mouse = { x: 0, y: 0 },
                objects = [],
                _projector = new THREE.Projector();


            init();
            animate();


            function init() {

                container = document.createElement( 'div' );
                document.body.appendChild( container );

                scene = new THREE.Scene();

                camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 2000 );
                camera.position.z = 100;
                scene.add( camera );

                var ambient = new THREE.AmbientLight( 0x101030 );
                scene.add( ambient );

                var directionalLight = new THREE.DirectionalLight( 0xffeedd );
                directionalLight.position.set( 0, 0, 1 ).normalize();
                scene.add( directionalLight );

                var texture = THREE.ImageUtils.loadTexture( 'textures/ash_uvgrid01.jpg' );

                var loader = new THREE.OBJLoader();
                loader.load( "obj/male02/male02.obj", function ( object ) {

                    for ( var i = 0, l = object.children.length; i < l; i ++ ) {

                        object.children[ i ].material.map = texture;

                    }

                    object.position.y = - 80;
                    object.position.z = - 160;
                    scene.add( object );
                    objects.push( object );

                } );

                // RENDERER

                renderer = new THREE.WebGLRenderer();
                renderer.setSize( window.innerWidth, window.innerHeight );
                container.appendChild( renderer.domElement );

                document.addEventListener( 'mousedown', onDocumentMouseDown, false );

            }

            function onDocumentMouseDown( event ) {

                event.preventDefault();

                // find intersections
                _mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
                _mouse.y = - (event.clientY / window.innerHeight) * 2 + 1;

                var vector = new THREE.Vector3( _mouse.x, _mouse.y, 1 );

                var ray = _projector.pickingRay( vector, camera );

                var intersects = ray.intersectObjects( scene.children );

                if ( intersects.length > 0 ) {
                        alert("selected!");
                        _SELECTED_DOWN = true;
                }   
            }

            function animate() {

                requestAnimationFrame( animate );
                render();

            }

            function render() {

                renderer.render( scene, camera );

            }

        </script>

    </body>
</html>

@mrdoob
Copy link
Owner

mrdoob commented Jun 12, 2012

#1979

@mrdoob mrdoob closed this as completed Jun 12, 2012
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants