在上一篇小程序使用threejs第二篇—立方体展示并自动旋转与手势旋转中,我们还遗留了一个小问题,就是展示的立方体如何随手势旋转缩放,当我们处理了这个问题,接下来介绍几种几何模型,大家可以试着把他们添加到场景下再渲染出来…

好,先处理手势控制旋转缩放

上篇说过,基于微信官方的threejs-miniprogram要实现手势控制功能很难,所以我们需要考虑是不是有其他大神是不是已经完成这部分工作,幸运找到了。
手势控制其实只需要将OrbitControls类文件注入到threejs中即可,方便起见,还是直接拷贝吧
代码过大,提供一下下载链接:
threejs工具类库
首先需要在canvas上注册touch事件

<canvas type="webgl" id="webgl" style="width: 100%; height:100%;" bindtouchstart="touchStart" bindtouchmove="touchMove" bindtouchend="touchEnd" bindtouchcancel="touchCancel"></canvas>

这时候我们需要引入OrbitControls.js这个类,字面理解是轨道控制的意思,

import { OrbitControls } from '../../jsm/controls/OrbitControls'

接下来初始化OrbitControls,并调用其update方法

const controls = new OrbitControls(camera, renderer.domElement);
controls.update();

最后把canva的触摸事件传递给THREE就好了

touchStart(e) {console.log('canvas', e)THREE.global.touchEventHandlerFactory('canvas', 'touchstart')(e)},touchMove(e) {console.log('canvas', e)THREE.global.touchEventHandlerFactory('canvas', 'touchmove')(e)},touchEnd(e) {console.log('canvas', e)THREE.global.touchEventHandlerFactory('canvas', 'touchend')(e)},

效果如下:

直接体验

接下来介绍几种模型

先看效果:

可以试着把他们添加到场景下再渲染出来
1、BoxBufferGeometry:几何盒子模型
效果:

使用方法:

var geometry = new THREE.BoxBufferGeometry(width, height, depth)

2、CircleBufferGeometry:几何圆形模型
效果:

使用方法:

//segments是圆形边数,值越大越接近圆
var geometry =  new THREE.CircleBufferGeometry(radius, segments)

3、ConeBufferGeometry:几何圆锥模型
效果:

使用方法:

//segments是圆形边数,值越大越接近圆
var geometry =  new THREE.ConeBufferGeometry(radius, height, segments)

4、CylinderBufferGeometry:几何圆柱模型
效果:

使用方法:

//segments是圆形边数,值越大越接近圆
var geometry =  new THREE.CylinderBufferGeometry(radiusTop, radiusBottom, height, segments)

5、DodecahedronBufferGeometry:几何十二面体模型
效果:

使用方法:

var geometry =  new THREE.DodecahedronBufferGeometry(radius)

6、ExtrudeBufferGeometry:几何立体化模型—心形盒子
效果:

使用方法:

{const shape = new THREE.Shape();const x = -2.5;const y = -5;shape.moveTo(x + 2.5, y + 2.5);shape.bezierCurveTo(x + 2.5, y + 2.5, x + 2, y, x, y);shape.bezierCurveTo(x - 3, y, x - 3, y + 3.5, x - 3, y + 3.5);shape.bezierCurveTo(x - 3, y + 5.5, x - 1.5, y + 7.7, x + 2.5, y + 9.5);shape.bezierCurveTo(x + 6, y + 7.7, x + 8, y + 4.5, x + 8, y + 3.5);shape.bezierCurveTo(x + 8, y + 3.5, x + 8, y, x + 5, y);shape.bezierCurveTo(x + 3.5, y, x + 2.5, y + 2.5, x + 2.5, y + 2.5);const extrudeSettings = {steps: 2,depth: 2,bevelEnabled: true,bevelThickness: 1,bevelSize: 1,bevelSegments: 2,};var geometry =  new   THREE.ExtrudeBufferGeometry(shape, extrudeSettings));}

7、IcosahedronBufferGeometry:几何二十面体模型
效果:

使用方法:

var geometry =  new THREE.IcosahedronBufferGeometry(radius)

8、LatheBufferGeometry:几何车床加工模型
效果:

使用方法:

const points = [];
for (let i = 0; i < 10; ++i) {points.push(new THREE.Vector2(Math.sin(i * 0.2) * 3 + 3, (i - 5) * .8));
}
var geometry =  new THREE.LatheBufferGeometry(radius)

9、OctahedronBufferGeometry:几何八面体模型
效果:

使用方法:

var geometry =  new THREE.OctahedronBufferGeometry(radius)

10、ParametricBufferGeometry:几何参数化模型
效果:

使用方法:

 function klein(v, u, target) {u *= Math.PI;v *= 2 * Math.PI;u = u * 2;let x;let z;if (u < Math.PI) {x = 3 * Math.cos(u) * (1 + Math.sin(u)) + (2 * (1 - Math.cos(u) / 2)) * Math.cos(u) * Math.cos(v);z = -8 * Math.sin(u) - 2 * (1 - Math.cos(u) / 2) * Math.sin(u) * Math.cos(v);} else {x = 3 * Math.cos(u) * (1 + Math.sin(u)) + (2 * (1 - Math.cos(u) / 2)) * Math.cos(v + Math.PI);z = -8 * Math.sin(u);}const y = -2 * (1 - Math.cos(u) / 2) * Math.sin(v);target.set(x, y, z).multiplyScalar(0.75);}const slices = 25;const stacks = 25;var geometry = new THREE.ParametricBufferGeometry(klein, slices, stacks);

