Three.js使用对象组合实例方法

将多个模型放到一个组里面,就是一个对象组合。 创建组非常简单,每个你创建的网格都可以包含子元素,子元素可以使用add函数来添加。在组中添加子元素的效果是:你可以移动、缩放、旋转和变形父对象,而所有的子对象都将会受到影响。 

对象组合的实现

对象组合很好实现,首先创建一个three.object3d的类的对象。这是three.mesh和three.scene的基类,但是它本身不包含任何东西,也不会渲染任何东西。请注意,在three.js的最新版本中引入了一个名为three.group的新对象以支持分组。该对象与three.object3d对象完全相同,它两个可以互换。

    var group = new THREE.Object3D(); //实例化一个THREE.Object3D对象    group.add(sphere); //在对象里面添加第一个子元素    group.add(cube); //在对象里面添加第二个子元素    scene.add(group); //将对象组添加到场景当中

登录后复制

代码如上,我们就实现了一个场景组。

注意:你旋转一个组时,并不是分别旋转组中的每一个对象,而是绕其中心旋转整个组(在我们的例子里,是绕着group对象的中心旋转整个组)。

使用组的时候,你依然可以引用、修改和定位每一个单独的几何体。唯一需要记住的是:所有的定位、旋转和变形都是相对父对象的。

案例代码

