threejs路径

路径

引用百度百科的解释:

路径通常指存在于多种计算机图形设计软件中的以贝塞尔曲线为理论基础的区域绘制方式。

路径在Canvas、SVG上都有相关定义,一般用来创建形状。在threejs中,也可以用来创建形状,除此之外,还可以用作物体运动的轨迹。下面就说说这两种用法。

在threejs中,Path类代表路径,Path继承自CurvePath(曲线路径),CurvePath继承自Curve(曲线)。CurvePath和Curve都是抽象类,在threejs文档中指出,CurvePath用来连接多条曲线(也就是Curve),其实质上就是一个Curve数组。其实,直接用Path类就可以了,对于CurvePath和Curve,无需关心。

另外还有一个ShapePath类,这个类可以将形状转成一系列路径来表示,比如将svg绘制的图形转成threejs的路径。

使用路径创建形状

关于使用路径创建形状,可以参考【创建平面几何形状一文】,其中的Shape类,就是Path类的子类,这里不多说。

使用路径作为物体运动轨迹

如果我们想要物体沿着某一条曲线运动,有两种办法:
1、算出曲线的公式,动态的计算出物体当前时刻的位置
2、创建一条代表该曲线的路径,然后动态的在该曲线上取点,将其位置赋给物体
一般,路径类会提供多种创建路径的方法,所以,第2种方式通常比较好用。

下面就使用threejs提供的Path类创建一条移动轨迹,然后把相机在这条轨迹上移动。开始的开始,先创建一条路径,如下:

       path = new THREE.Path();path.bezierCurveTo(10,100,20,-30,30,19);path.bezierCurveTo(40,-5,50,150,60,-39);path.closePath();

接着在render循环中动态的从路径中取点,设置成相机的位置:

var progress = 0;
function render(){requestAnimationFrame(render);progress += 0.003;let point = path.getPointAt(progress);if(point){camera.position.set(point.x,point.y,300);}else{progress = 0;}renderer.render(scene,camera);
}

上面的progress是比例,范围从0~1.完整示例请看【完整示例】

将svg形状转成路径

svg是一种矢量图形格式,同时,javascript也有创建和修改这种图形格式的接口。各种表示矢量图形的技术,如Canvas、SVG,本质上是相同或相通的,只不过是实现和接口不一样,所以,是有转化的可能的。

在svg中,下面的代码创建了一条从(0,0)到(100,100)的直线路径:

<path d="M0 0 L 100 100"/>

而在threejs中,使用ShapePath创建一条直线路径使用:

let path = new ShapePath();
path.moveTo(0,0);
path.lineTo(100,100);

可见,两者的形式是相近的,从形式上来看,简单的转换难度也不会很大。下面是一个转换的例子:

