• THREE.JS 场景世界坐标和平面二维坐标互转


    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>场景世界坐标转</title>
        <style type="text/css">
            html, body {
                margin: 0;
                height: 100%;
            }

            canvas {
                display: block;
            }

            .title{
                position: absolute;
                padding: 10px;
                background: rgba(255, 255, 255, 0.5);
                line-height: 1;
                border-radius: 5px;
            }

        </style>
    </head>

    <body onload="draw();">

    <div class="title one">第一个盒子</div>
    <div class="title two">第二个盒子</div>
    <div class="title three">第三个盒子</div>

    </body>

    <script src="https://cdn.bootcss.com/three.js/91/three.min.js"></script>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <script src="/lib/js/controls/OrbitControls.js"></script>
    <script src="/lib/js/libs/stats.min.js"></script>
    <script src="https://cdn.bootcss.com/dat-gui/0.7.1/dat.gui.min.js"></script>
    <script src="/lib/js/Detector.js"></script>

    <script>
        var renderer, camera, scene, gui, light, stats, controls;
        var cube, cube2, cube3;

        function initRender() {
            renderer = new THREE.WebGLRenderer({antialias: true});
            renderer.setPixelRatio(window.devicePixelRatio);
            renderer.setSize(window.innerWidth, window.innerHeight);
            renderer.setClearColor(0xeeeeee);
            renderer.shadowMap.enabled = true;
            //告诉渲染器需要阴影效果
            document.body.appendChild(renderer.domElement);
        }

        function initCamera() {
            camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
            camera.position.set(0, 0, 15 );
        }

        function initScene() {
            //给场景添加天空盒子纹理
            var cubeTextureLoader = new THREE.CubeTextureLoader();
            cubeTextureLoader.setPath( '/lib/textures/cube/space/' );
            //六张图片分别是朝前的(posz)、朝后的(negz)、朝上的(posy)、朝下的(negy)、朝右的(posx)和朝左的(negx)。
            var cubeTexture = cubeTextureLoader.load( [
                'right.jpg', 'left.jpg',
                'top.jpg', 'bottom.jpg',
                'front.jpg', 'back.jpg'
            ] );

            scene = new THREE.Scene();

            scene.background = cubeTexture;
        }

        //初始化dat.GUI简化试验流程
        function initGui() {
            //声明一个保存需求修改的相关数据的对象
            gui = {
            };
            var datGui = new dat.GUI();
            //将设置属性添加到gui当中,gui.add(对象,属性,最小值,最大值)
        }

        function initLight() {
            scene.add(new THREE.AmbientLight(0x444444));

            light = new THREE.DirectionalLight(0xffffff);
            light.position.set(0, 20, 20 );

            light.castShadow = true;
            light.shadow.camera.top = 10;
            light.shadow.camera.bottom = -10;
            light.shadow.camera.left = -10;
            light.shadow.camera.right = 10;

            //告诉平行光需要开启阴影投射
            light.castShadow = true;

            scene.add(light);
        }

        function initModel() {

            //辅助工具
            var helper = new THREE.AxesHelper(50);
            scene.add(helper);

            var material = new THREE.MeshStandardMaterial({color:0x00ffff});

            //添加立方体
            var geometry = new THREE.BoxBufferGeometry( 1, 1, 1 );

            //添加第一个
            cube = new THREE.Mesh(geometry, material);
            scene.add(cube);

            //添加第二个
            cube2 = new THREE.Mesh(geometry, material);
            cube2.position.set(3, 3, -2);
            scene.add(cube2);

            //添加第三个
            cube3 = new THREE.Mesh(geometry, material);
            cube3.position.set(-3, 3, 2);
            scene.add(cube3);

        }

        //初始化性能插件
        function initStats() {
            stats = new Stats();
            document.body.appendChild(stats.dom);
        }

        function initControls() {

            controls = new THREE.OrbitControls(camera, renderer.domElement);
            //设置控制器的中心点
            //controls.target.set( 0, 5, 0 );
            // 如果使用animate方法时,将此函数删除
            //controls.addEventListener( 'change', render );
            // 使动画循环使用时阻尼或自转 意思是否有惯性
            controls.enableDamping = true;
            //动态阻尼系数 就是鼠标拖拽旋转灵敏度
            //controls.dampingFactor = 0.25;
            //是否可以缩放
            controls.enableZoom = true;
            //是否自动旋转
            controls.autoRotate = false;
            controls.autoRotateSpeed = 0.5;
            //设置相机距离原点的最远距离
            controls.minDistance = 1;
            //设置相机距离原点的最远距离
            controls.maxDistance = 2000;
            //是否开启右键拖拽
            controls.enablePan = true;
        }

        //每帧额外的运算
        function render() {
            //获取到窗口的一半高度和一半宽度
            let halfWidth = window.innerWidth / 2;
            let halfHeight = window.innerHeight / 2;

            let vector1 = cube.position.clone().project(camera);
            let vector2 = cube2.position.clone().project(camera);
            let vector3 = cube3.position.clone().project(camera);

            //修改第一个的div的位置
            $(".one").css({
                left:vector1.x * halfWidth + halfWidth,
                top:-vector1.y * halfHeight + halfHeight
            });


            $(".two").css({
                left:vector2.x * halfWidth + halfWidth,
                top:-vector2.y * halfHeight + halfHeight
            });


            $(".three").css({
                left:vector3.x * halfWidth + halfWidth,
                top:-vector3.y * halfHeight + halfHeight
            });

        }

        //窗口变动触发的函数
        function onWindowResize() {

            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize(window.innerWidth, window.innerHeight);

        }

        function animate() {
            //每帧额外的运算
            render();

            //更新性能插件
            stats.update();

            controls.update();

            renderer.render(scene, camera);

            requestAnimationFrame(animate);
        }

        function draw() {
            //兼容性判断
            if (!Detector.webgl) Detector.addGetWebGLMessage();
            initGui();
            initRender();
            initScene();
            initCamera();
            initLight();
            initModel();
            initControls();
            initStats();

            animate();
            window.onresize = onWindowResize;
        }


    </script>
    </html>

  • 相关阅读:
    使用密码记录工具keepass来保存密码
    ADO.NET Entity Framework CodeFirst 如何输出日志(EF 5.0)
    Mono 3.2 测试NPinyin 中文转换拼音代码
    Reactive Extensions(Rx) 学习
    Reactive Extensions介绍
    Mono 3.2 上跑NUnit测试
    RazorEngine 3.3 在Mono 3.2上正常运行
    标准数据源访问库
    .Net 跨平台可移植类库正在进行
    Windows安装和使用zookeeper
  • 原文地址:https://www.cnblogs.com/benmumu/p/10288145.html
Copyright © 2020-2023  润新知