基於three.js編寫的一個項目類範例程式碼,three.js範例程式碼

來源:互聯網
上載者:User

基於three.js編寫的一個項目類範例程式碼,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基類其中包含了情境,相機,渲染器,控制器以及一些方法

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對幫客之家的支援。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.