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

如何围绕边旋转三角形?

  •  3
  • Paul  · 技术社区  · 8 年前

    一个三角形怎么能有三个呢。js,围绕它的一条边旋转?当我试着旋转它时,它是围绕它的中心旋转的。

    三角形由以下部分组成:

    var triangleMesh; 
    var triangleGeometry = new THREE.Geometry(); 
        triangleGeometry.vertices.push( new THREE.Vector3( 0.0, 1.0, 0.0 ) ); 
        triangleGeometry.vertices.push( new THREE.Vector3( -1.0, -1.0, 0.0 ) ); 
        triangleGeometry.vertices.push( new THREE.Vector3( 1.0, -1.0, 0.0 ) ); 
    
        triangleGeometry.faces.push( new THREE.Face3( 0, 1, 2 ) ); 
    
        triangleGeometry.faces[0].vertexColors[0] = new THREE.Color(0xFF0000); 
        triangleGeometry.faces[0].vertexColors[1] = new THREE.Color(0x00FF00); 
        triangleGeometry.faces[0].vertexColors[2] = new THREE.Color(0x0000FF); 
    
    var triangleMaterial = new THREE.MeshBasicMaterial({ vertexColors:THREE.VertexColors, side:THREE.DoubleSide }); 
    
        triangleMesh = new THREE.Mesh( triangleGeometry, triangleMaterial ); 
        triangleMesh.position.set(-1.5, 0.0, 4.0 ); 
    
        triangleMesh.position.z     -=  5;
        triangleMesh.rotation.z     +=  angle * Math.PI / 180; // angle is from outer for loop
    
        parent.add( triangleMesh );
    

    我需要围绕一条边旋转它来构建棱柱体/六边形。

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

    要围绕三角形的一个角旋转三角形,该角必须位于坐标中心。为此,您可以使用 .translate ( x, y, z ) 方法 THREE.Geometry() .

    看看代码片段。

    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({
      antialias: true
    });
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);
    
    var ngon = 11;
    var radius = 2;
    var angle = Math.PI / ngon;
    var triHeight = Math.cos(angle) * radius;
    var triWidth = Math.sin(angle) * radius;
    
    var triangleMesh;
    var triangleGeometry = new THREE.Geometry();
    triangleGeometry.vertices.push(new THREE.Vector3(0.0, triHeight, 0.0));
    triangleGeometry.vertices.push(new THREE.Vector3(-triWidth, 0, 0.0));
    triangleGeometry.vertices.push(new THREE.Vector3(triWidth, 0, 0.0));
    
    triangleGeometry.faces.push(new THREE.Face3(0, 1, 2));
    
    triangleGeometry.faces[0].vertexColors[0] = new THREE.Color(0xFF0000);
    triangleGeometry.faces[0].vertexColors[1] = new THREE.Color(0x00FF00);
    triangleGeometry.faces[0].vertexColors[2] = new THREE.Color(0x0000FF);
    
    triangleGeometry.translate(0, -triHeight, 0); // the upper vertex is at the center  now
    
    var triangleMaterial = new THREE.MeshBasicMaterial({
      vertexColors: THREE.VertexColors,
      side: THREE.DoubleSide
    });
    
    triangleMesh = new THREE.Mesh(triangleGeometry, triangleMaterial);
    
    for (var i = 1; i < ngon; i++) {
      var newTri = triangleMesh.clone();
      newTri.rotation.z = i * angle * 2;
      scene.add(newTri);
    }
    
    scene.add(triangleMesh);
    
    render();
    
    function render() {
      requestAnimationFrame(render);
      renderer.render(scene, camera);
    }
    body {
      overflow: hidden;
      margin: 0;
    }
    <script src="https://threejs.org/build/three.min.js"></script>