代码之家  ›  专栏  ›  技术社区  ›  nluigi

3.js-用弧生成形状

  •  0
  • nluigi  · 技术社区  · 6 年前

    我试图在Three.js中重新创建一个screw元素,类似于下图:

    enter image description here

    fiddle .

    然而,我很困惑什么是最好的方法来产生正确的形状。如下图所示,形状应由不同半径的圆弧组成,这些圆弧从一个点延伸到另一个点:

    enter image description here

    Shape 对于圆弧来说似乎太复杂了。我可以用 ellipse 用一个 Path 路径 形状 似乎不可能/或没有详细记录。

    如何使用 路径 形状 ShapePath 使用圆弧,我可以指定中心、半径和延伸角度,然后在扭曲形状的同时挤压它?

    1 回复  |  直到 6 年前
        1
  •  1
  •   prisoner849    6 年前

    只是一个选择 THREE.Shape()

    var scene = new THREE.Scene();
    var camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 1000);
    camera.position.set(0, 0, 5);
    var renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);
    
    var controls = new THREE.OrbitControls(camera, renderer.domElement);
    
    var shape = new THREE.Shape();
    shape.absarc(0, -4, 5, THREE.Math.degToRad(60), THREE.Math.degToRad(120));
    shape.absarc(0, 4, 5, THREE.Math.degToRad(240), THREE.Math.degToRad(300));
    
    var extrudeGeom = new THREE.ExtrudeGeometry(shape, {
      steps: 180,
      depth: 4,
      bevelEnabled: false
    });
    
    var axis = new THREE.Vector3(0, 0, 1);
    extrudeGeom.vertices.forEach(v => {
      v.applyAxisAngle(axis, v.z * Math.PI);
    });
    
    extrudeGeom.computeFaceNormals();
    extrudeGeom.computeVertexNormals();
    
    var mesh = new THREE.Mesh(extrudeGeom, new THREE.MeshBasicMaterial({
      color: "red",
      wireframe: true
    }));
    mesh.rotation.y = Math.PI;
    
    scene.add(mesh);
    
    var profile = new THREE.LineLoop(new THREE.BufferGeometry().setFromPoints(shape.getPoints()), new THREE.LineBasicMaterial({
      color: "yellow",
      depthTest: false
    }));
    mesh.add(profile);
    
    
    render();
    
    function render() {
      requestAnimationFrame(render);
      renderer.render(scene, camera);
    }
    body {
      overflow: hidden;
      margin: 0;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/95/three.min.js"></script>
    <script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>