zoukankan      html  css  js  c++  java
  • ThreeJs 导入外部三维模型,并实现鼠标滚动放大缩小旋转效果

    let i = 0;
    function init() {
        // create a scene, that will hold all our elements such as objects, cameras and lights.
        var scene = new THREE.Scene();
        // create a camera, which defines where we're looking at.
        var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
        var renderer = new THREE.WebGLRenderer();
        var axes = new THREE.AxesHelper(20);
        var controls = new THREE.TrackballControls(camera);     //创建场景旋转缩放事件
     
        camera.position.set(-30, 40, 30);
        camera.lookAt(scene.position);
     
        renderer.setClearColor(new THREE.Color(0xcccccc));  // 设置渲染面板颜色
        renderer.setSize(window.innerWidth, window.innerHeight);    // 设置渲染面板长宽
     
        // // show axes in the screen
        // 显示三维坐标轴
        scene.add(axes);
        
        controls = new THREE.TrackballControls(camera);     //创建场景旋转缩放事件
        controls.rotateSpeed = 2.5;
        controls.zoomSpeed = 1.2;
        controls.panSpeed = 0.8;
        controls.noZoom = false;
        controls.noPan = false;
        controls.staticMoving = true;
        controls.dynamicDampingFactor = 0.3;
        // create a render and set the size
        // 设置渲染面板属性
        
        
        // create the ground plane
        // var planeGeometry = new THREE.PlaneGeometry(60, 20);
        // var planeMaterial = new THREE.MeshBasicMaterial({
        //     color: 0xAAAAAA
        // });
        // var plane = new THREE.Mesh(planeGeometry, planeMaterial);
     
        // // rotate and position the plane
        // plane.rotation.x = -0.5 * Math.PI;
        // plane.position.set(15, 0, 0);
     
        // // add the plane to the scene
        // scene.add(plane);
     
        // create a cube
        
     
        // position the cube
        // cube.position.set(-4, 3, 0);
        // add the cube to the scene
        
     
        // create a sphere
        // var sphereGeometry = new THREE.SphereGeometry(4, 20, 20);
        // var sphereMaterial = new THREE.MeshBasicMaterial({
        //     color: 0x7777FF,
        //     wireframe: true
        // });
        // var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);
     
        // // position the sphere
        // sphere.position.set(20, 4, 2);
     
        // // add the sphere to the scene
        // scene.add(sphere);
     
        // position and point the camera to the center of the scene
     
        // add the output of the renderer to the html element
     
        // render the scene
        let addT = null;
        let redt = null;
        let timeAdd = null;
        let timeDel = null;
        let step = 1;
        let frequ = 100;
        // 数值增加到制定数字
        function add (dis) {
            clearInterval(timeDel);
            timeAdd = setInterval(() => {
                if (i < dis) {
                    i++;
                    intCub();
                } else {
                    clearInterval(timeAdd);
                    // del(0);
                }
                console.log(i);
            }, frequ);
        };
        // 数值减少到制定数字
        function del (dis) {
            clearInterval(timeAdd);
            timeDel = setInterval(() => {
                if (i > dis) {
                    i--;
                    intCub();
                } else {
                    val = dis;
                    clearInterval(timeDel);
                    add(50)
                }
                console.log(i);
            }, frequ);
        };
        
        function intCub () {
            let random = parseInt(1 + (4 - 1) * (Math.random()));   // 随机数用于正方体的长宽高
            let randomC = parseInt(1 + (2 - 1) * (Math.random()));  // 随机数用于球形的半径
            let colorRandomNum = parseInt(1 + (7 - 1) * (Math.random()));  // 随机数用于赋值后续的物体的材质颜色
            let randomColor = [0xF7CE18, 0x2550EC, 0x57E10C, 0xEB6F0A, 0xEB0AE9, 0x820745, 0x8D11D8];
     
            // 配置灯光
            let light = new THREE.AmbientLight(0x820745);
            light.position.set(100, 100, 200);
                    
            // 生成正方体
            var cubeGeometry = new THREE.BoxGeometry(random, random, random);   // 长宽高
            // 给正方体网格添加材质
            var cubeMaterial = new THREE.MeshBasicMaterial({
                color: randomColor[colorRandomNum],
                wireframe: false  // 是否显示网格状态
            });
            var cube = new THREE.Mesh(cubeGeometry, cubeMaterial);  // 将材质贴到模型上
     
            // 生成原型
            var sphereGeometry = new THREE.SphereGeometry(randomC, 200, 200);  // 半径和网格数,网格数表示球体的粗糙程度
            var sphereMaterial = new THREE.MeshBasicMaterial({
                color: randomColor[colorRandomNum],
                wireframe: false   // 是否显示网格状态
            });
            var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);  // 将材质贴到模型上
     
            // position the sphere
            // 设置球体的位置
            sphere.position.set(parseInt(-10 + (25 - 1) * (Math.random())), parseInt(-10 + (25 - 1) * (Math.random())), parseInt(-10 + (25 - 1) * (Math.random())));
            
            // 设置正方体的位置
            cube.position.set(parseInt(-10 + (25 - 1) * (Math.random())), parseInt(-10 + (25 - 1) * (Math.random())), parseInt(-10 + (25 - 1) * (Math.random())));
            // add the sphere to the scene
            // 将贴好材质的模型和灯光添加到场景
            scene.add(sphere);  
            scene.add(cube);
            scene.add(light);
            //声明raycaster和mouse变量
            var raycaster = new THREE.Raycaster();
            var mouse = new THREE.Vector2();
            // 绑定点击事件
            function onMouseClick( event ) {
                //通过鼠标点击的位置计算出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);
                console.log(intersects);
                //将所有的相交的模型的颜色设置为红色,如果只需要将第一个触发事件,那就数组的第一个模型改变颜色即可
                for ( var i = 0; i < intersects.length; i++ ) {
                    intersects[i].object.material.color.set(0x000000);
                    let msg = JSON.stringify(intersects[i]);
                    document.querySelector('.msg .content').innerHTML = msg;
                }
                // alert('我点击了对象,对象信息已经在控制台打印出来');
                renderer.render(scene, camera); // 渲染场景中的模型
            }
            // // window.removeEventListener('click', onMouseClick);
            // document.onmousedown = function(event) {
            //     document.onmousemove = function () {
            //         controls.update();
            //         renderer.render(scene, camera); // 渲染场景中的模型
            //     }
            // }
            // document.onmouseup = function(event) {
            //     document.onmousemove = null
            // }
            document.getElementById("webgl-output").appendChild(renderer.domElement);
            // 定时鼠标点击移动或者滚轮滚动的时候要触发渲染事件,画面是不会跟着放大缩小旋转
            setInterval(() => {
                controls.update();
                renderer.render(scene, camera); // 渲染场景中的模型
            }, 5);
            // renderer.render(scene, camera); // 渲染场景中的模型
     
            /**************加载模型************** */
            var loader = new THREE.OBJLoader();//在init函数中,创建loader变量,用于导入模型
            let i = 0.04;
            let step = 0.02;
            let v = 0;
            loader.load(
                // 资源链接
                'http://10.1.252.90:8080/src/chapter-01/models/man.obj',
                // 资源加载完成后的回调函数
                function (object) {
                    console.log(object);
                    object.position.set(0, 0, 0);
                    object.rotation.z = 3.1415927;  // 纠正导入
                    var ms = new THREE.MeshBasicMaterial({
                        color: 0xcccccc,
                        wireframe: true  // 是否显示网格状态
                    });
                    scene.add(object);
                    
                    renderer.render(scene, camera); // 渲染场景中的模型
                    window.addEventListener('click', onMouseClick, false);
                    // // var sphere = new THREE.Mesh(object, ms);  // 将材质贴到模型上
                    setInterval(() => {
                        i += step;
                        object.rotation.y = i;
                        scene.add(object);
                        // renderer.render(scene, camera); // 渲染场景中的模型
                    }, 10);
                }
            );
            /**************加载模型************** */
        };
        // 运行渲染
        add (10);
        intCub();
        
    }
    <!DOCTYPE html>
     
    <html>
     
    <head>
        <title>Example 01.02 - First Scene</title>
        <meta charset="UTF-8" />
        <script type="text/javascript" charset="UTF-8" src="../../libs/three/three.js"></script>
        <script type="text/javascript" charset="UTF-8" src="../../libs/three/loaders/OBJLoader.js"></script>
        <script type="text/javascript" charset="UTF-8" src="../../libs/three/controls/TrackballControls.js"></script>
        <script type="text/javascript" charset="UTF-8" src="../../libs/three/controls/DragControls.js"></script>
        
        <link rel="stylesheet" href="../../css/default.css">
        <style>
            #render{
                position: fixed;
                left: 20px;
                top: 30px;
                height: 40px;
                 120px;
            }
            .msg{
                position: absolute;
                left: 10px;
                top: 10px;
                height: 600px;
                min-height: 550px;
                overflow:scroll;
                 500px;
                background: #fff;
                border: 2px solid #eee;
            }
            h3{
                padding: 0;
                margin: 0;
                text-align: center;
            }
        </style>
    </head>
     
    <body>
     
        <!-- Div which will hold the Output -->
        <div id="webgl-output"></div>
        <div class="msg">
            <h3>鼠标点击的对象信息</h3>
            <div class="content"></div>
        </div>
        <script type="text/javascript" src="./js/01-02.js"></script>
        <!-- Javascript code that runs our Three.js examples -->
        <script type="text/javascript">
            (function () {
                // your page initialization code here
                // the DOM will be available here
                init();
            })();
        </script>
        
    </body>
     
    </html>
  • 相关阅读:
    tile38 复制配置
    The Guardian’s Migration from MongoDB to PostgreSQL on Amazon RDS
    tile38 一款开源的geo 数据库
    sqler sql 转rest api 的docker 镜像构建(续)使用源码编译
    sqler sql 转rest api javascript 试用
    sqler sql 转rest api redis 接口使用
    sqler sql 转rest api 的docker image
    sqler sql 转rest api 的工具试用
    apache geode 试用
    benthos v1 的一些新功能
  • 原文地址:https://www.cnblogs.com/smedas/p/12455378.html
Copyright © 2011-2022 走看看