11、PlaneBufferGeometry:几何平面模型
效果:

使用方法:

var geometry =  new THREE.PlaneBufferGeometry(width, height, widthSegments, heightSegments)

12、PolyhedronBufferGeometry:几何多面体模型
效果:

使用方法:

 const verticesOfCube = [-1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1,-1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1,];const indicesOfFaces = [2, 1, 0, 0, 3, 2,0, 4, 7, 7, 3, 0,0, 1, 5, 5, 4, 0,1, 2, 6, 6, 5, 1,2, 3, 7, 7, 6, 2,4, 5, 6, 6, 7, 4,];const radius = 7;const detail = 2;var geometry = new THREE.PolyhedronBufferGeometry(verticesOfCube, indicesOfFaces, radius, detail)

13、RingBufferGeometry:几何环面模型
效果:

使用方法:

var geometry =  new THREE.RingBufferGeometry(innerRadius, outerRadius, segments)

14、ShapeBufferGeometry:几何形状模型—心形面
效果:

使用方法:

 const shape = new THREE.Shape();const x = -2.5;const y = -5;shape.moveTo(x + 2.5, y + 2.5);shape.bezierCurveTo(x + 2.5, y + 2.5, x + 2, y, x, y);shape.bezierCurveTo(x - 3, y, x - 3, y + 3.5, x - 3, y + 3.5);shape.bezierCurveTo(x - 3, y + 5.5, x - 1.5, y + 7.7, x + 2.5, y + 9.5);shape.bezierCurveTo(x + 6, y + 7.7, x + 8, y + 4.5, x + 8, y + 3.5);shape.bezierCurveTo(x + 8, y + 3.5, x + 8, y, x + 5, y);shape.bezierCurveTo(x + 3.5, y, x + 2.5, y + 2.5, x + 2.5, y + 2.5);var geometry = new THREE.ShapeBufferGeometry(shape);

15、 SphereBufferGeometry:几何球体模型
效果:

使用方法:

var geometry =  new THREE.SphereBufferGeometry(radius, widthSegments, heightSegments)

16、TetrahedronBufferGeometry:几何四面体模型
效果:

使用方法:

var geometry =  new THREE.TetrahedronBufferGeometry(radius, widthSegments, heightSegments)

17、TextBufferGeometry:几何字体模型
效果:

使用方法:

 {const loader = new THREE.FontLoader();// promisify font loadingfunction loadFont(url) {return new Promise((resolve, reject) => {loader.load(url, resolve, undefined, reject);});}async function doit() {const font = await loadFont('https://6e6f-normal-env-ta6pc-1300924598.tcb.qcloud.la/font/customfont.json?sign=9dde05b906d604a4945a2a78f6c1ab1d&t=1582637030');const geometry = new THREE.TextBufferGeometry('THREEJS', {font: font,size: 3.0,height: .2,curveSegments: 12,bevelEnabled: true,bevelThickness: 0.15,bevelSize: .3,bevelSegments: 5,});const mesh = new THREE.Mesh(geometry, createMaterial());geometry.computeBoundingBox();geometry.boundingBox.getCenter(mesh.position).multiplyScalar(-1);const parent = new THREE.Object3D();parent.add(mesh);addObject(0, -3, parent);}doit();}

18、TorusBufferGeometry:几何圆环立体模型
效果:

使用方法:

var geometry =  new THREE.TorusBufferGeometry(radius, tubeRadius, radialSegments, tubularSegments)

19、TorusKnotBufferGeometry:几何环形结立体模型
效果:

使用方法:

const radius = 3.5;
const tube = 1.5;
const radialSegments = 8;
const tubularSegments = 64;
const p = 2;
const q = 3;
var geometry =  new THREE.TorusKnotBufferGeometry(radius, tube, tubularSegments, radialSegments, p, q)

20、TubeBufferGeometry:几何管道立体模型

使用方法:

 {class CustomSinCurve extends THREE.Curve {constructor(scale) {super();this.scale = scale;}getPoint(t) {const tx = t * 3 - 1.5;const ty = Math.sin(2 * Math.PI * t);const tz = 0;return new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale);}}const path = new CustomSinCurve(4);const tubularSegments = 20;const radius = 1;const radialSegments = 8;const closed = false;var geometry =  new THREE.TubeBufferGeometry(path, tubularSegments, radius, radialSegments, closed);}

21、EdgesGeometry:几何四面体网格模型
效果:

使用方法:

 const width = 8;const height = 8;const depth = 8;const thresholdAngle = 15;var geometry =  new THREE.EdgesGeometry(new THREE.BoxBufferGeometry(width, height, depth),thresholdAngle)

