Добавление Three.js в класс LitElement - PullRequest
0 голосов
/ 15 ноября 2018

Я учусь интегрировать Three.js в Lit-элемент Полимера. Моя текущая проблема заключается в том, что мне нужно обратиться к элементу div для добавления элемента Three Renderer. Вот как это обычно делается:

box = document.getElementById("box")
box.appendChild(renderer.domElement)

К сожалению, я не могу найти, как ссылаться из конструктора () / firstUpdate () на div, объявленный в функции рендеринга. Как бы вы это сделали?

Вот мой лучший результат на данный момент: Элемент рендеринга вне цели

Вот код для получения этого результата: HTML:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>

    <box-test></box-test>

    <script type="module" src="src/components/box-test.js" crossorigin></script>
</body>
</html>

Javascript:

import { LitElement, html } from '@polymer/lit-element'; 

import * as THREE from 'three/build/three.module';



class BoxTest extends LitElement  {

    constructor() {
      super();
      var scene = new THREE.Scene();
      var camera = new THREE.PerspectiveCamera(75, 1, 0.1, 1000);

      var renderer = new THREE.WebGLRenderer();
      renderer.setSize(300, 300);

      //box = document.getElementById("box");
      document.body.appendChild(renderer.domElement);



      var geometry = new THREE.BoxGeometry(1, 1, 1);
      var material = new THREE.MeshBasicMaterial({ color: 0x00ff00, wireframe: true });
      var cube = new THREE.Mesh(geometry, material);
      scene.add(cube);

      camera.position.z = 5;

      var animate = function () {
        requestAnimationFrame(animate);

        cube.rotation.x += 0.01;
        cube.rotation.y += 0.01;

        renderer.render(scene, camera);
      };

      animate();
    }


  render() {
    return html`
    <style>
      #box { border: 1px solid red; height: 310px; width: 310px;}
    </style>

    <section>
    The webgl animation must be in the red box
    <div id="box">
    </div>

    </section>
    `
  }

}

window.customElements.define('box-test', BoxTest);

Любое предложение будет приветствоваться.

1 Ответ

0 голосов
/ 15 ноября 2018

В вашей функции constructor вы можете сохранить переменные для использования в других функциях позже, установив для нее значение this

this.renderer = renderer

Затем в функции firstUpdated вы можете выполнить

firstUpdated () {
  let box = this.shadowRoot.getElementById('box')
  box.appendChild(this.renderer.domElement)
}

Пример кода:

<script type='module'>
  import { LitElement, html } from '@polymer/lit-element'
  import * as THREE from 'three/build/three.module'

  class BoxTest extends LitElement {
    constructor () {
      super()

      var scene = new THREE.Scene()
      var camera = new THREE.PerspectiveCamera(75, 1, 0.1, 1000)
      var geometry = new THREE.BoxGeometry(1, 1, 1)
      var material = new THREE.MeshBasicMaterial({ color: 0x00ff00, wireframe: true })
      var cube = new THREE.Mesh(geometry, material)

      scene.add(cube)
      camera.position.z = 5

      ;(function animate () {
        requestAnimationFrame(animate)
        cube.rotation.x += 0.01
        cube.rotation.y += 0.01
        renderer.render(scene, camera)
      }())

      var renderer = new THREE.WebGLRenderer()
      renderer.setSize(300, 300)
      this.renderer = renderer
    }

    firstUpdated () {
      let box = this.shadowRoot.getElementById('box')
      box.appendChild(this.renderer.domElement)
    }

    render () {
      return html`
        <style>
          #box { border: 1px solid red; height: 310px; width: 310px;}
        </style>

        <section>
          The webgl animation must be in the red box
          <div id="box"></div>
        </section>
      `
    }
  }

  window.customElements.define('box-test', BoxTest)
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...