本文搬自我的Github,https://github.com/555chy/three.js-example-comment,有兴趣的可以一起来完善,这个为Three.js的Example进行注解,方便初学者阅读

three.js 官网 Example 地址:https://threejs.org/examples/

<!DOCTYPE html>
<html lang="en"><head><title>three.js canvas - dashed lines</title><meta charset="utf-8"><!--如果没有设置viewport的width的话,网页很可能会超出手机屏幕宽度,具体多宽,要看浏览器定义的默认宽度是多少user-scalable=no,规定了用户不能缩放网页,但有些浏览器对该项支持不是很好,故需要设置minimum-scale和maximum-scale相同来限制用户缩放--><meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"><style>body {color: #ffffff;font-family:Monospace;font-size:13px;text-align:center;font-weight: bold;background-color: #000000;margin: 0px;overflow: hidden;}#info {color: #fff;position: absolute;top: 0px; width: 100%;padding: 5px;z-index:100;}</style></head><body><div id="info"><a href="http://threejs.org" target="_blank">three.js</a> - dashed lines example</div><div id="container"></div><script src="../build/three.js"></script><!--想要使用CanvasRenderer,必须添加如下两个js文件 Projector.js顾名思义上将3d图像投影到Canvas("2d")上,如果没有该文件会报如下错误THREE.Projector has been moved to /examples/js/renderers/Projector.js. three.js:42883:3TypeError: THREE.RenderableVertex is not a constructor --><script src="js/renderers/Projector.js"></script><script src="js/renderers/CanvasRenderer.js"></script><!--希尔伯特3D曲线--><script src="js/geometries/hilbert3D.js"></script><!--检测支持(canvas,webgl,workers,fileApi)--><script src="js/Detector.js"></script><!--统计插件(FPS,渲染时间,chrome内存使用率),min表示js代码经过压缩--><script src="js/libs/stats.min.js"></script><script>//如果不支持webgl,则会在当前的父布局上添加一个不支持的提示信息DIVif ( ! Detector.webgl ) Detector.addGetWebGLMessage();var renderer, scene, camera, stats;var objects = [];var WIDTH = window.innerWidth,HEIGHT = window.innerHeight;init();animate();function init() {/*透视相机PerspectiveCamera(fov, aspect, near, far)fov(视场):从相机位置能够看到的部分场景。推荐默认值45aspect(长宽比):渲染结果输出区域的横向长度和纵向长度的比值。推荐默认值window.innerWidth/window.innerHeightnear(近面):定义从距离相机多近的地方开始渲染场景。推荐默认值0.1far(远面):定义相机可以从它所处的位置看多远。默认值1000*/camera = new THREE.PerspectiveCamera( 60, WIDTH / HEIGHT, 1, 200 );camera.position.z = 150;scene = new THREE.Scene();/*场景的两种雾化效果(这里没有打光,因此雾不会显示出来)1. scene.fog = new THREE.Fog(color, near, far)第一个参数是雾化效果或者颜色(0xffffff),后面两个属性用来调节雾的显示,重什么地方开始到什么地方结束2. scene.fog = new THREE.Fog(color, concentration)第一个参数是雾化效果或者颜色(0xffffff),第二个参数是雾的浓度(0.015)*/scene.fog = new THREE.Fog( 0x111111, 150, 200 );root = new THREE.Object3D();//样条曲线分的段数var subdivisions = 6;//希尔伯特曲线递归的次数var recursion = 1;/*希尔伯特曲线hilbert3D* @param center     Center of Hilbert curve.* @param size       Total width of Hilbert curve.* @param iterations Number of subdivisions.curve's count -> 4 ^ iterations 个首尾相连两边竖起的凹线* @param v0         Corner index -X, +Y, -Z. 从上矩形的第二象限开始,先以逆时针画左矩形,再连到右侧,以顺时针画右矩形* @param v1         Corner index -X, +Y, +Z.* @param v2         Corner index -X, -Y, +Z.* @param v3         Corner index -X, -Y, -Z.* @param v4         Corner index +X, -Y, -Z.* @param v5         Corner index +X, -Y, +Z.* @param v6         Corner index +X, +Y, +Z.* @param v7         Corner index +X, +Y, -Z.*/var points = hilbert3D( new THREE.Vector3( 0,0,0 ), 25.0, recursion, 0, 1, 2, 3, 4, 5, 6, 7 );/*样条曲线(CatmullRomCurve3)与贝赛尔曲线的区别(CubicBezierCurve、QuadraticBezier)贝塞尔曲线只会穿过首尾两个控制点而不过中间的控制点,在某些场合希望曲线穿过所有控制点的话可以使用catmull-rom spline(简称CR-Spline)CR-Spline需要至少4个控制点,首尾两个控制点为辅助点,曲线不会穿过,其余控制点在t=[0,1]之间平滑地穿过,t=0时值等于第2个顶点,而t=1时值等于倒数第2个顶点如果传入的控制点首尾相等形成闭合环,那么不用计算,直接取值p0=pN-1,pN=p1就会成为一条光滑的曲线了。*/var spline = new THREE.CatmullRomCurve3( points );var geometrySpline = new THREE.Geometry();for ( var i = 0; i < points.length * subdivisions; i ++ ) {//index是当前点占分段后的点索引的百分比var index = i / ( points.length * subdivisions );//通过插值得到的新点var position = spline.getPoint( index );geometrySpline.vertices[ i ] = new THREE.Vector3( position.x, position.y, position.z );}var geometryCube = cube( 50 );//计算相邻两点的距离,目前还没发现有什么实际用途//geometryCube.computeLineDistances();//geometrySpline.computeLineDistances();/*THREE.Line使用WebGL中的gl.LINE_STRIP(一系列的连续直线,即折线)渲染THREE.LineSegments使用WebGL中的gl.LINES(每一对顶点被解释为一条直线,即线段)渲染LineDashedMaterial是虚线材质,dashSize定义了短划线的长度,gapSize定义了间隔的宽度*/var object = new THREE.LineSegments( geometrySpline, new THREE.LineDashedMaterial( { color: 0xffffff, dashSize: 1, gapSize: 0.5 } ) );objects.push( object );scene.add( object );var object = new THREE.LineSegments( geometryCube, new THREE.LineDashedMaterial( { color: 0xffaa00, dashSize: 3, gapSize: 1, linewidth: 2 } ) );objects.push( object );scene.add( object );renderer = new THREE.CanvasRenderer();//设置渲染器的"清除色"和"透明度"renderer.setClearColor( 0x111111 );//设置屏幕像素比,与Android上的DIP相仿,作用是在所有设备上的显示效果都相近renderer.setPixelRatio( window.devicePixelRatio );//设置待渲染场景的大小renderer.setSize( WIDTH, HEIGHT );var container = document.getElementById( 'container' );//将渲染器的DOM元素(即Canvas)添加到HTML中container.appendChild( renderer.domElement );//左上角的统计信息(FPS,渲染时间,chrome内存使用率)stats = new Stats();//这里注意,统计插件的dom元素是"dom",而不是domElementcontainer.appendChild( stats.dom );window.addEventListener( 'resize', onWindowResize, false );}//通过线段来构建一个边长为size的立方体function cube( size ) {var h = size * 0.5;var geometry = new THREE.Geometry();geometry.vertices.push(new THREE.Vector3( -h, -h, -h ),new THREE.Vector3( -h, h, -h ),new THREE.Vector3( -h, h, -h ),new THREE.Vector3( h, h, -h ),new THREE.Vector3( h, h, -h ),new THREE.Vector3( h, -h, -h ),new THREE.Vector3( h, -h, -h ),new THREE.Vector3( -h, -h, -h ),new THREE.Vector3( -h, -h, h ),new THREE.Vector3( -h, h, h ),new THREE.Vector3( -h, h, h ),new THREE.Vector3( h, h, h ),new THREE.Vector3( h, h, h ),new THREE.Vector3( h, -h, h ),new THREE.Vector3( h, -h, h ),new THREE.Vector3( -h, -h, h ),new THREE.Vector3( -h, -h, -h ),new THREE.Vector3( -h, -h, h ),new THREE.Vector3( -h, h, -h ),new THREE.Vector3( -h, h, h ),new THREE.Vector3( h, h, -h ),new THREE.Vector3( h, h, h ),new THREE.Vector3( h, -h, -h ),new THREE.Vector3( h, -h, h ));return geometry;}function onWindowResize() {//重新设置相机的宽高比。如果宽高比不对,那么正方形可能就不是正方形了camera.aspect = window.innerWidth / window.innerHeight;//更新透视相机的投影矩阵camera.updateProjectionMatrix();//更新待渲染场景的大小renderer.setSize( window.innerWidth, window.innerHeight );}function animate() {requestAnimationFrame( animate );render();//这里可以在render前后使用stats.begin和stats.end,也可以在每次渲染的时候调用一次stats.updatestats.update();}function render() {//Date.now()得到的是当前时间戳,单位毫秒var time = Date.now() * 0.001;for ( var i = 0; i < objects.length; i ++ ) {var object = objects[ i ];/*将旋转的角度按右手螺旋定则更新到原旋转角上rotation.y是绕Y轴旋转*///object.rotation.x = 0.25 * time * ( i%2 == 1 ? 1 : -1);object.rotation.x = 0.25 * time;object.rotation.y = 0.25 * time;}renderer.render( scene, camera );}</script>
</body>
</html>

