学习threejs 在WebGL中混合HTML页面

近期遇到一个问题,就是在webgl 中如加载html页面,翻遍了各个网站终于找到解决方案:

收先奉上大神的文章 http://learningthreejs.com/blog/2013/04/30/closing-the-gap-between-html-and-webgl/   可能需要爬过一个很高的wall,出去才能观看。

看了看时间是13年写的,想象那个时候,我还不知道html为何物

其中的主要思想就是,同时用到了  webglRenderer 和 CssRenderer 同时渲染:

这是老外的原话。

上一下主要代码

1.引入两个渲染器:

  <script src="./build//three.js"> </script>  //内部自带webgl渲染器
  <script src="./build/renderers/CSS3DRenderer.js"></script> //css3渲染器

2.创建两个渲染器并且添加到两个场景里:

glRenderer = createGlRenderer();//创建webgl 渲染器
cssRenderer = createCssRenderer();//创建 css 渲染器
document.body.appendChild(cssRenderer.domElement);
cssRenderer.domElement.appendChild(glRenderer.domElement);
glScene = new THREE.Scene();  //创建两个场景
cssScene = new THREE.Scene();

  function update() {

    controls.update();

    glRenderer.render(glScene, camera);

    cssRenderer.render(cssScene, camera);

    requestAnimationFrame(update);
  }

3.创建三维物体 ,放到三维场景中,创建dom物体,放到css 场景中

奉上示例代码

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>ADN CSS3D Demo</title>
  <style>
    body {
      background-color: #ffffff;
      margin: 0;
      overflow: hidden;
    }
  </style>
</head>

<body>

<script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
<script src="build/three.min.js"></script>
<script src="build/controls/TrackballControls.js"></script>
<script src="build/renderers/CSS3DRenderer.js"></script>

