Giter Club home page Giter Club logo

Comments (1)

DannyMoerkerke avatar DannyMoerkerke commented on June 6, 2024

I use the following web component for this:

import {
  Scene,
  PerspectiveCamera,
  WebGLRenderer,
  BoxBufferGeometry,
  Mesh,
  MeshBasicMaterial,
  TextureLoader
} from 'three/build/three.module.js';

import {CustomElement} from '@dannymoerkerke/custom-element/dist/custom-element.es.js';
import '@dannymoerkerke/material-webcomponents/src/material-button.js';

export class DeviceOrientation extends CustomElement {

  static get observedAttributes() {
    return [];
  }

  constructor() {
    super();

    const shadowRoot = this.attachShadow({mode: 'open'});

    shadowRoot.innerHTML = `
      <style>
        #container {
          width: 100%;
          height: 300px;
        }
        
        #permission {
          margin-bottom: 15px;
        }
      </style>
       
      
       <material-button id="permission" label="Enable sensors" raised></material-button>
      
      <div id="container"></div>
    `;
  }

  connectedCallback() {
    this.permissionButton = this.select('#permission');

    this.permissionButton.addEventListener('click', async e => {
      const permission = await this.requestPermission();
    });

    this.deviceOrientationSupported() ? this.requestPermission() : this.hide(this.permissionButton);

    const container = this.shadowRoot.querySelector('#container');
    const {width, height} = container.getBoundingClientRect();

    const init = texture => {
      const scene = new Scene();
      const camera = new PerspectiveCamera(30, width / height, 0.1, 1000);
      const geometry = new BoxBufferGeometry(1, 1, 1);
      const material = new MeshBasicMaterial({map: texture});
      const cube = new Mesh(geometry, material);

      scene.add(cube);

      camera.position.z = 4;

      const renderer = new WebGLRenderer({antialias: true});
      renderer.setSize(width, height);
      renderer.setPixelRatio(window.devicePixelRatio);
      container.appendChild(renderer.domElement);

      renderer.render(scene, camera);

      if(window.DeviceOrientationEvent) {
        window.addEventListener('deviceorientation', ({beta, gamma}) => {
          requestAnimationFrame(() => {
            cube.rotation.x = parseInt(beta, 10) / 50;
            cube.rotation.y = parseInt(gamma, 10) / 50;

            renderer.render(scene, camera);
          });
        });
      }
    };

    new TextureLoader().load('../src/img/crate.gif', init);
  }

  deviceOrientationSupported() {
    return 'DeviceOrientationEvent' in window && 'requestPermission' in DeviceOrientationEvent;
  }

  async requestPermission() {
    let permission = null;

    try {
      permission = await DeviceOrientationEvent.requestPermission();
      this.hide(this.permissionButton);
    }
    catch(e) {
      this.show(this.permissionButton);
    }

    return permission;
  }
}

customElements.define('device-orientation', DeviceOrientation);

from whatpwacando.today.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.