Three.js Example 注解 —— canvas_lines_dashed.html相关推荐

  1. Three.js Example 注解 —— 目录

    本文搬自我的Github,https://github.com/555chy/three.js-example-comment,有兴趣的可以一起来完善,这个为Three.js的Demo进行注解的项目 ...

  2. 【TS】ts的使用和类型注解

    全局安装Ts npm install -g typescript 检查ts版本 tsc -V 安装完ts后,在文件夹新建 xxx.ts文件,html可以引入,但此时引入ts会报错,解决问题如下: 在使 ...

  3. koa2 mysql增删改查_react+koa2+mysql零门槛的全栈体验,附上完整项目分享

    写在前面 本文适用于对后端开发领域较为陌生的初级前端开发小伙伴,如果你想一个人搞定一整个项目(服务端接口定义开发+前端页面渲染+数据库搭建+服务器搭建+部署上线),希望这篇文章能给你带来一点点参考价值 ...

  4. Vue 组件开发 - 数据输入框组件

    目录 设计通用组件的一般思路 组件效果 1. HTML结构 2. index.js 3. input-number.js 3.1 input-number.js代码注解 设计通用组件的一般思路 明确需 ...

  5. leaflet实现风场动态粒子效果

    文章目录 前言 一.部分代码摘录 (一)velocity插件代码.js (二)插件使用示例代码 二.leaflet-velocity数据源格式 三.总结 前言 效果实现需要用到一款开源插件:leafl ...

  6. Flutter 2 渲染原理和如何实现视频渲染

    声网Agora跨平台开发工程师卢旭辉带来了<Flutter2 渲染原理和如何实现视频渲染>的主题分享,本文是对演讲内容的整理. 本次分享主要包括 3 个部分: Flutter2 概览. F ...

  7. 长篇总结之JavaScript,巩固前端基础

    文 / 掘金 大家好,我是魔王哪吒,话不多说,今天带来的是一篇<长篇总结之JavaScript,巩固前端基础>文章,欢迎大家喜欢. 前言 什么是JavaScript JavaScript是 ...

  8. webview跳转外部链接

    提示:本文章主要讲述js点击跳转外链 前言 一.示例模板 二.使用步骤 1.需点击跳转页面(假设为a) 2.跳转页面(假设为b) 3.json文件中配置路由 4.配置业务域名 总结 前言 官方介绍,w ...

  9. SSM8==纯注解SSM项目:实现单表CRUD、事务、自定义异常和统一异常处理、RESTFUL风格接口、统一返回值格式(状态码、内容、消息)、JSON传参、axios、vue.js、elementUI

    环境:IDEA2021+JDK8+MAVEN3.8+TOMCAT7插件 前端:axios.vue.js.elementUI 后端:见POM.XML相关依赖,主要有数据库MySQL5.7 ,数据源Dru ...

