THREEJS - 自定义曲线绘制

今天来给大家分享一个自定义曲线绘制的demo,这个demo主要是结合鼠标在三维空间点击的焦点获取、new THREE.CatmullRomCurve3()对象等。

  1. 我们需要在三维的scene内,监听鼠标的点击事件,绘制曲线的前提,需要一个平面,所以我们先在三维场景构建一个看不见的虚拟平面:

    // 创建平面
    let normal = new THREE.Vector3(0, 1, 0); // 构建向量
    let VirtualPlane = new THREE.Plane(normal, 0); // 虚拟平面
    
  2. 创建好平面后,就是需要获取当前鼠标点击的位置,即鼠标点击与虚拟平面的交点:

    /**
     * 获取射线与平面相交的交点
     * @param {*} event:鼠标点击事件event
     * @returns
     */
    function getIntersects(event) {
        let mouse = new THREE.Vector2();
        mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
        mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
        let normal = new THREE.Vector3(0, 1, 0);
        // 创建平面
        let VirtualPlane = new THREE.Plane(normal, 0);
        // 从相机发出一条射线经过鼠标点击的位置
        raycaster.setFromCamera(mouse, camera);
        // 获取射线
        let ray = raycaster.ray;
    
        // 计算相机到射线的对象,可能有多个对象,返回一个数组,按照距离相机远近排列
        let intersects = ray.intersectPlane(VirtualPlane);
    
        // 返回向量
        return intersects;
    }
    
  3. 拿到鼠标点击的焦点,存入对应的数组,然后绘制曲线:

    let pointsArray = [];
    pointsArray.push(intersects);
    if (pointsArray.length < 2) return; // 两点成线,少于两个点时不作绘制
    // 绘制曲线
    let curve = new THREE.CatmullRomCurve3(pointsArray);
    curve.curveType = 'chordal'; // 曲线类型
    curve.closed = false; // 曲线是否自动闭环
    let ponits = curve.getPoints(50); // 分段值,数值越大,曲线越圆滑
    let line = new THREE.Line(new THREE.BufferGeometry().setFromPoints(ponits), new THREE.LineBasicMaterial({ color: 0x0cc7d8 })); // 构建三维曲线
    scene.add(line); // 加入场景
    

以上就是三维场景中,常见的曲线自定义绘制,根据上述的思路,可以在平面绘制任意图案,如线段、道路等等,同时结合new THREE.Shape()对象的使用,可以绘制任意形状,还可以利用自定义的曲线,运用到智慧城市的发光的车流线绘制,如有需要,可以私聊,本人已经写好完整的案例。

欢迎大家提意见或者建议,相互学习!!!!!!

### 回答1: three.js的ExtrudeGeometry(拉伸几何体)函数可以通过在三维空间中拉伸二维形状来创建具有立体效果的建筑物特效。以下是使用ExtrudeGeometry进行白模建筑物绘制的过程: 首先,我们需要定义一个二维形状,可以是任意的多边形或者通过一系列点来定义。我们可以使用three.js中的Shape类来创建这个形状,根据建筑物的设计或者需求来确定二维形状的坐标点。 接下来,我们可以使用ExtrudeGeometry函数将二维形状拉伸成立体的效果。该函数接受两个参数,第一个参数是二维形状,第二个参数是一个包含拉伸设置的对象。我们可以设置拉伸的深度、是否生成侧面、顶面和底面等。 通过设置拉伸的深度,我们可以控制建筑物的高度。在创建白模建筑物时,一般不需要生成侧面和顶面。如果需要生成底面,可以设置相应的选项。 绘制建筑物的特效通常还需要设置材质和光源。可以使用MeshBasicMaterial(基础材质)来使建筑物呈现白模效果。通过设置光源的位置和类型,我们可以获得更加真实的光照效果。 最后,将创建好的建筑物对象添加到场景中,即可实现白模建筑物的特效。如果需要进行交互操作,可以添加事件监听器,实现例如鼠标点击、拖动等操作。 总而言之,使用three.js的ExtrudeGeometry函数,可以方便地绘制具有立体效果的白模建筑物特效。通过设置形状和拉伸参数,以及调整材质和光源等设置,可以获得满足需求的建筑物特效效果。 ### 回答2: threejs是一个用于在Web浏览器中创建3D图形的JavaScript库。extrudeGeometry(拉伸几何体)是其中一个内置的几何体对象,用于根据给定的参数在平面几何体上创建立体体。 白模建筑物特效是一种将建筑物的外观简化为灰色或白色基本形状的视觉效果。使用threejs的extrudeGeometry可以很容易地实现这一效果。 首先,我们需要创建一个平面几何体,表示建筑物的轮廓。可以使用threejs的Shape对象来绘制轮廓。 接下来,我们可以使用extrudeGeometry方法对该平面几何体进行拉伸。通过指定拉伸的深度和一些其他参数,我们可以生成一个具有立体效果的几何体。 在创建几何体后,我们需要将其添加到场景中并进行渲染。通过设置适当的相机和光源,可以使白模建筑物特效更加逼真。 为了增强特效,可以应用各种材质和纹理,如玻璃、金属等。使用threejs的材质对象和纹理加载器,可以轻松地在建筑物表面添加自定义的外观。 最后,我们可以通过在场景中添加动画效果来进一步改善白模建筑物特效。使用threejs的动画库,可以创建旋转、缩放等动画效果,让建筑物栩栩如生。 总之,使用threejs的extrudeGeometry功能,结合适当的材质和动画效果,可以轻松创建出具有白模建筑物特效的视觉效果。无论是用于建筑设计展示、游戏开发,还是其他3D交互场景,都可以借助这个功能实现令人印象深刻的效果。 ### 回答3: Three.js是一个用于在Web上创建交互式3D图形和动画的JavaScript库。ExtrudeGeometry是Three.js中的一个几何体类,用于根据2D图形的路径和深度创建3D几何体。 要绘制白模建筑物特效,可以使用Three.js的ExtrudeGeometry来创建建筑物的外观,然后将其放置在场景中。下面是实现这个特效的一些步骤: 1. 首先,我们需要创建一个平面或曲线路径作为建筑物的外观。这可以通过绘制2D形状并使用Three.js的Path类来实现。例如,可以使用直线、矩形、圆或自定义曲线等。 2. 接下来,使用ExtrudeGeometry类将2D形状转换为3D几何体,通过设置深度参数来控制建筑物的高度。 3. 为了给建筑物添加白色材质,可以使用Three.js的MeshBasicMaterial类,并将其应用于ExtrudeGeometry创建的几何体上。 4. 创建一个场景对象,并将ExtrudeGeometry创建的几何体添加到场景中。 5. 创建一个相机对象,设置相机的位置和朝向,以确保可以正确观察到建筑物。 6. 创建一个渲染器对象,并将其连接到HTML页面中的一个DOM元素上,以便将场景渲染到屏幕上。 7. 最后,使用渲染器对象的render方法在动画循环中渲染场景。可以通过更新建筑物的位置、旋转角度或其他参数来实现动画效果。 通过这些步骤,我们可以使用Three.js的ExtrudeGeometry来绘制一个白模建筑物特效,并在Web页面上展示出来。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值