如何在 Three.js 中重新创建此扫描 nurbs 模型?

Chr*_*ris 1 three.js

在 Cinema4d 中,该模型是使用扫掠 nurb 中的两个圆圈制作的。一个圆是轮廓样条线,它沿着另一圆路径扫掠。使用 Sweep Nurbs,您可以指定开始和停止完成百分比和比例等。

在此输入图像描述

有没有办法在三个js中重现这个?我想我可以将其导出到 STL,但我更喜欢 3.js 自己管理它的方法。

更新:

我设置了一系列 CircleGeometry 来旋转以获得这种效果。

一连串的圆圈围成一圈

var startR = .6,
    incR = .0049;

for (var p = 0; p < 110; p++) {
    var r = startR - (incR * p);
    var geometry = new THREE.CircleGeometry(r, 12);
    var material = new THREE.MeshBasicMaterial( { color: 0x000000 } );
    material.side = THREE.DoubleSide;
    geometry.applyMatrix( new THREE.Matrix4().makeTranslation( -7, 0, 0 ) );

    var circle = new THREE.Mesh( geometry, material );
    circle.rotation.y += p * 0.05

    scene.add(circle);
}
Run Code Online (Sandbox Code Playgroud)

那么下一步也许是将这些圆形几何图形组合成一个对象?

pri*_*849 5

如果我猜对了,那么你就可以弯曲一个圆锥体。

创建圆柱体几何体。它有半径顶部(r1),半径底部(r2)。其高度等于弯曲角度( theta)。我们还需要弯曲半径 ( rMain)。创建几何图形后,将其平移到 的点(rMain, theta / 2, 0)。毕竟,对几何中的每个顶点应用这样的变换,使其新位置位于极坐标中,其中半径是 x 值,角度是 y 值。

function bendTheCone(r1, r2, rMain, theta, segments){
  var geom = new THREE.CylinderBufferGeometry(r1, r2, theta, 16, segments);
  geom.translate(rMain, theta / 2 ,0);
  var position=geom.position;
  for(var i=0; i<position.count;i++){
    var localTheta = position.getY(i);
    var localRadius = position.getX(i);
    position.setXY(i,Math.cos(localTheta) * localRadius,
      Math.sin(localTheta) * localRadius);
  }

  geom.computeVertexNormals();

  return geom;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

var geometry = bendTheCone(0.1, 0.5, 10, THREE.Math.degToRad(320), 60);
var mesh = new THREE.Mesh(geometry, new THREE.MeshNormalMaterial());
scene.add(mesh);
Run Code Online (Sandbox Code Playgroud)

jsfiddle示例