<script>

  ///
  // CSS3DRenderer Demo
  // By Philippe Leefsma, July 2015
  ///

  //References:
  //http://codereply.com/answer/83pofc/threejs-properly-blending-css3d-webgl.html
  //http://learningthreejs.com/blog/2013/04/30/closing-the-gap-between-html-and-webgl/

  var controls, camera, glScene, cssScene, glRenderer, cssRenderer;

  ///
  // Creates WebGL Renderer
  //
  ///
  function createGlRenderer() {

    var glRenderer = new THREE.WebGLRenderer({alpha:true});

    glRenderer.setClearColor(0xECF8FF);
    glRenderer.setPixelRatio(window.devicePixelRatio);
    glRenderer.setSize(window.innerWidth, window.innerHeight);

    glRenderer.domElement.style.position = 'absolute';
    glRenderer.domElement.style.zIndex = 1;
    glRenderer.domElement.style.top = 0;

    return glRenderer;
  }

  ///
  // Creates CSS Renderer
  //
  ///
  function createCssRenderer() {

    var cssRenderer = new THREE.CSS3DRenderer();

    cssRenderer.setSize(window.innerWidth, window.innerHeight);

    cssRenderer.domElement.style.position = 'absolute';
    glRenderer.domElement.style.zIndex = 0;
    cssRenderer.domElement.style.top = 0;

    return cssRenderer;
  }

  ///
  // Creates plane mesh
  //
  ///
  function createPlane(w, h, position, rotation) {

    var material = new THREE.MeshBasicMaterial({
      color: 0x000000,
      opacity: 0.0,
      side: THREE.DoubleSide
    });

    var geometry = new THREE.PlaneGeometry(w, h);

    var mesh = new THREE.Mesh(geometry, material);

    mesh.position.x = position.x;
    mesh.position.y = position.y;
    mesh.position.z = position.z;

    mesh.rotation.x = rotation.x;
    mesh.rotation.y = rotation.y;
    mesh.rotation.z = rotation.z;

    return mesh;
  }

  ///
  // Creates CSS object
  //
  ///
  function createCssObject(w, h, position, rotation, url) {

    var html = [

      '<div style="width:' + w + 'px; height:' + h + 'px;">',
      '<iframe src="' + url + '" width="' + w + '" height="' + h + '">',
      '</iframe>',
      '</div>'

    ].join('\n');

    // var div = document.createElement('div');
    // img.url='resources/la.png'

    var iframe =document.createElement('iframe')
    iframe.src='https://www.baidu.com';
    iframe.style.width = w+'px';
				iframe.style.height = h+'px';
				iframe.style.border = '0px';

    // $(div).html(html);
    // div.innerHTML=html
    // console.log(div.innerHTML)
    // document.getElementsByTagName('div')[0].innerHTML(html)
    // console.log(document.getElementsByTagName('div'))
    var cssObject = new THREE.CSS3DObject(iframe);

    cssObject.position.x = position.x;
    cssObject.position.y = position.y;
    cssObject.position.z = position.z;

    cssObject.rotation.x = rotation.x;
    cssObject.rotation.y = rotation.y;
    cssObject.rotation.z = rotation.z;

    return cssObject;
  }

  ///
  // Creates 3d webpage object
  //
  ///
  function create3dPage(w, h, position, rotation, url) {

    var plane = createPlane(
        w, h,
        position,
        rotation);

    glScene.add(plane);

    var cssObject = createCssObject(
        w, h,
        position,
        rotation,
        url);

    cssScene.add(cssObject);
  }

  ///
  // Creates material with random color
  //
  ///
  function createColoredMaterial() {

    var material = new THREE.MeshBasicMaterial({
      color: Math.floor(Math.random() * 16777215),
      shading: THREE.FlatShading,
      side: THREE.DoubleSide
    });

    return material;
  }

  ///
  // Creates 3D geometry to place in the scene
  //
  ///
  function create3dGeometry() {

    var mesh1 = new THREE.Mesh(
      new THREE.CylinderGeometry(0, 200, 300, 20, 4),
      createColoredMaterial());

    mesh1.position.x = 0;
    mesh1.position.y = -300;
    mesh1.position.z = 400;

    glScene.add(mesh1);

    var mesh2 = new THREE.Mesh(
      new THREE.BoxGeometry(200, 200, 200),
      createColoredMaterial());

    mesh2.position.x = -300;
    mesh2.position.y = -300;
    mesh2.position.z = 400;

    glScene.add(mesh2);


    var mesh3 = new THREE.Mesh(
        new THREE.SphereGeometry(100, 128, 128),
        createColoredMaterial());

    mesh3.position.x = 500;
    mesh3.position.y = -300;
    mesh3.position.z = 400;

    glScene.add(mesh3);
  }

  ///
  // Initializes scene
  //
  ///
  function initialize() {

    camera = new THREE.PerspectiveCamera(
      45,
      window.innerWidth / window.innerHeight,
      1,
      10000);

    camera.position.set(0, 100, 3000);

    controls = new THREE.TrackballControls(camera);

    glRenderer = createGlRenderer();
    cssRenderer = createCssRenderer();

    //document.body.appendChild(glRenderer.domElement);

    document.body.appendChild(cssRenderer.domElement);
    cssRenderer.domElement.appendChild(glRenderer.domElement);

    glScene = new THREE.Scene();
    cssScene = new THREE.Scene();

    var ambientLight = new THREE.AmbientLight(0x555555);
    glScene.add(ambientLight);

    var directionalLight = new THREE.DirectionalLight(0xffffff);
    directionalLight.position.set( -.5, .5, -1.5 ).normalize();
    glScene.add(directionalLight);

    create3dPage(
      1000, 1000,
      new THREE.Vector3(-1050, 0, 400),
      new THREE.Vector3(0, 45 * Math.PI / 180, 0),
      'https://www.baidu.com');

    create3dPage(
      900, 1000,
      new THREE.Vector3(0, 0, 0),
      new THREE.Vector3(0, 0, 0),
      'https://www.baidu.com');

    create3dPage(
      1000, 1000,
      new THREE.Vector3(1050, 0, 400),
      new THREE.Vector3(0, -45 * Math.PI / 180, 0),
      'https://www.baidu.com');

    create3dGeometry();

    update();
  }

  ///
  // Updates scene
  //
  ///
  function update() {

    controls.update();

    glRenderer.render(glScene, camera);

    cssRenderer.render(cssScene, camera);

    requestAnimationFrame(update);
  }

  ///
  // On document ready
  //
  ///
  // $(document ).ready(function() {
  //   initialize();
  // });
  initialize();
</script>
</body>
</html>

最后实现的效果:

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值