ThreeJs绘制线

简介: 这篇文章详细说明了如何使用Three.js来绘制线条,包括创建线几何体、设置材质以及将线条添加到3D场景中的具体步骤。

Threejs提供了绘制线的功能,先设定多个点数据,threeJs提供方法将多个点按照顺序连接起来,并提供线的材料颜色等,在上一篇中有讲到拖拽物体的功能,如果把线加入到可拖拽数组中,也可以实现拖拽线的功能,画线功能柜常用于地图编辑等,具体源码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!--引入three.js,这是使用three必须的js文件,此处引入的是外网提供的three文件,如果引入有问题可以到官网下载three文件后引入本地的theee.js文件-->
    <script src="three/three.js"></script>
    <script src="three/OrbitControls.js"></script>
    <script src="three/DragControls.js"></script>

<body>
<script>
    /**
     * 创建场景对象Scene
     */
    var scene = new THREE.Scene();

    /**
     * 相机设置
     */
    //窗口宽度
    var width = window.innerWidth;
    //窗口高度
    var height = window.innerHeight;
    //窗口宽高比
    var k = width / height;
    //三维场景显示范围控制系数,系数越大,显示的范围越大
    var s = 200;
    //创建相机对象
    var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
    //设置相机位置
    camera.position.set(200, 300, 200);
    //设置相机方向(指向的场景对象)
    camera.lookAt(scene.position);

    /**
     * 光源设置
     */
        //新建点光源(常用光源分为点光源和环境光,点光源的效果类似灯泡,环境光的效果类似白天的太阳光)
    var point = new THREE.PointLight(0xffffff);
    //设置点光源的位置
    point.position.set(400, 200, 300);
    //将点光源添加到场景中
    scene.add(point);

    /**
     * 创建网格模型,也就是3D模型
     */
    //创建一个立方体几何对象Geometry
    var geometry = new THREE.BoxGeometry(100, 100, 100);
    //给几何体创建材质,这里是改为蓝色,材质对象Material
    var material = new THREE.MeshLambertMaterial({
        color: 0x0000ff
    });
    //网格模型对象Mesh
    var mesh = new THREE.Mesh(geometry, material);
    //网格模型添加到场景中,每个模型最终都要添加到场景中才会被渲染
    scene.add(mesh);

    /**绘制线**/
    // 创建顶点坐标
    const points = [
      new THREE.Vector3(-100, 0, 0),
      new THREE.Vector3(0, 100, 0),
      new THREE.Vector3(100, 0, 0),
      new THREE.Vector3(100, 20, 0),
      new THREE.Vector3(50, 200, 0)
    ];
    // 创建BufferGeometry
    const lineGeometry = new THREE.BufferGeometry().setFromPoints(points);
    // 创建LineBasicMaterial
    const lineMaterial = new THREE.LineBasicMaterial({ color: 0x00ff00 });
    // 创建线对象
    const line = new THREE.Line(lineGeometry, lineMaterial);
    // 将线对象添加到场景中
    scene.add(line);


    /**
     * 创建渲染器对象
     */
    //创建渲染器对象(渲染要等所有东西都加进去再渲染场景,创建和3D模型和光源没有先后顺序)
    var renderer = new THREE.WebGLRenderer();
    //设置渲染区域尺寸(设置的是整个屏幕的长度和宽度
    renderer.setSize(width, height);
    //设置渲染的背景色
    renderer.setClearColor(0xb9d3ff, 1);
    //body元素中插入canvas对象,也可以在页面中添加div,并加上id,通过id指定在某个div中渲染
    document.body.appendChild(renderer.domElement);

    //循环渲染
    function render() {
        //执行渲染操作   指定场景、相机作为参数
        renderer.render(scene, camera);
        // 使用 requestAnimationFrame 函数安排下一次渲染
        requestAnimationFrame(render);
        //修改正方体网格的x轴旋转角度
    }
    //执行渲染
    render()

    /**
        添加鼠标拖动事件
    */
    //需要创建一个数组,将需要拖动的对象放到数组中(mesh是上面创建的正方体)
    let objects = [];
    objects.push(mesh)
    objects.push(line)
    var dragControls = new THREE.DragControls(objects, camera, renderer.domElement);

    //创建鼠标控制器    
    //let controls = new THREE.OrbitControls(camera, renderer.domElement );
    //监听控制器,每次拖动后重新渲染画面
    //controls.addEventListener('change', function () {
    //    renderer.render(scene, camera); //执行渲染操作
    //});
