angular - Threejs: Rita armbåge med start- och slutradie


Jag är ny på Threejs. Jag försöker rita en armbåge med olika begin_radius och end_radius längs en kurvväg med curve_radius och en angle, men kunde inte uppnå resultat.

  • CylinderGeometry har begin_radius och end_radius men har ingen kurvad väg
  • TorusGeometry har curve_radius och angle men har inte begin_radius och end_radius, och det är inte solitt.
  • LatheGeometry hade samma begränsning som CylinderGeometry
  • ExtrudeGeometry hade samma begränsning som TorusGeometry
  • TubeGeometry hade samma begränsning som TorusGeometry

Jag tittar förmodligen över de ovanstående geometriska formerna. Vänligen vägled mig med någon metod.

--REDIGERA: 1 juni 2020--

https://jsfiddle.net/arundhaj/ysfr8jb0 Jag har på något sätt lyckats utöka TubeGeometry för att uppnå variabel radie. Dock har jag fortfarande inte kunnat göra det solitt. Jag har tagit generateCap-funktionen från CylinderGeometry för att lägga till lock i början och slutet av bågen. Det fungerar bra när jag bara lägger till ett lock, men om jag lägger till båda locken blir formen förvrängd.

Vänligen hjälp.

Svar #1

Enligt mig tror jag att den bästa lösningen skulle vara att anpassa en torus-geometri för att ha åtminstone begin_radius och end_radius-parametrarna.

Det du skulle kunna göra är att ta originalfilen och ersätta det statiska radius-argumentet med en gradientdefinition där:

for ( j = 0; j <= radialSegments; j ++ ) {

      for ( i = 0; i <= tubularSegments; i ++ ) {

          var u = i / tubularSegments * arc;          
          var v = j / radialSegments * Math.PI * 2;

          // vertex

          vertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );
          vertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );
          vertex.z = tube * Math.sin( v );

          vertices.push( vertex.x, vertex.y, vertex.z );

          // normal

          center.x = radius * Math.cos( u );          
          center.y = radius * Math.sin( u );          
          normal.subVectors( vertex, center ).normalize();

          normals.push( normal.x, normal.y, normal.z );

          // uv

          uvs.push( i / tubularSegments );            
          uvs.push( j / radialSegments );

      }

  }

Det återstående problemet skulle bara vara att förstå hur man korrekt ökar de rätta parametrarna, du skulle behöva testa lite för att förstå vilka parametrar du behöver ändra.