如何在three.js中加载和显示SVG图形?

时间:2018-01-20 22:56:34

标签: svg three.js

考虑一下,我有一个SVG矢量图形文件(标识),我想加载并显示在three.js中(使用WebGL渲染器)。

建议的方法是什么?

似乎我需要加载图像并从中创建几何图形和网格。

我已设法使用THREE.SVGLoader加载SVG文档,但我无法找到有关如何从中进一步创建几何/网格的任何相关信息。

function preload () {

  const svgLoader = new THREE.SVGLoader();

  svgLoader.load('images/logo.svg', svgDocument => {

    // @todo: create a geometry/mesh from svgDocument?

    // @todo: scene.add(logoMesh);

  });

}

1 个答案:

答案 0 :(得分:0)

纹理

如果您只需要纹理用途svg:

  1. 将svg图像渲染到画布
  2. 使用该画布作为纹理源
  3. 在场景中使用纹理......
  4. 免责声明我不是此代码的作者,我刚刚修复了我发现的jsfiddle

    
    
    window.onload = () => {
      var mesh;
      var scene = new THREE.Scene();
    
      var camera = new THREE.PerspectiveCamera(50, 500 / 400, 0.1, 1000);
      camera.position.z = 10;
    
      var renderer = new THREE.WebGLRenderer({ antialias: true });
      renderer.setSize(500, 400);
      document.body.appendChild(renderer.domElement);
    
      var svg = document.getElementById("svgContainer").querySelector("svg");
      var svgData = (new XMLSerializer()).serializeToString(svg);
    
      var canvas = document.createElement("canvas");
      var svgSize = svg.getBoundingClientRect();
      canvas.width = svgSize.width;
      canvas.height = svgSize.height;
      var ctx = canvas.getContext("2d");
    
      var img = document.createElement("img");
      img.setAttribute("src", "data:image/svg+xml;base64," + window.btoa(unescape(encodeURIComponent(svgData))) );
    
      img.onload = function() {
        ctx.drawImage(img, 0, 0);
    
        var texture = new THREE.Texture(canvas);
        texture.needsUpdate = true;
    
        var geometry = new THREE.SphereGeometry(3, 50, 50, 0, Math.PI * 2, 0, Math.PI * 2);
        var material = new THREE.MeshBasicMaterial({ map: texture });
        material.map.minFilter = THREE.LinearFilter;
        mesh = new THREE.Mesh(geometry, material);
        scene.add(mesh);
      };
    
      var render = function () {
          requestAnimationFrame(render);
          mesh.rotation.y += 0.01;
          renderer.render(scene, camera);
      };
    
      render();
    }
    
    <script src="https://threejs.org/build/three.min.js"></script>
    
    <div id="svgContainer" style="width: 222px; height: 222px;">
      <svg width="200" height="200" xmlns="http://www.w3.org/2000/svg" version="1.1">
        <rect width="200" height="200" fill="lime" stroke-width="4" stroke="pink" />
        <circle cx="125" cy="125" r="75" fill="orange" />
        <polyline points="50,150 50,200 200,200 200,100" stroke="red" stroke-width="4" fill="none" />
        <line x1="50" y1="50" x2="200" y2="200" stroke="blue" stroke-width="4" />
      </svg>
    </div>
    &#13;
    &#13;
    &#13;

    如果您想将svg渲染为几何体,我建议使用一些库,例如: svg-mesh-3d

    来自svg-mesh-3d

    的文档的示例
        var loadSvg = require('load-svg')
        var parsePath = require('extract-svg-path').parse
        var svgMesh3d = require('svg-mesh-3d')
    
        loadSvg('svg/logo.svg', function (err, svg) {
          if (err) throw err
    
          var svgPath = parsePath(svg)
          var mesh = svgMesh3d(svgPath, {
            delaunay: false,
            scale: 4
          })
        })
    

    混合机

    替代选项是使用blender导入svg,(可选)调整几何体并使用Three.js Blender Export将其导出到Three.js