three.js-drawLine
Three.js学习笔记 本篇上一篇介绍的raycaster
和curves
(曲线)实现在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
当做画笔。利用raycaster
的intersectObjects()
方法获取和射线相交对象,通过该对象的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
属性只包含x
和y
轴的坐标。所以我们需要自定义另一个坐标轴的坐标。
这里我们可以自定义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相关推荐
- web 页面table 斜线效果 跨越多行和 多列
2019独角兽企业重金招聘Python工程师标准>>> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transition ...
- echarts5.x 词云图使用(`[ECharts] Unkown series wordCloud`)
文章目录 echarts5.x 词云图使用(`[ECharts] Unkown series wordCloud`) 背景 预期效果 样例代码 自定义形状 动效 echarts5.x 词云图使用([E ...
- js室内地图开发_如何使用JS来开发室内三维地图的轨迹回放功能
在制作完成室内三维地图的功能后,最经常有的需求就是如何做人员的轨迹回放,一般流程都是从数据库中查询轨迹坐标后,经过后台查询接口返回给前端,接下来的事情都交给JS来完成. 如果想做好一个性能好的轨迹回放 ...
- java使用重绘实现拖动_原生JS使用Canvas实现拖拽式绘图功能
一.实现的功能 1.基于oop思想构建,支持坐标点.线条(由坐标点组成,包含方向).多边形(由多个坐标点组成).圆形(包含圆心坐标点和半径)等实体 2.原生JavaScript实现,不依赖任何第三方j ...
- 使用JCrop进行图片裁剪,裁剪js说明,裁剪预览,裁剪上传,裁剪设计的图片处理的工具类和代码
1.要想制作图片裁剪功能,可以使用网上的裁剪工具JCrop,网址是:https://github.com/tapmodo/Jcrop/ 案例效果如下: 2.引入JCrop的js代码,具体要引入那 ...
- html 写字版插件,JS+HTML5 Canvas实现简单的写字板功能示例
本文实例讲述了JS+HTML5 Canvas实现简单的写字板功能.分享给大家供大家参考,具体如下: 先来看运行效果: 具体代码如下: www.jb51.net JS写字板 body,html { pa ...
- java 扇形_使用js画图之圆、弧、扇形
半径为r的圆上的点p(x,y)与圆心O(x0,y0)的关系: x = x0+rcosA; y = y0+rsinA ,A为弧度 一.圆 //圆形/椭圆 //dot 圆点 //r 半径 //compr ...
- AJAX方式进行验证码的判断(JS方式)
1.生成验证码 <%@ page language="java" pageEncoding="UTF-8"%> <%@ page conten ...
- Arcgis for js开发之直线、圆、箭头、多边形、集结地等绘制方法
将ARCGIS for Js API中绘制各种图形的方法进行封装,方便调用.用时只需要传入参数既可.(在js文件中进行封装定义): 1.新建js文件,新建空对象用于函数的定义 if (!this[&q ...
- (转)Arcgis for JS实现台风运动路径与影像范围的显示
http://blog.csdn.net/gisshixisheng/article/details/42025435 首先,看看具体的效果: 初始化状态 绘制中 绘制完成 首先,组织数据.我组织的数 ...
最新文章
- SpringBoot配置postgre多数据源(亲测有效!!!)
- 有关 MyEclipse-export runnable jar file选项 launch configuration里面没有可以选择的东西的解决方法...
- Dubbo简单介绍及实例
- hive - 可优化的 10 个地方及详解
- 千兆交换机下面可以接多少层交换机_高清监控怎么选配交换机
- @RequestParam
- linux max open,linux下修改max_user_processes和open_file的最大值
- 要想混得好,必须认识21个人!
- face landmark 人脸特征点检测
- 《疯狂的程序员》有感
- 用c语言编程解决数学实际问题,运用C语言解决爱因斯坦的数学题
- Mysql中使用IF
- MC34063中文资料及应用实例(转)
- 注册控件失败之一:提示0x80040200错误的处理办法
- 软件设计师中级考试,软考
- 记虚拟机装黑苹果踩坑及步骤
- lpx寒假作业案例3
- 4 java多线程和高并发(待更新)
- webpack与ts版本不兼容
- 配置 OpenLDAP 使用 SSL/TLS 加密数据通信