常用代码

创建一个基本的threejs应用

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>路径相机</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
        <style>
            body {
            color: #000;
            font-family:Monospace;
            font-size:13px;
            text-align:center;
            font-weight: bold;

            background-color: #fff;
            margin: 0px;
            overflow: hidden;
            }

            #info {
                    color:#000;
            position: absolute;
            top: 0px; width: 100%;
            padding: 5px;

            }

            a { color: red; }

        </style>
    </head>

    <body>


        <!-- <script src="../js/three.js"></script> -->
        <script src=".././test/three/build/three.js"></script>

        <!-- <script src="../js/controls/PathControls.js"></script> -->

        <script src="../../js/Detector.js"></script>
        <script src="../../js/stats.js"></script>

        <script src="../../js/Tween.js"></script>
        <script src=".././test/js/OrbitControls.js"></script>
        <script>


                function initRenderer(){
                    renderer = new THREE.WebGLRenderer({antialias:true});
                    renderer.setSize( (window.innerWidth) , window.innerHeight );
                    renderer.setClearColor(0xffffff);
                    document.body.appendChild( renderer.domElement );
                }
                function initScene(){
                    scene = new THREE.Scene();
                }
                function initCamera(){
                    camera = new THREE.PerspectiveCamera( 45 , (window.innerWidth)/window.innerHeight , 1.0 , 10000 );
                    camera.position.set( 1200 , 1200 , 1200 );
                    camera.up.set( 0 , 1 , 0 );
                    camera.lookAt({x:0,y:0,z:0});
                }
                function initLight(){
                    light1 = new THREE.AmbientLight( 0xffffff );
                    scene.add( light1 );

                    light2 = new THREE.DirectionalLight( 0x002288 );
                    light2.position.set( 1200, 1200, 1200 );
                    scene.add( light2 );
                }
                function initControl(){
                    orbitControls = new THREE.OrbitControls(camera , renderer.domElement);

                }

                clock = new THREE.Clock();

                function render(){
                    TWEEN.update();
                    var delta = clock.getDelta();
                    orbitControls.update( delta );
                    renderer.clear();
                    renderer.render( scene , camera );
                    requestAnimationFrame( render );
                }

                initRenderer();
                initScene();
                initCamera();
                initLight();
                initControl();





                var pos = { x:1200 , y:1200 , z:1200 };
                var tween = new TWEEN.Tween(pos)
                    .to({
                        x: 800,
                        y: 800,
                        z: 800
                    }, 2000)
                    .easing(TWEEN.Easing.Linear.None)
                    .onUpdate(() => {
                        orbitControls.object.position.set(pos.x, pos.y, pos.z);  //设置相机的位置
                    });

                    var posTar = { x:0 , y:0 , z:0 };
                    var tween1 = new TWEEN.Tween(posTar)
                    .to({
                        x: 300,
                        y: 0,
                        z: 0
                    }, 2000)
                    .easing(TWEEN.Easing.Linear.None)
                    .onUpdate(() => {
                        console.log( posTar )
                        orbitControls.target.set( posTar.x , posTar.y , posTar.z );  //设置相机聚焦
                    });
                // tween.chain(tween1);   //tween动画走完,tween1再走
                tween.start();
                tween1.start();



                    document.onmousedown = function(){
                        // console.log( orbitControls )
                        orbitControls.object.up.set( 1 , 0 , 0 );  //设置相机聚焦
                        // orbitControls.target = new THREE.Vector3( 300 , 0 , 0 );
                        document.onmousemove = function(){

                        }
                    }
                    document.onmouseup = function(){
                        document.onmousemove = null ;
                    }





                function createPlane(){
                    var planeGeo = new THREE.PlaneGeometry( 900 , 600 );
                    var planeMat = new THREE.MeshLambertMaterial({ color:0x83296f , shading: THREE.FlatShading });
                    var plane = new THREE.Mesh( planeGeo , planeMat );
                    scene.add( plane );
                    return plane 
                };
                function createCube(){
                    var cubeGeo = new THREE.CubeGeometry( 50 , 50 , 100 );
                    var cubeMat = new THREE.MeshLambertMaterial({color:0x6856d6});
                    var cube = new THREE.Mesh( cubeGeo , cubeMat );
                    scene.add( cube );
                    return cube ;
                };

                var plane1 = createPlane();
                plane1.rotation.x = -90*Math.PI/180;

                for( var i=0 ; i< 8 ; i++ ){
                    var cube1 = createCube();
                    cube1.translateX( -400 + i*120 );
                }


                render();


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

鼠标拾取

//鼠标控制
            //参考资料: https://stackoverflow.com/questions/11036106/three-js-projector-and-ray-objects/23492823#23492823
var mouse3D = new THREE.Vector3( 
                     ( (event.clientX) / (window.innerWidth) ) * 2 - 1,   //x
                     -( event.clientY / window.innerHeight ) * 2 + 1,  //y
                     0.5 
              ); 
mouse3D.unproject(that.camera);
mouse3D.sub(that.camera.position);
mouse3D.normalize();

var raycaster = new THREE.Raycaster(that.camera.position, mouse3D);
var intersects = raycaster.intersectObjects( that.elements );
if ( intersects.length > 0 ) {
    //如果选中物体,就把本次选中的交给上次选中的
    that.selectItemInfo.oldItem = that.selectItemInfo.nowItem ;

    //如果上次选中的物体存在,那么就把上次选中的物体样式复原
    if(that.selectItemInfo.oldItem){
        that.selectItemInfo.oldItem.material.color = that.selectItemInfo.oldColor ;
        that.selectItemInfo.oldItem.material.transparent = true;
        that.selectItemInfo.oldItem.material.opacity = 0.4; ;
    } ;

    // 把选中的物体的第一个赋值给nowItem
    that.selectItemInfo.nowItem = intersects[0].object
    // 把选中的物体的第一个的样式缓存下来以备下一次复原使用
    that.selectItemInfo.oldColor = intersects[0].object.material.color ;
    // 改变选中物体的样式
    intersects[ 0 ].object.material = new THREE.MeshLambertMaterial({
        color: 'rgb(56,182,255)',
    });
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值