基于three.js编写的一个项目类示例代码


Posted in Javascript onJanuary 05, 2018

WebVR

在开始之前,先对WebVR进行介绍,WebVR是一个实验性的Javascript API,允许HMD(head-mounted displays)连接到web apps,同时能够接受这些设备的位置和动作信息。这让使用Javascript开发VR应用成为可能(当然已经有很多接口API让Javascript作为开发语言了,不过这并不影响我们为WebVR感到兴奋)。而让我们能够立马进行预览与体验,移动设备上的chrome已经支持了WebVR并使手机作为一个简易的HMD。手机可以把屏幕分成左右眼视觉并应用手机中的加速度计、陀螺仪等感应器,你需要做的或许就只是买一个cardboard。下面话不多说了,来一起看看本文的正文:

这是一篇关于怎么样基于three.js进行可配置的three.js的对象创建的文章

项目地址

编写一个three.js的基类

这是创建的一个Three.js基类其中包含了场景,相机,渲染器,控制器以及一些方法

// VRcore.js
 import * as THREE from 'three';
 const OrbitControls = require('three-orbit-controls')(THREE)
 let Scene, Camera, Renderer, Controls, loopID;

 function createScene({domContainer = document.body, fov = 50,far = 1000}){
 if (!(domContainer instanceof HTMLElement)) {
  throw new Error('domContainer is not a HTMLElement!');
 }
 // 初始化 scene
 Scene = new THREE.Scene();
 // 初始化 camera
 Camera = new THREE.PerspectiveCamera(fov, domContainer.clientWidth / domContainer.clientHeight, 1, far);
 Camera.position.set( 200, 200, 200 );
 Camera.lookAt(Scene.position);
 Scene.add(Camera);
 // 初始化 renderer
 Renderer = new THREE.WebGLRenderer({ canvas: domContainer, antialias: true, alpha: true } );
 Renderer.clear();
 Renderer.setClearColor( 0xeeeeee, 1); // 更改渲染器颜色
 Renderer.setSize(domContainer.clientWidth, domContainer.clientHeight);
 Renderer.shadowMap.Enabled = true;
 Renderer.setPixelRatio(domContainer.devicePixelRatio);
 initVR();
 }
 function initVR() {
  // 初始化控制器
  Controls = new OrbitControls(Camera, Renderer.domElement);;
  Controls.addEventListener('change', render);
  Controls.enableZoom = true;
 }
 function render() {
 Renderer.render(Scene, Camera);
 }
 function renderStart(callback) {
 loopID = 0; // 记录循环几次,后面有与清除场景中的物体
 if (loopID === -1) return;
 let animate = function(){
  loopID = requestAnimationFrame(animate);
  callback();
  Controls.update();
  render();
 }
 animate();
 }
 // 暂停动画渲染
 function renderStop() {
 if (loopID !== -1) {
  window.cancelAnimationFrame(loopID);
  loopID = -1;
 }
 }
 // 回收当前场景
 function clearScene() {
 for(let i = Scene.children.length - 1; i >= 0; i-- ) {
  Scene.remove(Scene.children[i]);
 }
 }
 // 清理页面
 function cleanPage() {
 renderStop();
 clearScene();
 }
 export {
 Scene,
 Camera,
 Renderer,
 Controls,
 createScene,
 initVR,
 renderStart,
 renderStop,
 clearScene,
 cleanPage
 }

创建一个VRpage基类

这是一个VRpage的基类,所有需要创建Three项目都需要继承这个类,然后生成一个Three项目

// VRpage.js
 import * as THREE from 'three';
 import * as VRcore from './VRcore.js';
 export default class VRpage {
 constructor(options) {
  // 创建场景
  VRcore.createScene(options);
  this.start();
  this.loadPage();
 }
 loadPage() {
  VRcore.renderStart(() => this.update());
  this.loaded();
 }
 initPage() {
  this.loadPage();
  this.start();
 }
 start() {}
 loaded() {}
 update() {}
 }

生成一个Three.js的项目

下面的文件是一个继承了VRpage类的一个类,然后我们重写了start方法以及update方法,start方法中我们向场景中添加了一个正方体,update方法是我们给这个正方体的一个变形动画,他会结合VRcore.js里面的renderStart方法来进行动画效果

