three.js 加载obj+mtl时,添加点击事件,自适应页面大小

HTML部分:

<!DOCTYPE html>
<html>
<head>
	<meta charset="gb2312">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <meta http-equiv="Pragma" content="no-cache">
    <meta http-equiv="expires" content="Wed, 23 Aug 2006 12:40:27 UTC" />
    <title>three.js测试点击事件</title>
    
    <script src="js/jquery-2.0.3.min.js"></script>
    <script src="js/three.js"></script>
    <script src="js/OBJLoader.js"></script>
    <script src="js/MTLLoader.js"></script>
    <script src="js/OrbitControls.js"></script> 
    <script src="js/stats.min.js"></script>
    <script src="js/TrackballControls.js" ></script>
    <!--#include Virtual="/Func/Common.asp" -->
    
    <link rel="stylesheet" href="css/three/testThree.css">
</head>
<body onload="OnLoad()">

    <div id="WebGL-output"></div>

    <div class="dataBox">
        <!-- 右侧空调1 -->
        <section class="ac-right-01">
            <h3>空调</h3>
            <span class="ac-right-01-close" onclick="ACClsoe()">X</span>
            <ul class="ac-right-01-content">
                <li>
                    <button id="kaiji" onclick="ACOpen()">开机</button>
                    <button id="guanji" onclick="ACOff()">关机</button>
                </li>
                
                <li><span>温度设定</span><span id="wdset"></span></li>
                <li><span>湿度设定</span><span id="sdset"></span></li>
                <li><span>回风温度</span><span id="hfwd"></span></li>
                <li><span>回风湿度</span><span id="hfsd"></span></li>
                <li><span>加热状态</span><span id="jrzt"></span></li>
                <li><span>制冷状态</span><span id="zlzt"></span></li>
                <li><span>加湿状态</span><span id="jszt"></span></li>
                <li><span>除湿状态</span><span id="cszt"></span></li>
            </ul>
            
        </section>
        <button onclick="test()" style="position: fixed; top: 10vh; right: 2vw;">test</button>


    </div>

    <script src="js/three/logic/logic.1.js"></script>
    <script src="js/testThree.js"></script>
</body>
</html>
 

js部分:



    // 1、
    var renderer;
    function initRender () {
        renderer = new THREE.WebGLRenderer();           //渲染器构建
        renderer.setClearColor('#6A993E');			        // 背景色	// renderer.setClearColor(0xEEEEEE);
        renderer.setSize(window.innerWidth , window.innerHeight);
    }
    

    // 2、
    var camera;

    function initCamera () {
        camera = new THREE.PerspectiveCamera(45,window.innerWidth/window.innerHeight,0.1,1000);		//相机构建
        camera.position.x = -30;		//渲染视图视角
        camera.position.y = 20;
        camera.position.z = 30;
    }
    


    // 3、
    var scene;
    var axes;
    function initScene () {
        scene = new THREE.Scene();		        //场景构建
        axes = new THREE.AxisHelper(20);		//构建一个坐标轴
        scene.add(axes);
    }
    


    // 4、
    //添加材质灯光阴影  -- 必要
    var spotLight;
    var light;
    function initLight () {
        spotLight = new THREE.SpotLight('#FFFFFF');     // 聚光灯  可以不要
        spotLight.position.set(-20,20,10);
        spotLight.castShadow = true;
        scene.add(spotLight);

        light = new THREE.AmbientLight(0xffffff, .3);   // 环境光源颜色
        light.position.set(30, 30, 0);//光源位置
        scene.add(light);//光源添加到场景中

        camera.lookAt(scene.position)
    }


    // 5、设置物体object
    //创建控件并绑定在相机上
    function initControls () {
        trackballControls = new THREE.TrackballControls(camera);
        trackballControls.rotateSpeed = 1.0;
        trackballControls.zoomSpeed = 1.0;
        trackballControls.panSpeed = 1.0;
        trackballControls.noZoom = false;
        trackballControls.noPan = false;
        trackballControls.staticMoving = true;
        trackballControls.dynamicDampingFactor = 0.3;
    }
    



    // model
    var mtlLoader;
    var objLoader;
    var Obj;
    function initModel () {
        var onProgress = function(xhr) {
            if (xhr.lengthComputable) {
                var percentComplete = xhr.loaded / xhr.total * 100;
            }
        };
        var onError = function(xhr) {
            // console.log(xhr)
        };
    
        mtlLoader = new THREE.MTLLoader();					// 模型1
        // mtlLoader.setBaseUrl('news/');					    // obj mtl文件的路径 objLoader.setMaterials( materials )
        mtlLoader.setPath('model/');							// obj mtl文件的目录
        mtlLoader.load('test02.mtl', function(materials) {
            materials.preload();
            objLoader = new THREE.OBJLoader();
            objLoader.setMaterials(materials);
            objLoader.setPath('model/');
            objLoader.load('test02.obj', function(object) {
                object.position.x = 0;
                object.position.y = -25;
                object.position.z = -10;
                // object.rotation.y = 0;
                object.scale.set(.15, .15, .15);		        // 长 高 宽 比例
                Obj = object;
                scene.add(object);
            }, onProgress, onError);
        });
    }
    


    var raycaster;
    var mouse;

    function onMouseClick( event ) {

        raycaster = new THREE.Raycaster();
        mouse = new THREE.Vector2();

        //通过鼠标点击的位置计算出raycaster所需要的点的位置,以屏幕中心为原点,值的范围为-1到1.

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

        // 通过鼠标点的位置和当前相机的矩阵计算出raycaster
        raycaster.setFromCamera( mouse, camera );

        // 获取raycaster直线和所有模型相交的数组集合
        var intersects = raycaster.intersectObjects( scene.children, true );

        // console.log(intersects);
        console.log(intersects[ 0 ].object.name);
        let Mname = intersects[ 0 ].object.name;
        if (Mname == 'Mesh87 ___23_2 Model') {          // 右侧控制室的空调
            $(".ac-right-01").show();
        }

        //将所有的相交的模型的颜色设置为红色,如果只需要将第一个触发事件,那就数组的第一个模型改变颜色即可
        for ( var i = 0; i < intersects.length; i++ ) {

            // console.log(intersects[ i ]);
            // intersects[ i ].object.material.color.set( 0xff0000 );
            // intersects[ 0 ].object.material.color.set( 0xff0000 );
            
            // console.log(intersects[ 0 ].object.name)
            console.log(intersects[ 0 ].object.uuid)
            // console.log(intersects[ 0 ].object)
            

        }

    }

   
    function renderScene(){
        var clock = new THREE.Clock();
        var delta = clock.getDelta();
        trackballControls.update(delta);
        requestAnimationFrame(renderScene);
        renderer.render(scene,camera);
    }

    // 
    function OnLoad() {
        initRender();
        initCamera();
        initScene();
        initLight();
        initControls();
        initModel();
        window.addEventListener( 'dblclick', onMouseClick, false );
        document.getElementById("WebGL-output").appendChild(renderer.domElement);
        renderScene();
    }

window.onresize = function () {
    SCREEN_WIDTH = window.innerWidth;
    SCREEN_HEIGHT = window.innerHeight;
    renderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
    camera.aspect = SCREEN_WIDTH / SCREEN_HEIGHT;
    camera.updateProjectionMatrix();
    cameraCube.aspect = SCREEN_WIDTH / SCREEN_HEIGHT;
    cameraCube.updateProjectionMatrix();
}

猜你喜欢

转载自blog.csdn.net/joyvonlee/article/details/85324194