Three.js学习笔记 本篇上一篇介绍的raycastercurves(曲线)实现在canvas画画。
目前只支持画线。

添加画板

我们可以添加一个Plane当做画板,要足够的大。

var geometry = new THREE.PlaneGeometry(10000, 10000, 20);var material = new THREE.MeshBasicMaterial({// 这里利用这两个参数设置plane为透明opacity: 0,transparent: true});var ground = new THREE.Mesh(geometry, material);ground.position.set(0, 0, 0);array.push(ground);scene.add(ground);

添加画笔

然后添加一个raycaster当做画笔。利用raycasterintersectObjects()方法获取和射线相交对象,通过该对象的point属性获取当前相交的交点坐标。

            var helpPoint = new THREE.Vector3();function render() {stats.update();raycaster.setFromCamera(mouse, camera);var intersects = raycaster.intersectObjects(array);if(intersects.length > 0) {//获取画笔和画板的交点左边,并保存到`helpPoint`中helpPoint = intersects[0].point;}requestAnimationFrame(render);renderer.render(scene, camera);}

添加画线事件

var v = []; //用来存储要绘制曲线的点var obj = new THREE.Object3D(); //用来存储绘制好的曲线//添加鼠标按下事件//鼠标按下开始绘制document.addEventListener('mousedown', onDocumentMouseDownLine, false);function onDocumentMouseDownLine(event) {event.preventDefault();//初始化`v`,获取的所有点的集合v = [];//添加鼠标移动事件,画线document.addEventListener('mousemove', onDocumentMouseMoveLine, false);}function onDocumentMouseMoveLine(event) {event.preventDefault();//将绘制过程中获取的点放入`v`中v.push(new THREE.Vector2(helpPoint.x, helpPoint.y));}//添加鼠标抬起事件function onDocumentMouseUpLine(event) {event.preventDefault();//将绘制的曲线放入`obj`中obj.add(line);//初始化 vv = [];document.removeEventListener('mousemove', onDocumentMouseMoveLine, false);}

画2D线

function drawLine(v) {// 用`v`中的点生成一条曲线var curve = new THREE.SplineCurve(v);var Linematerial = new THREE.LineBasicMaterial({color: 0x000000});var path = new THREE.Path(curve.getPoints(1000));Linegeometry = path.createPointsGeometry(1000);//使用曲线在场景中绘制出曲线line = new THREE.Line(Linegeometry, Linematerial);scene.add(line);}function render() {//因为创建SplineCurve必须要两个点,所以要`v.length`大于2是才能调用drawLine()if(v.length > 2) {//要移除了场景中的线,实时画新的线。直到鼠标抬起重置`v = []`scene.remove(line);drawLine(v);//添加以前画的所有线段scene.add(obj);}}

画3D线

同样的我们也可以用上述方法画3D的线,但是由于point属性只包含xy轴的坐标。所以我们需要自定义另一个坐标轴的坐标。
这里我们可以自定义z轴坐标(本例中设为了一个常量)。

//重写`mousemove`鼠标移动方法function onDocumentMouseMoveLine(event) {event.preventDefault();//因为下面要画3D生成过称中不允许出现重复的点,所以要去除重复的点  var temp = v[v.length - 1];//这里我们将`z`轴坐标设为常量50 if(temp) {if(temp.x == helpPoint.x && temp.y == helpPoint.y && temp.z == 50) {return;}}v.push(new THREE.Vector3(helpPoint.x, helpPoint.y, 50));}//重写函数`drawLine(v)`function drawLine(v) {//这里使用`CatmullRomCurve3`生成曲线var curve = new THREE.CatmullRomCurve3(v);var extrudeSettings = {curveSegments: 12,steps: 200,amount: 2,extrudePath: curve};var pts = [];pts.push(new THREE.Vector2(5, 5));pts.push(new THREE.Vector2(5, -5));pts.push(new THREE.Vector2(-5, -5));pts.push(new THREE.Vector2(-5, 5));var shape = new THREE.Shape(pts);//使用`ExtrudeGeometry`来扩展或说是挤压曲线,将曲线变成3Dvar geometry = new THREE.ExtrudeGeometry(shape, extrudeSettings);var material = new THREE.MeshBasicMaterial({color: 0xff8000});mesh = new THREE.Mesh(geometry, material);scene.add(mesh);}

ExtrudeGeometry

Constructor

var geometry = new THREE.ExtrudeGeometry(shapes,options);

Main Properties

  • shapes :形状或是一系列的形状
  • options :选项参数

Options

  • curveSegments :曲线上的点数
  • steps :用于细分曲线段数
  • amount :深度挤压的形状数
  • extrudePath :THREE.CurvePath,3D曲线来扩展

View source

  • source code 2D
  • source code 3D

转载于:https://www.cnblogs.com/chenjy1225/p/9640509.html

three.js-drawLine相关推荐

  1. web 页面table 斜线效果 跨越多行和 多列

    2019独角兽企业重金招聘Python工程师标准>>> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transition ...

  2. echarts5.x 词云图使用(`[ECharts] Unkown series wordCloud`)

    文章目录 echarts5.x 词云图使用(`[ECharts] Unkown series wordCloud`) 背景 预期效果 样例代码 自定义形状 动效 echarts5.x 词云图使用([E ...

  3. js室内地图开发_如何使用JS来开发室内三维地图的轨迹回放功能

    在制作完成室内三维地图的功能后,最经常有的需求就是如何做人员的轨迹回放,一般流程都是从数据库中查询轨迹坐标后,经过后台查询接口返回给前端,接下来的事情都交给JS来完成. 如果想做好一个性能好的轨迹回放 ...

  4. java使用重绘实现拖动_原生JS使用Canvas实现拖拽式绘图功能

    一.实现的功能 1.基于oop思想构建,支持坐标点.线条(由坐标点组成,包含方向).多边形(由多个坐标点组成).圆形(包含圆心坐标点和半径)等实体 2.原生JavaScript实现,不依赖任何第三方j ...

  5. 使用JCrop进行图片裁剪,裁剪js说明,裁剪预览,裁剪上传,裁剪设计的图片处理的工具类和代码

     1.要想制作图片裁剪功能,可以使用网上的裁剪工具JCrop,网址是:https://github.com/tapmodo/Jcrop/ 案例效果如下: 2.引入JCrop的js代码,具体要引入那 ...

  6. html 写字版插件,JS+HTML5 Canvas实现简单的写字板功能示例

    本文实例讲述了JS+HTML5 Canvas实现简单的写字板功能.分享给大家供大家参考,具体如下: 先来看运行效果: 具体代码如下: www.jb51.net JS写字板 body,html { pa ...

  7. java 扇形_使用js画图之圆、弧、扇形

    半径为r的圆上的点p(x,y)与圆心O(x0,y0)的关系: x = x0+rcosA;  y = y0+rsinA ,A为弧度 一.圆 //圆形/椭圆 //dot 圆点 //r 半径 //compr ...

  8. AJAX方式进行验证码的判断(JS方式)

    1.生成验证码 <%@ page language="java" pageEncoding="UTF-8"%> <%@ page conten ...

  9. Arcgis for js开发之直线、圆、箭头、多边形、集结地等绘制方法

    将ARCGIS for Js API中绘制各种图形的方法进行封装,方便调用.用时只需要传入参数既可.(在js文件中进行封装定义): 1.新建js文件,新建空对象用于函数的定义 if (!this[&q ...

  10. (转)Arcgis for JS实现台风运动路径与影像范围的显示

    http://blog.csdn.net/gisshixisheng/article/details/42025435 首先,看看具体的效果: 初始化状态 绘制中 绘制完成 首先,组织数据.我组织的数 ...

最新文章

  1. SpringBoot配置postgre多数据源(亲测有效!!!)
  2. 有关 MyEclipse-export runnable jar file选项 launch configuration里面没有可以选择的东西的解决方法...
  3. Dubbo简单介绍及实例
  4. hive - 可优化的 10 个地方及详解
  5. 千兆交换机下面可以接多少层交换机_高清监控怎么选配交换机
  6. @RequestParam
  7. linux max open,linux下修改max_user_processes和open_file的最大值
  8. 要想混得好,必须认识21个人!
  9. face landmark 人脸特征点检测
  10. 《疯狂的程序员》有感
  11. 用c语言编程解决数学实际问题,运用C语言解决爱因斯坦的数学题
  12. Mysql中使用IF
  13. MC34063中文资料及应用实例(转)
  14. 注册控件失败之一:提示0x80040200错误的处理办法
  15. 软件设计师中级考试,软考
  16. 记虚拟机装黑苹果踩坑及步骤
  17. lpx寒假作业案例3
  18. 4 java多线程和高并发(待更新)
  19. webpack与ts版本不兼容
  20. 配置 OpenLDAP 使用 SSL/TLS 加密数据通信

热门文章

  1. 《Maven 实战》总结
  2. JAVA使用selenium的常见爬虫操作
  3. Matlab计算完全消耗系数
  4. 东北大学计算机硬件题库,东北大学计算机硬件基础机考题库(150单选+编程).pdf...
  5. 【Flutter 实战】自定义动画-涟漪和雷达扫描
  6. 智慧废品回收系统v2.7.0
  7. 基于IDEA的Java学生管理系统
  8. 学习日记11--常微分方程数值解法
  9. 计算机信息学院开学演讲稿,大学开学演讲稿【五篇】
  10. 【软考-软件设计师】 考试大纲