threejs-cookbook/03-camera/03.10-select-an-object-in-the-scene

<!DOCTYPE html>

<html>

<head>
    <title>03.10 - Selecting objects</title>
    <script type="text/javascript" src="../libs/three.js"></script>
    <script type="text/javascript" src="../libs/dat.gui.min.js"></script>
    <script type="text/javascript" src="../libs/Projector.js"></script>
    <style>
        body {
            /* set margin to 0 and overflow to hidden, to go fullscreen */
            margin: 0;
            overflow: hidden;
        }
    </style>
</head>
<body>

<div id="Stats-output">
</div>
<!-- Div which will hold the Output -->
<div id="WebGL-output">
</div>

<!-- Javascript code that runs our Three.js examples -->
<script type="text/javascript">

    var cube;
    var controls;
    var step = 0;
    var scalingStep = 0;
    var sphere;
    var cylinder;
    var renderer;
    var camera;
    var scene;

    // once everything is loaded, we run our Three.js stuff.
    function init() {


        // create a scene, that will hold all our elements such as objects, cameras and lights.
        scene = new THREE.Scene();

        // create a camera, which defines where we're looking at.
        camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);

        // create a render and set the size
        renderer = new THREE.WebGLRenderer();

        renderer.setClearColor(0xEEEEEE, 1.0);
        renderer.setSize(window.innerWidth, window.innerHeight);


        var projector = new THREE.Projector();
        document.addEventListener('mousedown', onDocumentMouseDown, false);
        // create the ground plane
        var planeGeometry = new THREE.PlaneGeometry(200, 200, 40, 40);
        var planeMaterial = new THREE.MeshLambertMaterial({color: 0xffffff});
        planeMaterial.map = THREE.ImageUtils.loadTexture("../assets/textures/camo_cloth_multicam_2048.jpg");

        var plane = new THREE.Mesh(planeGeometry, planeMaterial);


        // rotate and position the plane
        plane.rotation.x = -0.5 * Math.PI;
        plane.position.x = 15
        plane.position.y = 0
        plane.position.z = 0

        // add the plane to the scene
        scene.add(plane);

        // create a cube
        var cubeGeometry = new THREE.BoxGeometry(4, 4, 4);
        var cubeMaterial = new THREE.MeshPhongMaterial({color: 0xffffff});
        cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
        cubeMaterial.map = THREE.ImageUtils.loadTexture("../assets/textures/lava.png");

        // position the cube
        cube.position.x = -19;
        cube.position.y = 15;
        cube.position.z = 0;

        // add the cube to the scene
        scene.add(cube);

        var sphereGeometry = new THREE.SphereGeometry(4, 20, 20);
        var sphereMaterial = new THREE.MeshPhongMaterial({color: 0xffffff});
        sphereMaterial.map = THREE.ImageUtils.loadTexture("../assets/textures/wood_1-1024x1024.png");
        sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);

        // position the sphere
        sphere.position.x = 20;
        sphere.position.y = 0;
        sphere.position.z = 2;
        // add the sphere to the scene
        scene.add(sphere);

        var cylinderGeometry = new THREE.CylinderGeometry(2, 2, 20);
        var cylinderMaterial = new THREE.MeshPhongMaterial({color: 0xffffff});
        cylinderMaterial.map = THREE.ImageUtils.loadTexture("../assets/textures/marble.jpg");
        cylinder = new THREE.Mesh(cylinderGeometry, cylinderMaterial);

        cylinder.position.set(0, 0, 1);

        scene.add(cylinder);


        // position and point the camera to the center of the scene
        camera.position.x = -30;
        camera.position.y = 40;
        camera.position.z = 30;
        camera.lookAt(scene.position);

        // add subtle ambient lighting
        var ambientLight = new THREE.AmbientLight(0x0c0c0c);
        scene.add(ambientLight);

        // add spotlight for the shadows
        var spotLight = new THREE.SpotLight(0xffffff);
        spotLight.position.set(-40, 60, -10);

        scene.add(spotLight);

        // add the output of the renderer to the html element
        document.body.appendChild(renderer.domElement);

        // call the render function


        controls = new function () {
            this.rotationSpeed = 0.02;
            this.bouncingSpeed = 0.03;
            this.scalingSpeed = 0.03;
            this.showRay = false;
        }

        var gui = new dat.GUI();
        gui.add(controls, 'rotationSpeed', 0, 0.5);
        gui.add(controls, 'bouncingSpeed', 0, 0.5);
        gui.add(controls, 'scalingSpeed', 0, 0.5);
        gui.add(controls, 'showRay').onChange(function (e) {
            if (tube) scene.remove(tube)
        });

        render();
    }

    function render() {

        // rotate the cube around its axes
        cube.rotation.x += controls.rotationSpeed;
        cube.rotation.y += controls.rotationSpeed;
        cube.rotation.z += controls.rotationSpeed;

        // bounce the sphere up and down
        step += controls.bouncingSpeed;
        sphere.position.x = 20 + ( 10 * (Math.cos(step)));
        sphere.position.y = 2 + ( 10 * Math.abs(Math.sin(step)));

        // scale the cylinder

        scalingStep += controls.scalingSpeed;
        var scaleX = Math.abs(Math.sin(scalingStep / 4)) + 0.5;
        var scaleY = Math.abs(Math.cos(scalingStep / 5)) + 0.5;
        var scaleZ = Math.abs(Math.sin(scalingStep / 7)) + 0.5;
        cylinder.scale.set(scaleX, scaleY, scaleZ);

        // render using requestAnimationFrame
        renderer.render(scene, camera);
        requestAnimationFrame(render);

    }

    var projector = new THREE.Projector();
    var tube;

    function onDocumentMouseDown(event) {

        var vector = new THREE.Vector3(( event.clientX / window.innerWidth ) * 2 - 1, -( event.clientY / window.innerHeight ) * 2 + 1, 0.5);
        projector.unprojectVector(vector, camera);

        var raycaster = new THREE.Raycaster(camera.position, vector.sub(camera.position).normalize());

        var intersects = raycaster.intersectObjects([sphere, cylinder, cube]);

        if (intersects.length > 0) {
            intersects[0].object.material.transparent = true;

            if (intersects[0].object.material.opacity === 0.5) {
                intersects[0].object.material.opacity = 1;
            } else {
                intersects[0].object.material.opacity = 0.5;
            }


            var points = [];
            points.push(new THREE.Vector3(camera.position.x, camera.position.y - 0.2, camera.position.z));
            points.push(intersects[0].point);

            var mat = new THREE.MeshBasicMaterial({color: 0xff0000, transparent: true, opacity: 0.6});
            var tubeGeometry = new THREE.TubeGeometry(new THREE.SplineCurve3(points), 60, 0.001);

            if (tube) scene.remove(tube);

            if (controls.showRay) {
                tube = new THREE.Mesh(tubeGeometry, mat);
                scene.add(tube);
            }


        }
    }


    window.onload = init;

