zoukankan      html  css  js  c++  java
  • THREE.JS(如何想场景中添加物体对象)

    这篇主要实现向模型对象中添加头像,并组成一个矩形

    一、three.js是什么?

    上篇说了点TWEEN这篇又来一根THREE是不是两兄弟啊?还真有点像,当想要做3D动画的时候,可能会考虑用TWEEN的动画函数。

    其实THREE.JS就是实现3D效果的WEBGL的模型库。内容涵盖量大,目前的技术博文较少,要领会其中部分API需要一点功夫啊。

    二、如何建立一个3D模型呢?

    先来一个HTML代码。看看我们需要哪些东西

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Demo</title>
        <style>
            html,body{
                width: 100%;
                height: 100%;
                background: #000;
            }
            a {
                color: #8888ff;
            }
            #info {
                position: absolute;
                width: 100%;
                color: #000000;
                padding: 5px;
                font-family: Monospace;
                font-size: 13px;
                font-weight: bold;
                text-align: center;
                z-index: 1;
            }
            .element {
                width: 100px;
                height: 100px;
                box-shadow: 0px 0px 12px rgba(0,255,255,0.5);
                border: 1px solid rgba(127,255,255,0.25);
                text-align: center;
                cursor: default;
                border-radius: 50%;
                overflow: hidden;
            }
    
            .element2:hover {
                box-shadow: 0px 0px 12px rgba(0,255,255,0.75);
                border: 1px solid rgba(127,255,255,0.75);
            }
    
            .element .number {
                position: absolute;
                top: 20px;
                right: 20px;
                font-size: 12px;
                color: rgba(127,255,255,0.75);
                display: none;
            }
    
            .element .symbol {
                position: absolute;
                top: 0;
                left: 0px;
                right: 0px;
                width: 100%;
                height: 100%;
            }
    
            .element .details {
                position: absolute;
                bottom: 10px;
                left: 0px;
                right: 0px;
                font-size: 12px;
                color: rgba(127,255,255,0.75);
                height:15px;
                line-height:15px;
                font-size: 12px;
                font-weight: bold;
                color: rgba(255,255,255,0.75);
                text-shadow: 0 0 10px rgba(0,255,255,0.95);
                overflow: hidden;
                display: none;
            }
            #container img{
                border-radius: 0!important;
            }
            #animation{
                -webkit-animation:rollOut .5s .2s ease both;
                -moz-animation:rollOut .5s .2s ease both;
            }
            @-webkit-keyframes rollOut{
                0%{
                    opacity:1;
                    -webkit-transform:translateX(0px) rotate(0deg);
                    left: 0px;
                    top:0px;
                    width: 200px;
                }
    
                100%{
                    opacity:0;
                    -webkit-transform:translateX(100%) rotate(240deg);
                    left:800px;
                    top:500px;
                    width: 0px;
                }
            }
            @-moz-keyframes rollOut{
                0%{
                    opacity:1;
                    -moz-transform:translateX(0px) rotate(0deg);
                    left: 0px;
                    top:0px;
                    width: 200px;
                }
                100%{
                    opacity:0;
                    -moz-transform:translateX(100%) rotate(120deg);
                    left:1400px;
                    top:500px;
                    width: 0px;
                }
            }
        </style>
    </head>
    <body>
        <div id="container"></div> </body> <script src="js/jquery-1.12.4.js"></script> <script src="js/three.js"></script> <script src="js/CSS3DRenderer.js"></script> <script src="js/tween.min.js"></script> <script src="js/TrackballControls.js"></script> <script src="js/demo.js"></script> </html>

    从上面看到主要引进了three.js。CSS3DRenderer.js(css3模型渲染器)。TrackballControls.js(可以理解为场景控制器吧); tween.min.js 这篇就不说了。也用不上。

    var demoConfig = {
        'fakeNum': 500,       //500张头像图片
        'fakeUserImgTpl': "head/pic_#id#.jpg", //图片路径
        'fakeUserTpl': {     //对每个图片的描述
            "id": "#id#",
            "cont": "爽歪歪",
            "name": "3D模型",
            "img": "#img#"
        }
    };
    var camera,scene,renderer,contols,obj;
    //相机, 场景, 渲染器, 控制器, 物体对象。
    var fakeUserArr = (function () {
        var arr = [], picNum = demoConfig['fakeNum'];
        var fakeUserTpl = demoConfig['fakeUserTpl'], fakeUserImgTpl = demoConfig['fakeUserImgTpl'];
        for (var i = 0; i < picNum; i++) {
            var userId = (i + 1), img = fakeUserImgTpl.replace(/#id#/gi, (i + 1));
            userId = 'fake' + userId;
            var fakeUser = $.extend({}, fakeUserTpl, {"id": userId, "img": img});
            arr.push(fakeUser);
        }
        return arr;
    })();
    var appendImg = function(userJson,i){
        var image = document.createElement('img');
        var element = document.createElement('div');
        var objId = 'user_' + userJson['id'];
        element.setAttribute("id", objId);
        element.className = 'element fakeuser';
    
        element.style.backgroundColor = 'rgba(0,127,127,' + ( Math.random() * 0.5 + 0.25 ) + ')';
    
        image.className = 'symbol';
        element.appendChild(image);
        image.src = userJson['img'];
    
        // var object = new THREE.CSS3DSprite( element );//头像正对镜头
        var object = new THREE.CSS3DObject(element);//头像平贴平面
        object.objId = objId;
    
        object.position.x = Math.random() * 3000 - 2000; //随机位置
        object.position.y = Math.random() * 3000 - 2000;
        object.position.z = Math.random() * 3000 - 2000;
        obj.add(object);
    }
    var width = window.innerWidth,height = window.innerHeight,doc = document;
    var init = function () {
        //创建相机
        camera = new THREE.PerspectiveCamera(75, width / height, 1, 5000);
        camera.position.z = 2500;  //相机的位置
        //参数啥意思呢?
        //设置透视投影的相机,默认情况下相机的上方向为Y轴,右方向为X轴,
        // 沿着Z轴朝里(视野角:fov 纵横比:aspect 相机离视体积最近的距离:near 相机离视体积最远的距离:far)
    
        scene = new THREE.Scene();//创建场景
        obj = new THREE.Object3D(); //物体对象
        scene.add(obj);  //把物体放置到场景中
    
        for(var i = 0,l = fakeUserArr.length; i < l; i++ ){
            appendImg(fakeUserArr[i],i);
        }
    
        //创建渲染器
        renderer = new THREE.CSS3DRenderer();
        renderer.setSize(width,height); //设置尺寸
        renderer.domElement.style.position = 'absolute'; //渲染器的style
        doc.getElementById('container').appendChild(renderer.domElement); //把渲染器添加到场景中
    
    
        //创建场景控制器
        contols = new THREE.TrackballControls(camera,renderer.domElement);
        contols.rotateSpeed = 0.5;  //旋转速度
        contols.minDistance = 500;   //滚动滚动时的缩放距离 最大
        contols.maxDistance = 10000; // 最小
    
        renderer.render(scene,camera);  //把物体对象添加到渲染器中
    };
    
    init();

    这样就把头像点放到渲染器里面去了。那怎么拼成各种图形呢?

    三、如何把像素点拼成各种图形?

    1.矩形。

    其实我们仔细想如何才能把头像拼成矩形呢?我们可以把一个矩形先画出来,再取像素点,把位置头像放到对应位置不就行了吗?写个方法把坐标点保存下来。

    table = function (i) {
        var x = i / 18;
        var y = i % 18;
        var object = new THREE.Object3D();
        object.position.x = ( x * 140 ) - 1330;
        object.position.y = -( y * 180 ) + 1100;
        return object;
    }

    完整代码:

    /**
     * Created by Administrator on 2017/6/13.
     */
    var demoConfig = {
        'fakeNum': 500,       //500张头像图片
        'fakeUserImgTpl': "head/pic_#id#.jpg", //图片路径
        'fakeUserTpl': {     //对每个图片的描述
            "id": "#id#",
            "cont": "爽歪歪",
            "name": "3D模型",
            "img": "#img#"
        }
    };
    var camera,scene,renderer,contols,obj;
    //相机, 场景, 渲染器, 控制器, 物体对象。
    var fakeUserArr = (function () {
        var arr = [], picNum = demoConfig['fakeNum'];
        var fakeUserTpl = demoConfig['fakeUserTpl'], fakeUserImgTpl = demoConfig['fakeUserImgTpl'];
        for (var i = 0; i < picNum; i++) {
            var userId = (i + 1), img = fakeUserImgTpl.replace(/#id#/gi, (i + 1));
            userId = 'fake' + userId;
            var fakeUser = $.extend({}, fakeUserTpl, {"id": userId, "img": img});
            arr.push(fakeUser);
        }
        return arr;
    })();
    var appendImg = function(userJson,i){
        var image = document.createElement('img');
        var element = document.createElement('div');
        var objId = 'user_' + userJson['id'];
        element.setAttribute("id", objId);
        element.className = 'element fakeuser';
    
        element.style.backgroundColor = 'rgba(0,127,127,' + ( Math.random() * 0.5 + 0.25 ) + ')';
    
        image.className = 'symbol';
        element.appendChild(image);
        image.src = userJson['img'];
    
        // var object = new THREE.CSS3DSprite( element );//头像正对镜头
        var object = new THREE.CSS3DObject(element);//头像平贴平面
        object.objId = objId;
    
        object.position.x = tableArr[i].position.x; //随机位置
        object.position.y = tableArr[i].position.y;
        object.position.z = tableArr[i].position.z;
        obj.add(object);
    }
    table = function (i) {
        var x = i / 18;
        var y = i % 18;
        var object = new THREE.Object3D();
        object.position.x = ( x * 140 ) - 1330;
        object.position.y = -( y * 180 ) + 1100;
        return object;
    }
    var width = window.innerWidth,height = window.innerHeight,doc = document,tableArr = [];
    
    for(var i = 0 ; i < 500; i++){
        tableArr.push(table(i));
    }
    var init = function () {
        //创建相机
        camera = new THREE.PerspectiveCamera(75, width / height, 1, 5000);
        camera.position.z = 2500;  //相机的位置
        //参数啥意思呢?
        //设置透视投影的相机,默认情况下相机的上方向为Y轴,右方向为X轴,
        // 沿着Z轴朝里(视野角:fov 纵横比:aspect 相机离视体积最近的距离:near 相机离视体积最远的距离:far)
    
        scene = new THREE.Scene();//创建场景
        obj = new THREE.Object3D(); //物体对象
        scene.add(obj);  //把物体放置到场景中
    
        for(var i = 0,l = fakeUserArr.length; i < l; i++ ){
            appendImg(fakeUserArr[i],i);
        }
    
        //创建渲染器
        renderer = new THREE.CSS3DRenderer();
        renderer.setSize(width,height); //设置尺寸
        renderer.domElement.style.position = 'absolute'; //渲染器的style
        doc.getElementById('container').appendChild(renderer.domElement); //把渲染器添加到场景中
    
    
        //创建场景控制器
        contols = new THREE.TrackballControls(camera,renderer.domElement);
        contols.rotateSpeed = 0.5;  //旋转速度
        contols.minDistance = 500;   //滚动滚动时的缩放距离 最大
        contols.maxDistance = 10000; // 最小
    
        renderer.render(scene,camera);  //把物体对象添加到渲染器中
    };
    
    init();

    好,本篇到此为止。主要是讲如何把像素点渲染到场景中去,下面几篇会结合TWEEN讲述动画,以及如何生成定制LOGO。如何让每个头像动起来,并且停在相应的位置。

    四、结束篇。

    每天学习一点,坚持做同一样事情,离老菜鸟就不远了。还是那句话, 当一个东西要入门的话,一定要敲,要写demo,去推演,不然你永远不知道

    哪些地方埋有炸弹。

  • 相关阅读:
    js模版引擎handlebars.js实用教程——由于if功力不足引出的Helper
    js模版引擎handlebars.js实用教程——if-判断的基本用法
    js模版引擎handlebars.js实用教程——with-终极this应用
    js模版引擎handlebars.js实用教程——with-进入到某个属性(进入到某个上下文环境)
    js模版引擎handlebars.js实用教程——each-循环中使用this
    mysql 索引及查询优化总结
    面试篇——mysql
    设计模式六大原则(5):迪米特法则
    BigInteger与BigDecimal
    Java基本类型占用字节数(或 bit数)
  • 原文地址:https://www.cnblogs.com/createGod/p/7004428.html
Copyright © 2011-2022 走看看