最新文章

  1. HBM2E Flashbolt--提升人工智能的算力
  2. 商品详细信息的代码html_电商网站的商品详情页系统架构
  3. 写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)...
  4. (转载)为什么欧美拿金牌不感谢祖国
  5. 图解在8086模拟器中运行汇编helloworld程序
  6. 以下哪些是oracle预定义角色,Oracle中预定义角色有哪些?
  7. 神策用户标签系统,深入业务构建用户价值体系
  8. linux 正则表达式与实践
  9. 【渝粤教育】 国家开放大学2020年春季 1167环境水利学 参考试题
  10. 阿里再添一员虎将!刚刚入职的80后硅谷科学家贾扬清到底有多牛?
  11. @value注解取不到值_教学笔记:Java注解及自定义注解示例
  12. express服务器多次访问数据库实例
  13. 基于LSTM网络的藏头诗和古诗自动生成(附完整代码和数据)
  14. 获取当前屏幕高度方法总结
  15. 转专业 计算机,转专业系列之信息/计算机
  16. libguestfs java_rhel7.0(libguestfs) 挂载windows虚机镜像
  17. mysql count 1_MySQL中count(1)和count(*)的区别是什么?
  18. html语言设置图片位置,HTML中如何设置图片位置
  19. 前端程序猿必备的网站
  20. git更换远程仓库和用户名密码

热门文章

  1. 压缩图片,任意大小的图片压缩到100K以内
  2. 【脑肿瘤分割论文】:TransBTS: Multimodal Brain Tumor Segmentation Using Transformer
  3. 计算机基础知识英文论文,第1章 计算机基础知识 2.doc
  4. 计算机网络运动会入场词,计算机网络运动会口号.doc
  5. 软件产品和互联网服务推荐目录
  6. C++中深拷贝和浅拷贝
  7. 将python脚本打包为安卓应用——beeware简易教程
  8. 电脑滤镜软件哪个好 滤镜调色有什么技巧
  9. ie6的兼容问题总结
  10. 她是计算机系公认的系花 却只喜欢打游戏,我选择了计算机专业,自以为自己不是系花就是班花,结果扎心了...