22、WireframeGeometry:几何线框四面体模型
效果:

使用方法:

    var geometry =  new THREE.WireframeGeometry(new THREE.BoxBufferGeometry(width, height, depth))

下一篇我们将介绍如何加载3D模型

小程序使用threejs第三篇—介绍几种几何模型相关推荐

  1. 小程序使用threejs第五篇—室内效果3D文件的加载,可旋转查看上下四周效果

    在上一篇小程序使用threejs第四篇-加载3D模型中我们介绍了threejs加载几种3D模型,包括gltf.obj.glb等格式.但好像一直没有用的场景,最直观的场景应该是室内效果了. 解决思路 室 ...

  2. 微信小程序插件---表单验证篇

    微信小程序插件---表单验证篇 项目下载地址 WxValidate - 表单验证 插件介绍 该插件是参考 jQuery Validate 封装的,为小程序表单提供了一套常用的验证规则,包括手机号码.电 ...

  3. GitChat · 移动开发 | 小程序快速上手:三步完成小程序从无到有的开发

    GitChat 作者:极笔北客 原文: 小程序快速上手:三步完成小程序从无到有的开发 关注微信公众号:GitChat 技术杂谈 ,这里一本正经的讲技术 小程序作为微信之父张小龙钦点,并多次公开为之宣传 ...

  4. 微信小程序网悦新闻开发--功能介绍(一)

    目录 微信小程序网悦新闻开发--功能介绍(一) 微信小程序网悦新闻开发--小程序配置(二) 微信小程序网悦新闻开发--首页模块开发(三) 微信小程序网悦新闻开发--视频模块开发(四) 微信小程序网悦新 ...

  5. 菜谱分享网站微信小程序开发说明(1)-介绍与运行

    菜谱分享网站微信小程序开发说明(1)-介绍与运行 此项目是作为课设的小项目,实现的功能比较简单,可以入门练手~~也可以参考作为课设 使用技术栈 微信小程序原生框架 Spring Boot + MyBa ...

  6. 微信小程序布局技巧(三)

    微信小程序布局技巧(三) 前言 小程序适配 物理像素 小程序中的px px和rpx转换 应用 尾巴 前言 本文是微信小程序(本文后面统称小程序)布局技巧系列最后一篇文章,主要说明小程序的屏幕适配问题. ...

  7. 支付宝小程序授权登录 (Java 后台篇)

    支付宝小程序授权登录 (Java 后台篇) 开始 : 实现支付宝小程序授权登录功能, 本文主要是介绍支付宝小程序授权登录流程,与关键登录与处理代码. 流程 : 关键代码 : 1.获取用户信息 /*** ...

  8. 视频教程-微信小程序开发教程(第1篇)-微信开发

    微信小程序开发教程(第1篇) 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试(软考)--"信息系统项 ...

  9. 小程序入门到精通一篇就够了!

    一.小程序介绍 1.1.小程序是什么 官方文档:微信开放文档 微信小程序,简称小程序,英文名 MiniProgram ,是一种不需要下载安装即可使用的应用,它实现了应用 " 触手可及 &qu ...

最新文章

  1. Array.apply 方法的使用
  2. 机器学习笔记:反向传播
  3. Qt Creator构建Web应用程序
  4. 【Debug】— C++ 表达式必须包含类类型
  5. 最近流行的12个笑话,好笑又有道理
  6. 用户需求、己、竞争对手的关系
  7. 编辑距离(信息学奥赛一本通-T1276)
  8. 【英语学习】【Daily English】U10 Education L02 I'm not a pushy parent
  9. vector 注意事项
  10. redis---中文文档
  11. 在C#中??和?分别是什么意思?
  12. ubuntu 14.04中安装phpmyadmin即mysql图形管理界面
  13. 理想的低通滤波器、巴特沃斯滤波器、高斯滤波器
  14. [work*] 贝叶斯公式的通俗解释
  15. 无权更改wlan网络android,Jami | F-Droid - Free and Open Source Android App Repository
  16. 极简局域网(windows)桌面同屏软件
  17. c语言求开平方标准库函数,关于C语言中的开方计算,首先想到的当然是sqrt()函数,让我们先来回顾一下它的基本用法: 头文件:#include math.hsqrt(...
  18. 用数组实现一个队列改进版
  19. python之禅中文原文_Python之禅及释义
  20. WPF--3Dmax+blend+WPF综合运用

热门文章

  1. 网络流的建模方法总结
  2. Dell笔记本按F8进不了安全模式解决办法
  3. Django3.0新鲜出炉!全面解读新特性,ASGI真香实锤,不来了解一下?
  4. 视频剪辑:如何将竖屏视频转换为横屏视频
  5. mysql 设置日期时间格式_mysql 设置时间格式
  6. java comparable 泛型_Java泛型的应用——T extends Comparable? super T
  7. go 自定义error怎么判断是否相等_Go 1.13 errors 基本用法
  8. 招商银行周天虹:AI时代的分布式数据库是什么样的?
  9. 用Windows工具揪出隐藏的QQ尾巴
  10. .Net 日志系统-常用日志框架