Три js: начертите колено с начальным и конечным радиусами. - PullRequest
2 голосов
/ 26 мая 2020

Я новичок в Three js. Я пытаюсь нарисовать локоть с разными begin_radius и end_radius вдоль кривой с помощью curve_radius и angle, но не смог добиться результатов.

  • CylinderGeometry имеют begin_radius и end_radius, но не имеют пути кривой
  • TorusGeometry имеют curve_radius и angle, но не имеют begin_radius и end_radius, а также его не solid.
  • LatheGeometry имел такое же ограничение, что и CylinderGeometry
  • ExtrudeGeometry имел такое же ограничение, как TorusGeometry
  • TubeGeometry имело такое же ограничение как TorusGeometry

Вероятно, я упускаю из виду вышеуказанные геометрические формы. Пожалуйста, укажите подход.

- РЕДАКТИРОВАТЬ: 1 июня 2020 г. -

https://jsfiddle.net/arundhaj/ysfr8jb0 Мне как-то удалось продлить TubeGeometry для достижения переменного радиуса. Однако до сих пор не смог сделать это solid. Я взял функцию generateCap из CylinderGeomery, чтобы добавить заглавные буквы в начале и в конце ар c. Он отлично работает, когда я добавляю только один колпачок, однако, если я добавляю оба колпачка, форма искажается.

Пожалуйста, помогите.

enter image description here

1 Ответ

2 голосов
/ 26 мая 2020

На мой взгляд, лучшим решением было бы настроить геометрию тора, чтобы иметь по крайней мере параметры begin_radius и end_radius.

Что вы могли бы сделать, это взять исходный файл и заменить аргумент stati c radius определением градиента в нем:

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 );

      }

  }

Оставшаяся проблема будет заключаться в том, чтобы понять, как правильно увеличить правильные параметры, вам нужно будет немного протестировать, чтобы понять, какие параметры вам нужно изменить.

...