</script>
</body>
</html>
```![1691208277562.jpg](https://s2.51cto.com/images/202308/e31dfa809c2023539f17941b9d4c7aeec864ee.jpg?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

以上如有问题可以再评论区留言
相关文章
Threejs实现模拟管道液体流动
Threejs实现模拟管道液体流动
4317 0
Threejs实现模拟管道液体流动
cesium添加实体不被地形遮挡的参数设置
disableDepthTestDistance:指定从相机到禁用深度测试的距离,关于深度测试我们将在后面的文章中介绍到,由于深度测试的存在,我们的对象很多时候会被地形挡住,如下:
3468 0
cesium添加实体不被地形遮挡的参数设置
Threejs实现模拟河流,水面水流,水管水流,海面
Threejs实现模拟河流,水面水流,水管水流,海面
4632 0
Threejs实现模拟河流,水面水流,水管水流,海面
|
5月前
|
Java API 开发工具
阿里云号码隐私保护服务完全对接指南:从控制台配置到API深度集成
本文系统性地介绍了阿里云号码隐私保护服务的完整对接流程。首先阐述了号码隐私保护的产品定位与应用场景,详细解析了AXB、AXN、AXG、AXN分机号四种核心隐私号类型及其适用业务。随后从企业实名认证、开通服务、创建号码池、购买隐私号码等控制台前置操作入手,逐步引导读者完成服务初始化。在技术集成层面,深入讲解了OpenAPI的版本说明、全局接入点、认证鉴权机制,并以Python和Java两种主流语言为例,提供了BindAxb绑定接口的完整SDK调用代码。文章还涵盖了绑定关系管理、通话录音获取、呼叫状态查询等进阶操作,并详细梳理了按量付费与套餐包两种计费模式的成本构成。最后从企业资质要求、号码实名合
ThreeJs创建球体
这篇文章讲解了如何在Three.js中创建并添加一个球体到场景中,包括定义球体的几何形状、赋予材质以及最终渲染球体的过程。
788 1
|
存储 移动开发 大数据
HTML5 Web IndexedDB 数据库详解
IndexedDB 是一种高效的浏览器存储方案,允许在本地存储大量结构化数据,支持索引和事务,适用于需要离线和大数据处理的应用。它由数据库、对象仓库等组成,通过键值对存储数据,确保数据一致性和完整性。本介绍展示了如何创建、读取、更新和删除数据,以及事务和错误处理的最佳实践。
1677 10
ThreeJs通过射线获取自己的点击位置坐标
这篇文章详细说明了如何使用Three.js来绘制线条,包括创建线几何体、设置材质以及将线条添加到3D场景中的具体步骤。
972 1
ThreeJs通过射线获取自己的点击位置坐标
Threejs用切线实现模型沿着轨道行驶
这篇文章详细介绍了如何使用Three.js让一个模型沿着预定的曲线路径移动,并保持模型的方向始终沿着路径的切线方向,提供了实现这一效果的具体代码和步骤。
1279 1
Threejs用切线实现模型沿着轨道行驶
|
存储 开发框架 JavaScript
Threejs中三维物体和HTML的爱恨情仇:CSS2DRenderer
【8月更文挑战第7天】Threejs中三维物体和HTML的爱恨情仇:CSS2DRenderer
2087 4
Threejs中三维物体和HTML的爱恨情仇:CSS2DRenderer
ThreeJs场景中添加视频
这篇文章详细说明了如何在Three.js场景中添加并播放视频,包括视频纹理的创建与应用,以及如何将视频流显示在3D模型的表面上。
937 3
ThreeJs场景中添加视频