首页 > web前端 > js教程 > 正文

three.js编写的一个项目类示例代码分享

小云云
发布: 2018-01-08 09:05:08
原创
1888人浏览过

本文主要给大家介绍了关于基于three.js编写的一个项目类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

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基类其中包含了场景,相机,渲染器,控制器以及一些方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

// 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项目

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

// 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方法来进行动画效果

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

// 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的框架

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

// 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 (

 <p className="three-demo">

  <canvas id="Oho" ref="camera"></canvas>

 </p>

 );

}

}

export default Oho;

登录后复制

相关推荐:

three.js实现3D模型展示

实例讲解three.js加载obj模型

实例讲解Three.js加载外部模型

以上就是three.js编写的一个项目类示例代码分享的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号