function createShapes(){let dataString = getSvgData();  //获取svg数据let shape = transformToShapePath(dataString); //转换成ShapePath表示let geometry = new THREE.ShapeGeometry(shape);let material = new THREE.LineBasicMaterial({color:0xff0000});let mesh = new THREE.Line(geometry,material);scene.add(mesh);camera.lookAt(mesh.position);
}//获取svg数据,数据来自w3cschool
function getSvgData(){let svgData = "M153 334 C153 334 151 334 151 334 C151 339 153 344 156 344 C164 344 171 339 171 334 C171 322 164 314 156 314 C142 314 131 322 131 334 C131 350 142 364 156 364 C175 364 191 350 191 334 C191 311 175 294 156 294 C131 294 111 311 111 334 C111 361 131 384 156 384 C186 384 211 361 211 334 C211 300 186 274 156 274";return svgData;
}//转换成ShapePath表示
function transformToShapePath(dataString){let path = new THREE.ShapePath();let dataArr = dataString.split(" ");var currIndex = 0;while(currIndex<dataArr.length){let command = dataArr[currIndex][0];switch(command){case 'M' : {let inc = moveParse(currIndex,dataArr,path);currIndex += inc;break;}case 'C' : {let inc = curveParse(currIndex,dataArr,path);currIndex += inc;break;}default:{//出错处理currIndex++;}}}return path.toShapes()[0];
}/**************下面是各种命令的转换器****************///moveTo命令转换器function moveParse(currIndex,dataArr,path){let paramsLength = 2; //需要的参数个数let data = [dataArr[currIndex].substring(1),dataArr[currIndex+1]];toThreejsCoor(data);path.moveTo(data[0],data[1]);return paramsLength;}//Curve命令转换器function curveParse(currIndex,dataArr,path){let paramsLength = 6; //需要的参数个数let data = [ dataArr[currIndex].substring(1),dataArr[currIndex+1],dataArr[currIndex+2],dataArr[currIndex+3],dataArr[currIndex+4],dataArr[currIndex+5]];toThreejsCoor(data);path.bezierCurveTo(data[0],data[1],data[2],data[3],data[4],data[5]);return paramsLength;}//屏幕坐标转threejs坐标function toThreejsCoor(data){for(let i = 0 ; i < data.length; i += 2){data[i] = data[i] - window.innerWidth/2;data[i+1] = window.innerHeight/2 - data[i+1];}}

上面的代码做了下面这几件事:

  • 从svg中提取图形的定义数据,比如<path>标签的d属性
  • 将所提取数据中的坐标转换成threejs坐标
  • 分析所提取的数据里的操作,用ShapePath执行这些操作
  • 调用ShapePath类的toShapes()方法,获得一个Path对象数组
  • 用这个Path数组中的对象,创建threejs图形。

这也是将svg转成Path的几个基本步奏。经过转换之后,屏幕上会显示出如下图形:

完整效果,请戳【完整示例】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenGL ES 纹理设置

纹理过滤纹理采样最近点采样线性纹理采样MIPMAP纹理纹理过滤 纹理拉伸&#xff1a;重复拉伸和截取拉伸 用于指定纹理坐标超过(00.0,1.0)范围时所发生的行为&#xff0c;使用glTexParameterf函数指定&#xff0c;GL_TEXTURE_WRAP_S 定义 s 坐标超出范围[0.0, 1.0]的情况&#xf…

ubuntu联网不稳定,时断时连问题的解决办法

概览 ubuntu联网不稳定&#xff0c;时断时连问题的解决办法现象网络一会儿连上&#xff0c;过一会又自动断开&#xff0c;再等一会儿又断了。问题原因可能是受ipv6的影响解决办法关闭掉ipv6 详细步骤 1、编辑连接&#xff0c;打开“ipv6 settings”&#xff0c;将method设置…

搭建GitLab+Jenkins持续集成环境图文教程

GitLab是一个代码仓库&#xff0c;用来管理代码。Jenkins是一个自动化服务器&#xff0c;可以运行各种自动化构建、测试或部署任务。所以这两者结合起来&#xff0c;就可以实现开发者提交代码到GitLab&#xff0c;Jenkins以一定频率自动运行测试、构建和部署的任务&#xff0c;…

threejs-经纬度转换成xyz坐标的方法

用threejs做3D应用时&#xff0c;很经常会接触到球状物体&#xff0c;比如说地球&#xff0c;要定义球上的一点&#xff0c;用经纬度是常用的办法。现在&#xff0c;我们要在北京这个地方标一个点&#xff0c;北京的坐标为——北纬39.9”&#xff0c;东经116. 3”&#xff0c;该…

dashboard windows 前端开发环境搭建

dashboard是kubernetes的云管平台UI界面&#xff0c;正常情况下&#xff0c;其是在linux下开发的&#xff0c;但是&#xff0c;有些特殊情况下&#xff0c;我们也可能希望在windows上搭建起dashboard的开发环境 这里我们将搭建的开发环境的结构如下&#xff1a; windows上只运…

Visual Studio2012打开时弹出“遇到异常:这可能是由某个扩展导致的”错误的解决办法...

Visual Studio2012打开时弹出“遇到异常&#xff1a;这可能是由某个扩展导致的”错误的解决办法&#xff1a; 具体问题如下&#xff1a; 分析原因&#xff1a;网上搜集了以下&#xff0c;出现异常的原因是安装了第三方控件&#xff0c;然后删除是没有删除干净&#xff0c;导致日…

跨域问题及CORS机制

跨域 跨域是指一个资源请求与其不在同一个域&#xff08;源&#xff09;的资源&#xff0c;不在同一个域&#xff08;源&#xff09;是指两个域的协议、域名或端口不同。 同源策略 出于安全考虑&#xff0c;浏览器制定了同源策略&#xff0c; 限制了某些跨域请求。同源策略是…

【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...

模拟题&#xff0c;可以用树链剖分线段树维护。 但是学了一个厉害的。。树状数组的区间修改与区间查询。。 分割线里面的是转载的&#xff1a; -------------------------------------------------------------------------------- [ 3 ] 上面都不是重点……重点是树状数组的区…

oracle .dbf文件过大_学习这篇Oracle数据库文件坏块损坏的恢复方法,拓展你的知识面...

一、Oracle数据库系统简介&#xff1a;ORACLE数据库系统是美国ORACLE公司&#xff08;甲骨文&#xff09;提供的以分布式数据库为核心的一组软件产品&#xff0c;是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。比如SilverStream就是基于数据库的一种中间…

threejs- z-fighting 问题

Z-Buffer 在threejs中&#xff0c;使用深度缓冲&#xff08;Z-Buffer&#xff09;来完成场景可见性计算&#xff0c;即确定场景哪部分可见&#xff0c;哪部分不可见。深度缓冲&#xff08;Z-Buffer&#xff09;是一个二维数组&#xff0c;其中的每一个元素对应屏幕上的一个像素…

bower overrides 配置

bower 是一个常用的包管理工具&#xff0c;用起来和npm很相似&#xff0c;但是两者又有一些区别&#xff0c;可以参考 —— What is the difference between Bower and npm。这里不说bower本身&#xff0c;而想说一下bower的overrides配置。 何谓override override 本身是覆盖…

windows下搭建Vagrant+Virtualbox环境

对于开发人员来说&#xff0c;Vagrant就是一个提供标准化开发环境的工具。通过Vagrant&#xff1a; 使每个开发人员电脑上的代码运行环境一致&#xff0c;再也不会出现“在我电脑上运行起来明明没有问题的”这样的开发环境不一致的问题。你可以使用Vagrant在windows下提供linu…

Jenkins主从节点配置

jenkins支持主从模式&#xff0c;这将会把构建任务分发到多个从节点去执行&#xff0c;这样就可以支撑起多个项目的大量构建任务&#xff0c;同时&#xff0c;你可以提供多种环境&#xff08;如&#xff1a;开发环境、生产环境&#xff09;来对同一个项目进行测试和构建。想要进…

HTML5 响应式图片

现在上网设备越来越多&#xff0c;各种设备的屏幕千差万别&#xff0c;如果只用一张图片去涵盖所有的设备&#xff0c;一是可能会造成某些设备上显示效果不佳&#xff0c;比如使用了一张低清晰度的图&#xff0c;而网页运行在一个高清大屏里&#xff1b;二是可能会浪费带宽&…

threejs坐标转换

屏幕坐标转three.js坐标 将屏幕坐标转变成threejs空间坐标&#xff1a; function transToThreeCoord(x,y){let mouse new THREE.Vector3();mouse.x (x/window.innerWidth)*2 -1;mouse.y -(y/window.innerHeight)*2 1;return mouse; }注意&#xff1a;在实际使用中&#x…

android socket 发送byte_如何正确地创建和销毁网络通讯程序中的Socket类的对象实例...

软件项目实训及课程设计指导——如何正确地创建和销毁软件应用系统中网络通讯中的Socket类的对象实例1、基于TCP/IP协议的Socket通信相关的基础知识(1)TCP/IP(Transmission Control Protocol传输控制协议/Internet Protocol网间协议)TCP/IP是目前Internet网络中的主要协议&…

H5 使用微信开放标签跳转小程序

微信开放标签是微信公众平台面向网页开发者提供的扩展标签集合&#xff0c;可以在网页上提供跳转小程序、打开 App 等能力。本文梳理使用微信开放标签跳转小程序的过程&#xff0c;以备日后查阅。 参考链接 1. 开放标签说明文档 准备已认证的服务号 开放标签只能绑定已认证…

【网络流24题】No.7 试题库问题 (最大流,二分图多重匹配)

【题意】 假设一个试题库中有 n 道试题。 每道试题都标明了所属类别。 同一道题可能有多个类别属性。现要从题库中抽取 m 道题组成试卷。并要求试卷包含指定类型的试题。 试设计一个满足要求的组卷算法。 输入文件示例input.txt3 153 3 42 1 21 31 31 31 33 1 2 32 2 32 1 31 2…

参数等效模型可以用于_干货分享电池单体产热特性及热模型标定分析(2)

上篇已讲解了电池单体产热特性及电池模型相关理论&#xff0c;相较之下等效电路模型无需对电池内部的电化学反应有着深入的分析&#xff0c;是通过电路来描述电池的开路电压、内阻等&#xff0c;以实现对电池外特性的表征。本篇将继续讨论此问题&#xff0c;用Matlab和Amesim模…

检测同心圆_(二)光线如何被眼睛检测到?

在第一篇文章中&#xff08;链接&#xff1a;&#xff08;一&#xff09;视觉系统的全貌&#xff09;&#xff0c;我们已经了解了视觉信息被大脑处理的全过程。现在&#xff0c;我们把目光投向一切的起点——眼睛。实际上&#xff0c;人们提起“视觉”&#xff0c;首先想到的几…