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

时间:2017-01-02 22:55:52

标签: three.js

在Cinema4d中,这个模型是使用扫描nurbs中的两个圆圈制作的。一个圆是轮廓样条,它沿另一个圆路径扫过。使用Sweep Nurbs,您可以指定开始和结束完成百分比和比例等。

enter image description here

有没有办法在Three js中重现这个?我想我可以将它导出到STL,但我更倾向于让3.js自己管理它。

更新

我设置了一系列CircleGeometry来旋转这个效果。

Series of circles going around in a circle

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

那么下一步可能是将这些圆几何结合到一个对象中吗?

1 个答案:

答案 0 :(得分:3)

如果我找对你,那么你可以弯曲一个圆锥。

创建圆柱几何体。它有radiusTop(r1),radiusBottom(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;
}

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

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

jsfiddle示例