nbsp;html>        Title            html, body {            margin: 0;            height: 100%;        }        canvas {            display: block;        }        var renderer;    function initRender() {        renderer = new THREE.WebGLRenderer({antialias:true});        renderer.setSize(window.innerWidth, window.innerHeight);        //告诉渲染器需要阴影效果        renderer.shadowMap.enabled = true;        renderer.shadowMap.type = THREE.PCFSoftShadowMap; // 默认的是,没有设置的这个清晰 THREE.PCFShadowMap        document.body.appendChild(renderer.domElement);    }    var camera;    function initCamera() {        camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 0.1, 1000);        camera.position.set(0, 40, 50);        camera.lookAt(new THREE.Vector3(0,0,0));    }    var scene;    function initScene() {        scene = new THREE.Scene();    }    //初始化dat.GUI简化试验流程    var gui;    function initGui() {        //声明一个保存需求修改的相关数据的对象        gui = {            sphereX:-5, //球的x轴的位置            sphereY:5, //球的y轴的位置            sphereZ:0, //球的z轴的位置            sphereScale:1, //球的缩放            cubeX:15, //立方体的x轴位置            cubeY:5, //立方体的y轴位置            cubeZ:-5, //立方体的z轴的位置            cubeScale:1, //立方体的缩放            groupX:0, //模型组的x轴位置            groupY:0, //模型组的y轴位置            groupZ:0, //模型组的z轴的位置            groupScale:1, //模型组的缩放            grouping:false, //是否整个模型组旋转            rotate:false, //是否旋转        };        var datGui = new dat.GUI();        //将设置属性添加到gui当中,gui.add(对象,属性,最小值,最大值)        //球型的操作        var sphereFolder = datGui.addFolder("sphere");        sphereFolder.add(gui,"sphereX",-30,30).onChange(function (e) {            sphere.position.x = e;        });        sphereFolder.add(gui,"sphereY",-30,30).onChange(function (e) {            sphere.position.y = e;        });        sphereFolder.add(gui,"sphereZ",-30,30).onChange(function (e) {            sphere.position.z = e;        });        sphereFolder.add(gui,"sphereScale",0,3).onChange(function (e) {            sphere.scale.set(e, e, e);        });        //立方体的操作        var cubeFolder = datGui.addFolder("cube");        cubeFolder.add(gui,"cubeX",-30,30).onChange(function (e) {            cube.position.x = e;        });        cubeFolder.add(gui,"cubeY",-30,30).onChange(function (e) {            cube.position.y = e;        });        cubeFolder.add(gui,"cubeZ",-30,30).onChange(function (e) {            cube.position.z = e;        });        cubeFolder.add(gui,"cubeScale",0,3).onChange(function (e) {            cube.scale.set(e, e, e);        });        //场景组的操作        var groupFolder = datGui.addFolder("group");        groupFolder.add(gui,"groupX",-30,30).onChange(function (e) {            group.position.x = e;        });        groupFolder.add(gui,"groupY",-30,30).onChange(function (e) {            group.position.y = e;        });        groupFolder.add(gui,"groupZ",-30,30).onChange(function (e) {            group.position.z = e;        });        groupFolder.add(gui,"groupScale",0,3).onChange(function (e) {            group.scale.set(e, e, e);        });        //添加旋转功能        datGui.add(gui, "grouping");        datGui.add(gui, "rotate");    }    var light;    function initLight() {        scene.add(new THREE.AmbientLight(0x444444));        light = new THREE.PointLight(0xffffff);        light.position.set(15,50,10);        //告诉平行光需要开启阴影投射        light.castShadow = true;        scene.add(light);    }    var sphere,cube,group;    function initModel() {        //模型组        group = new THREE.Object3D();        scene.add(group);        //球        var sphereGeometry = new THREE.SphereGeometry(5,200,200);        var sphereMaterial = new THREE.MeshLambertMaterial({color:0xaaaaaa});        sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);        sphere.position.x = -5;        sphere.position.y = 5;        //告诉球需要投射阴影        sphere.castShadow = true;        group.add(sphere);        //辅助工具        var helper = new THREE.AxisHelper(50);        scene.add(helper);        //立方体        var cubeGeometry = new THREE.CubeGeometry(10,10,8);        var cubeMaterial = new THREE.MeshLambertMaterial({color:0x00ffff});        cube = new THREE.Mesh(cubeGeometry, cubeMaterial);        cube.position.x = 15;        cube.position.y = 5;        cube.position.z = -5;        //告诉立方体需要投射阴影        cube.castShadow = true;        group.add(cube);        //底部平面        var planeGeometry = new THREE.PlaneGeometry(100,100);        var planeMaterial = new THREE.MeshStandardMaterial({color:0xaaaaaa});        var plane = new THREE.Mesh(planeGeometry, planeMaterial);        plane.rotation.x = - 0.5 * Math.PI;        plane.position.y = -0;        //告诉底部平面需要接收阴影        plane.receiveShadow = true;        scene.add(plane);    }    //初始化性能插件    var stats;    function initStats() {        stats = new Stats();        document.body.appendChild(stats.dom);    }    //用户交互插件 鼠标左键按住旋转,右键按住平移,滚轮缩放    var controls;    function initControls() {        controls = new THREE.OrbitControls( camera, renderer.domElement );        // 如果使用animate方法时,将此函数删除        //controls.addEventListener( 'change', render );        // 使动画循环使用时阻尼或自转 意思是否有惯性        controls.enableDamping = true;        //动态阻尼系数 就是鼠标拖拽旋转灵敏度        //controls.dampingFactor = 0.25;        //是否可以缩放        controls.enableZoom = true;        //是否自动旋转        controls.autoRotate = false;        //设置相机距离原点的最远距离        controls.minDistance  = 100;        //设置相机距离原点的最远距离        controls.maxDistance  = 200;        //是否开启右键拖拽        controls.enablePan = true;    }    var step = 0.02; //模型旋转的速度    function render() {        //判断当前是否自动旋转        if(gui.rotate){            //判断是单个模型自转,还是模型组自转            if(gui.grouping){                group.rotation.y += step;            }            else{                sphere.rotation.y += step;                cube.rotation.y += step;            }        }        renderer.render( scene, camera );    }    //窗口变动触发的函数    function onWindowResize() {        camera.aspect = window.innerWidth / window.innerHeight;        camera.updateProjectionMatrix();        render();        renderer.setSize( window.innerWidth, window.innerHeight );    }    function animate() {        //更新控制器        render();        //更新性能插件        stats.update();        controls.update();        requestAnimationFrame(animate);    }    function draw() {        initGui();        initRender();        initScene();        initCamera();        initLight();        initModel();        initControls();        initStats();        animate();        window.onresize = onWindowResize;    }

登录后复制

以上就是Three.js使用对象组合实例方法的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2782747.html

(0)
上一篇 2025年3月8日 16:37:46
下一篇 2025年2月26日 14:26:28

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 使用js或者jq设置滚动条实现方法分享

    js原生方法scrollTojs原生设置x轴和y轴就一个方法,首先获取到dom对象,然后设置位置即可, dom.scrollTo(x,y); //x为水平方向的滚动条位置,y为垂直方向的滚动条位置 登录后复制 如果只想设置y轴的滚动条位置,…

    编程技术 2025年3月8日
    200
  • js重新赋值原生的方法

    js的原生方法被覆盖掉以后,如果你还没让原生方法又从新指向一个新的变量名,那就gg了。所以,关键就是怎么再获取到原生的方法。实现的原理呢就是创建一个新的window对象,然后从新的window对象里面获取原生的方法,来重新赋值。 使用ifr…

    编程技术 2025年3月8日
    200
  • 全屏滚动插件fullpage.js的使用详解

    这次给大家带来全屏滚动插件fullpage.js的使用详解,全屏滚动插件fullpage.js使用的注意事项有哪些,下面就是实战案例,一起来看一下。 这两天公司网页改版用到fullpage.js这个滚屏插件,页面内容整屏的滚动,不成问题,各…

    2025年3月8日
    200
  • js实现将canvas生成图片保存或直接保存一张图片

    本文主要和大家分享js实现将canvas生成图片保存或直接保存一张图片,希望能帮助到大家。 将canvas数组保存 function downLoadImage(canvas,name) {    var a = document.crea…

    编程技术 2025年3月8日
    200
  • JavaScript结合jquery库简单的实现点击编辑表格

    本篇文章讲述了jquery如何简单的实现点击编辑表格,大家对jquery简单的实现点击编辑表格不了解的话或者对jquery简单的实现点击编辑表格感兴趣的话那么我们就一起来看看本篇文章吧, 好了废话少说进入正题吧 下面用简单方法实现的简单表格…

    2025年3月8日
    200
  • js简单双向绑定案例代码

    本文主要和大家分享js简单双向绑定案例代码,把代码复制放到页面里面运行看一下效果就好了,希望能帮助到大家。        Title function watch(obj,key,callback) { var old = obj[key]…

    编程技术 2025年3月8日
    200
  • $.ajax()怎样从服务器获取json数据

    这次给大家带来$.ajax()怎样从服务器获取json数据,$.ajax()怎样从服务器获取json数据的注意事项有哪些,下面就是实战案例,一起来看一下。 下面小编就为大家分享一篇基于$.ajax()方法从服务器获取json数据的几种方式总…

    2025年3月8日
    200
  • javascript中"use strict"严格模式详解

    除了正常运行模式,ecmascript 5添加了第二种运行模式:”严格模式”(strict mode)。顾名思义,这种模式使得javascript在更严格的条件下运行。 为什么用严格模式 消除Javascript语法的一些不合理、不严谨之处…

    编程技术 2025年3月8日
    200
  • 对JavaScript字符串方法的总结

    本篇文章讲述了JavaScript字符串方法,大家对JavaScript字符串方法不了解的话或者对JavaScript字符串方法感兴趣的话那么我们就一起来看看本篇文章吧, 好了废话少说进入正题吧! 测试数组str=”China”; 下面各个…

    编程技术 2025年3月8日
    200
  • js使用console计算代码运行时间的方法

    如果学习前端一定时间以后,就会考虑性能方面的问题。那么问题来了,我们怎么计算出一段代码的运行时间呢?本文主要和大家分享js使用console计算代码运行时间的方法,希望能帮助到大家。 使用console.log配合Date对象计算 比如,我…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论