// page.js
 import * as THREE from 'three';
 import VRpage from '../../utils/VRpage.js';
 import * as VRcore from '../../utils/VRcore.js';
 export default class Page extends VRpage {
 start() { // 启动渲染之前,创建场景3d模型
  let geometry = new THREE.CubeGeometry(100,100,100);
  let material = new THREE.MeshLambertMaterial( { color:0x0000ff} );
  this.box = new THREE.Mesh(geometry,material);
  this.box.position.set(3, -2, -3);
  const PointLight = new THREE.PointLight(0xffffff);
  PointLight.position.set(500, 500, 500);
  const AmbientLight = new THREE.AmbientLight( 0x404040 ); // soft white light
  VRcore.Scene.add(PointLight);
  VRcore.Scene.add(AmbientLight);
  VRcore.Scene.background = new THREE.Color( 0xeeeeee ); // 更改场景背景色
  VRcore.Scene.add(this.box);
 }
 update() {
  this.box.rotation.y += 0.01;
 }
 }

这里我使用的是react的框架

// index.js
 import React, { Component } from 'react';
 import PropTypes from 'prop-types';
 import Page from './Page.js';
 class Oho extends Component {
 constructor() {
  super();
  this.init = this.init.bind(this);
 }
 componentDidMount() {
  const dom = document.querySelector('#Oho');
  this.init(dom);
 }
 init(dom) {
  const page = new Page({domContainer: dom});
 }
 render() {
  return (
  <div className="three-demo">
   <canvas id="Oho" ref="camera"></canvas>
  </div>
  );
 }
 }
 export default Oho;

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Javascript 类与静态类的实现(续)
Apr 02 Javascript
js 数值项目的格式化函数代码
May 14 Javascript
js修改原型的属性使用介绍
Jan 26 Javascript
avalonjs制作响应式瀑布流特效
May 06 Javascript
JavaScript简单获取系统当前时间完整示例
Aug 02 Javascript
jQuery实现图片滑动效果
Mar 08 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
Mar 31 Javascript
ES6中Generator与异步操作实例分析
Mar 31 Javascript
基于JavaScript实现微信抢红包功能
Jul 20 Javascript
微信小程序全局变量功能与用法详解
Jan 22 Javascript
JavaScript实现简单计时器
Jun 22 Javascript
详解Vue的列表渲染
Nov 20 Vue.js
js中this对象用法分析
Jan 05 #Javascript
Node中使用ES6语法的基础教程
Jan 05 #Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
Jan 05 #Javascript
vue脚手架中配置Sass的方法
Jan 04 #Javascript
Angular4学习教程之HTML属性绑定的方法
Jan 04 #Javascript
JS基于for语句编写的九九乘法表示例
Jan 04 #Javascript
JS计算输出100元钱买100只鸡问题的解决方法
Jan 04 #Javascript
You might like
php实现登录页面的简单实例
2019/09/29 PHP
自动生成文章摘要的代码[JavaScript 版本]
2007/03/20 Javascript
禁止选中文字兼容IE、Chrome、FF等
2013/09/04 Javascript
js实现收缩菜单效果实例代码
2013/10/30 Javascript
千分位数字格式化(用逗号隔开 代码已做了修改 支持0-9位逗号隔开)的JS代码
2013/12/05 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
javascript随机之洗牌算法深入分析
2014/06/07 Javascript
浅谈Javascript如何实现匀速运动
2014/12/19 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
2015/04/01 Javascript
javascript 的变量、作用域和内存问题
2017/04/19 Javascript
AngularJS学习笔记之表单验证功能实例详解
2017/07/06 Javascript
vue 2.0封装model组件的方法
2017/08/03 Javascript
详解Vue微信公众号开发踩坑全记录
2017/08/21 Javascript
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
详解angularjs 学习之 scope作用域
2018/01/15 Javascript
每周一练 之 数据结构与算法(Stack)
2019/04/16 Javascript
layui-table对返回的数据进行转变显示的实例
2019/09/04 Javascript
微信小程序中data-key属性之数据传输(经验总结)
2020/08/22 Javascript
JavaScript实现网页跨年倒计时
2020/12/02 Javascript
javascript中layim之查找好友查找群组
2021/02/06 Javascript
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
利用python程序生成word和PDF文档的方法
2017/02/14 Python
《与孩子一起学编程》python自测题
2018/05/27 Python
Django 限制用户访问频率的中间件的实现
2018/08/23 Python
python3+requests接口自动化session操作方法
2018/10/13 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
2018/12/10 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
使用Python实现分别输出每个数组
2019/12/06 Python
虚拟机下载python是否需要联网
2020/07/27 Python
Python 解析库json及jsonpath pickle的实现
2020/08/17 Python
罗兰·穆雷官网:Roland Mouret
2018/09/28 全球购物
英国护发和美妆在线商店:Klip Shop
2019/03/24 全球购物
软件测试有哪些?什么是配置项?
2012/02/12 面试题
房产代理公证处委托书
2014/04/04 职场文书
《恐龙》教学反思
2014/04/27 职场文书
企业宗旨标语
2014/06/10 职场文书