three.js自定义几何体

three.js提供了很多创建几何体对象的方法,如BoxGeometry,SphereGeometry等,当然也可以自己创建几何体如下面这段代码

var gemo=new THREE.Geometry()
//定义几何体的顶点
var vertices=[new THREE.Vector3(0,0,0),new THREE.Vector3(0,0,6),new THREE.Vector3(7,0,0),new THREE.Vector3(0,8,0)]
//定义顶点的连接顺序,顺时针为向光,逆时针为背光
var face=[new THREE.Face3(0,1,2),new THREE.Face3(0,2,3),new THREE.Face3(0,1,3),new THREE.Face3(1,2,3)]
gemo.vertices=vertices;
gemo.faces=face;
gemo.computeFaceNormals()
var Mesh=[new THREE.MeshLambertMaterial({color:0x44ff44,opacity:0.6,transparent:true}),
            new THREE.MeshBasicMaterial({color:0x000000,wireframe:true})]
//定义两种材质混和
 var mesh=new THREE.SceneUtils.createMultiMaterialObject(gemo,Mesh)
mesh.children.forEach((item)=>{
      item.receiveShadow=true;
            })

这样就创建了一个四面体,其中THREE.SceneUtils.createMultiMaterialObject(gemo,Mesh)是创建多种材质的网格对象,接下来我们还可以用dat.GUI控制它的各个顶点

 var gui= new dat.GUI()
       function contorls(x,y,z){
          var con=new function(){
                 this.x=x
                 this.y=y
                 this.z=z
                }
                return con;
            }

            var con=[]
                con.push(contorls(0,0,0))
                con.push(contorls(0,0,6))
                con.push(contorls(7,0,0))
                con.push(contorls(0,8,0))
            
            for(var i=0;i<4;i++){
                var flod=gui.addFolder('vertices'+i);
                flod.add(con[i],'x',-10,10)
                flod.add(con[i],'y',-10,10)
                flod.add(con[i],'z',-10,10)
            }
 function render(){
                    var vertices=[]
                    for(var i=0;i<4;i++){
                        vertices.push(new THREE.Vector3(con[i].x,con[i].y,con[i].z))
                    }

                    mesh.children.forEach((item)=>{
                        item.geometry.vertices=vertices//更新顶点
                        item.geometry.verticesNeedUpdate=true;//设置顶点需要更新
                        item.geometry.computeFaceNormals()
                    })
                    renderer.render(scene,camera)
                    requestAnimationFrame(render)
                }
                render()

最后我们还可以克隆出另一个几何体,完整代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>test</title>
    <style>
    body{margin:auto;
        overflow:hidden;
    }
    </style>
</head>
<script src="../learning-threejs/libs/three.js"></script>
<script src="../learning-threejs/libs/stats.js"></script>
<script src="../learning-threejs/libs/dat.gui.js"></script>
<script src="../learning-threejs/libs/ConvexGeometry.js"></script>
<script src="../learning-threejs/libs/ParametricGeometries.js"></script>

<body>
    <div id="Webgl-output"></div>
    <div id='stats'></div>
    <script>
        function init(){
            var stats=new Stats()
            var scene=new THREE.Scene();
            var renderer=new THREE.WebGLRenderer();
            renderer.setSize(window.innerWidth,window.innerHeight)
            renderer.setClearColor(new THREE.Color(0xffffff))
            var camera=new THREE.PerspectiveCamera(45,window.innerWidth/window.innerHeight,0.1,1000);

            var planeGeometry=new THREE.PlaneGeometry(50,50)
            var planeMesh=new THREE.MeshLambertMaterial({color:0xffffff})
            var plane=new THREE.Mesh(planeGeometry,planeMesh);
            plane.rotation.x=-0.5*Math.PI
            plane.position.set(-10,0,-10);
            plane.receiveShadow=true;
            renderer.ShadowMapEnabled=true;
            scene.add(plane)
            camera.position.set(15,30,35)
            var spotLight=new THREE.SpotLight({color:0xffffff});
            spotLight.position.set(-20,30,35)
            scene.add(spotLight)

            var gemo=new THREE.Geometry()
            var Mesh=[new THREE.MeshLambertMaterial({color:0x44ff44,opacity:0.6,transparent:true}),
            new THREE.MeshBasicMaterial({color:0x000000,wireframe:true})]

            var mesh=new THREE.SceneUtils.createMultiMaterialObject(gemo,Mesh)

            mesh.children.forEach((item)=>{
                item.receiveShadow=true;
            })

            var gui= new dat.GUI()

             function contorls(x,y,z){
                var con=new function(){
                    this.x=x
                    this.y=y
                    this.z=z
                }
                return con;
            }

            var con=[]
            
                con.push(contorls(0,0,0))
                con.push(contorls(0,0,6))
                con.push(contorls(7,0,0))
                con.push(contorls(0,8,0))

            for(var i=0;i<4;i++){
                var flod=gui.addFolder('vertices'+i);
                flod.add(con[i],'x',-10,10)
                flod.add(con[i],'y',-10,10)
                flod.add(con[i],'z',-10,10)

            }

            var vertices=[new THREE.Vector3(0,0,0),new THREE.Vector3(0,0,6),new THREE.Vector3(7,0,0),new THREE.Vector3(0,8,0)]
                var face=[new THREE.Face3(0,1,2),new THREE.Face3(0,2,3),new THREE.Face3(0,1,3),new THREE.Face3(1,2,3)]
                gemo.vertices=vertices;
                gemo.faces=face;
                gemo.computeFaceNormals()
            
                function render(){
                    var vertices=[]
                    for(var i=0;i<4;i++){
                        vertices.push(new THREE.Vector3(con[i].x,con[i].y,con[i].z))
                    }

                    mesh.children.forEach((item)=>{
                        item.geometry.vertices=vertices
                        item.geometry.verticesNeedUpdate=true;
                        item.geometry.computeFaceNormals()
                    })
                    renderer.render(scene,camera)
                    requestAnimationFrame(render)
                }
                render()


                gui.add(new function(){
                   this.clone=function(){ var gemo=mesh.children[0].geometry.clone()
                   
                     var materials = [
                    new THREE.MeshLambertMaterial({opacity: 0.6, color: 0xff44ff, transparent: true}),
                    new THREE.MeshBasicMaterial({color: 0x000000, wireframe: true})
                ];
                    var clone=new THREE.SceneUtils.createMultiMaterialObject(gemo,materials)
                    clone.children.forEach(item=>{item.receiveShadow=true})
                    clone.name='clone'
                    scene.remove(scene.getObjectByName('clone'))//移除原先克隆的
                    clone.translateX(5)
                    clone.translateZ(9)
                    scene.add(clone)

}
                },'clone')

            scene.add(mesh)
            var ambientLight=new THREE.AmbientLight(0x0c0c0c)
            scene.add(ambientLight)
            scene.add(camera)
            camera.lookAt(scene.position)
            renderer.render(scene,camera)
            document.getElementById('Webgl-output').appendChild(renderer.domElement)
            window.resize=function(){
                camera.ascept=window.innerWidth/window.innerHeight;
                renderer.setSize(window.innerWidth,window.innerHeight);
                camera.updateProjectionMatrix()
                renderer.render(scene,camera)
            }
        }

        window.onload=init()
    </script>
</body>
</html>

其中mesh.children[0].geometry.clone是创建一个坐标,平面跟原来一样的几何体

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值