• 用threejs 实现3D物体在浏览器展示


    用threejs 实现3D物体在浏览器展示,通过鼠标平移,缩放,键盘箭头按钮左右移动等功能展示。

    <!DOCTYPE html>
    
    <html>
    <head>
    <meta charset=utf-8>
    <title>My first three.js app</title>
    <style>
    * { margin: 0; }
    canvas {  100%; height: 100%;}
    </style>
    </head>
    <body>
    </body>
    <script src="https://cdn.bootcss.com/three.js/91/three.js"></script>
    <script>
    var iswireframe = false;
    var scene , camera , renderer;
    var fov = 75, //拍摄距离  视野角值越大,场景中的物体越小
        near = 1,//相机离视体积最近的距离
            far = 1000;//相机离视体积最远的距离;
    var cameraX = 0, cameraY = 15, cameraZ = 8;
    var sceneX = 0, sceneZ = 0;
    document.body.style.cursor="move";
    function initFloor(){
    var floorGeometry = new THREE.BoxGeometry( 20, 0.01, 6);
    //var material = new THREE.MeshBasicMaterial( { color: "green", wireframe : iswireframe } );
    for ( var i = 0; i < floorGeometry.faces.length; i++ ) {
    floorGeometry.faces[ i ].color.set( 0xEEEED1 );
    }
    var material = new THREE.MeshBasicMaterial( { vertexColors: THREE.FaceColors, wireframe : iswireframe } );
    var floor = new THREE.Mesh( floorGeometry, material );
    scene.add( floor );
    }
    
    function initGrid(){ //辅助网格
    var helper = new THREE.GridHelper( 1000, 50 );
    //helper.setColors( 0x0000ff, 0x808080 );
    scene.add( helper );
    }
    
    
    function initBuild1(){
    var buildingGeometry1 = new THREE.BoxGeometry(2, 2, 3);
    for ( var i = 0; i < buildingGeometry1.faces.length; i++ ) {
    buildingGeometry1.faces[i].color.setHex( Math.random() * 0xffffff );
    }
    var  building1 = new THREE.Mesh(
    buildingGeometry1,
    new THREE.MeshBasicMaterial({vertexColors: THREE.FaceColors, wireframe : iswireframe})
    );
    building1.position.set(0, 1, 2);
    scene.add(building1);
    }
    
    function buildColor(geometry){
    for ( let i = 0; i < geometry.faces.length; i++ ) {
    geometry.faces[i].color.setHex( Math.random() * 0xffffff );
    }
    }
    
    function initWall(){
    let wallColor = 0xEBEBEB;
    let wallHeight = 1;
    let wallGeometryback = new THREE.BoxGeometry(20, wallHeight, 0.1);
    console.log(wallGeometryback.faces.length);
    //buildColor(wallGeometryback);
    let materialParamertes =  {color: wallColor, vertexColors: THREE.FaceColors, wireframe : iswireframe, opacity : 0.01};
    var  wallback = new THREE.Mesh(
    wallGeometryback,
    new THREE.MeshBasicMaterial(materialParamertes)
    );
    wallback.position.set(0, 0.5, -3);
    scene.add(wallback);
    
    let wallGeometryLeft = new THREE.BoxGeometry(0.1, wallHeight, 6);
    var  wallLeft = new THREE.Mesh(
    wallGeometryLeft,
    new THREE.MeshBasicMaterial(materialParamertes)
    );
    wallLeft.position.set(-10, 0.5, 0);
    scene.add(wallLeft);
    
    
    let wallGeometryRight = new THREE.BoxGeometry(0.1, wallHeight, 6);
    var  wallRight = new THREE.Mesh(
    wallGeometryRight,
    new THREE.MeshBasicMaterial(materialParamertes)
    );
    wallRight.position.set(10, 0.5, 0);
    scene.add(wallRight);
    /*
    let wallGeometryFront = new THREE.BoxGeometry(20, wallHeight, 0.1);
    var  wallFront = new THREE.Mesh(
    wallGeometryFront,
    new THREE.MeshBasicMaterial(materialParamertes)
    );
    wallFront.position.set(0, 0.5, 3);
    scene.add(wallFront);
    */
    }
    
    function onDocumentKeyDown(event){
            switch(event.keyCode){
                case 37: //
                    cameraX -= 1;
    sceneX -=1;
                    break;
                case 39: //
                    cameraX += 1;
    sceneX +=1;
                    break;
                case 38: ////fx -= 0.1;
                    cameraZ -= 1;
    sceneZ -= 1;
                    break;
                case 40: ////fx += 0.1;
                    cameraZ += 1;
    sceneZ += 1;
                    break;
                default:
                    break;
            }
    renderInit();
        }
    
    
    function onDocumentMouseWheel(event) {
       if (event.wheelDelta) {  //判断浏览器IE,谷歌滑轮事件
    if (event.wheelDelta > 0) { //当滑轮向上滚动时
    fov -= (near < fov ? 1 : 0);
    }
    if (event.wheelDelta < 0) { //当滑轮向下滚动时
    fov += (fov < far ? 1 : 0);
    }
    } else if (event.detail) {  //Firefox滑轮事件
    if (event.detail > 0) { //当滑轮向上滚动时
    fov += 1;
    }
    if (event.detail < 0) { //当滑轮向下滚动时
    fov -= 1;
    }
    }
    //改变fov值,并更新场景的渲染
    camera.fov = fov;
            renderInit();
        }
    
    
    function onDocumentMouseDown(event) {
            if (event.button != 0) return;
            event.preventDefault();
            document.addEventListener('mousemove', onDocumentMouseMove, false);
            document.addEventListener('mouseup', onDocumentMouseUp, false);
        }
    
    
        function onDocumentMouseMove(event) {
            var movementX = event.movementX || event.mozMovementX || event.webkitMovementX || 0;
            var movementY = event.movementY || event.mozMovementY || event.webkitMovementY || 0;
    //console.log("x="+movementX+"   y="+movementY);
    cameraX -= movementX * 0.01;
    sceneX -= movementX * 0.01;
    cameraZ -= movementY * 0.01;
    sceneZ -= movementY * 0.01;
    renderInit();
        }
    
    
        function onDocumentMouseUp(event) {
            document.removeEventListener('mousemove', onDocumentMouseMove);
            document.removeEventListener('mouseup', onDocumentMouseUp);
        }
    
    
    //场景初始化
    function sceneInit(){
    scene = new THREE.Scene();
    camera = new THREE.PerspectiveCamera( fov , window.innerWidth/window.innerHeight, near, far );
    //camera.position.set(0, 0, 7);
    //相机位置
    //cameraX = 0; cameraZ = 8;
    camera.up.x = 0;
    camera.up.y = 1; //相机朝向--相机上方为y轴
    camera.up.z = 0;
    
    renderer = new THREE.WebGLRenderer({antialias : true});
    renderer.setSize( window.innerWidth - 10, window.innerHeight -10 );
    renderer.setClearColor(0xFFFFFF, 1.0);
    document.body.appendChild( renderer.domElement );
    renderer.setClearColor(0xFFFFFF, 1.0);
    
    
    document.addEventListener('keydown',onDocumentKeyDown,false);
    document.addEventListener('mousewheel', onDocumentMouseWheel, false);//兼容ie chrome
    document.addEventListener('DOMMouseScroll', onDocumentMouseWheel, false);//兼容火狐
    document.addEventListener('mousedown', onDocumentMouseDown, false);
    initGrid();
    initFloor();
    initBuild1();
    initWall();
    }
    
    
    function renderInit(){
    camera.position.set(cameraX, cameraY, cameraZ);
    camera.lookAt(sceneX, 0, sceneZ);
    camera.updateProjectionMatrix();
    renderer.render(scene, camera);
    }
    
    
    sceneInit();
    renderInit();
    
    
    //动画
    function animate() {
            requestAnimationFrame( animate );
          //  stats.begin();
            initAll();
            //stats.end();
        }
    </script>
    </html>
  • 相关阅读:
    实现multibandblend
    如何获得物体的主要方向?
    基于PI+QT实现OpenCV图像处理操作(基本环境搭建)
    Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
    Docker 容器的 health 健康状态检查
    prometheus processexport进程监控
    k8s精髓之 ListWatch
    Linux nohup后台运行命令
    kubescheduler源码阅读
    用 Wireshark 分析 TCP 吞吐瓶颈
  • 原文地址:https://www.cnblogs.com/smedas/p/12433719.html
Copyright © 2020-2023  润新知