</script>
</body>
</html>

 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

[출처] https://github.com/josdirksen/threejs-cookbook/blob/master/03-camera/03.10-select-an-object-in-the-scene.html

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
34 JavaScript 강좌 | 배열(Array) > 선언하기 file 졸리운_곰 2017.05.31 294
33 JSON javascript 읽기 졸리운_곰 2017.05.31 525
32 HOW TO PUT TEXT BOXES IN AN HTML5 FORM file 졸리운_곰 2017.05.30 449
31 HTML div 왼쪽, 오른쪽 분할 졸리운_곰 2017.05.30 437
30 자바스크립트와 Node.js를 이용한 웹 크롤링 테크닉 file 졸리운_곰 2017.05.27 570
29 JSON - 자바스크립트 강좌 JS / CSE file 졸리운_곰 2017.05.06 499
28 Javascript JSON.parse(), JSON.stringify() 사용하는법 졸리운_곰 2017.05.06 492
27 JSON Text를 JSON Object로 변환하기 졸리운_곰 2017.05.06 475
26 Three.js로 AutoCad DXF 모델 출력 : Three-Dxf file 졸리운_곰 2017.04.27 912
25 three.js r84 다운로드 file 졸리운_곰 2017.04.15 393
24 jqPlot으로 그래프 그리기! file 졸리운_곰 2017.03.20 682
23 XPath 이야기 file 졸리운_곰 2017.03.20 591
22 HTML : 폼(form) 이해 file 졸리운_곰 2017.03.20 401
21 [JavaScript] 공백(빈공간) 문자 제거하기, 없애기, 정규표현식 사용 졸리운_곰 2017.01.22 522
20 폼(Form) 요소 #2 - LABEL, INPUT file 졸리운_곰 2017.01.22 467
19 [jQuery] Ajax의 흐름과 예제 졸리운_곰 2017.01.17 632
18 basic plot graph by javascript, 자바스크립트로 그래프그리기 초간단 졸리운_곰 2015.11.13 572
17 A Survey of the JavaScript Programming Language file 졸리운_곰 2015.11.12 665
16 SVG by HTML5 file 졸리운_곰 2015.11.12 463
15 JavaScript Canvas examples 졸리운_곰 2015.11.10 360
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED