在Cinema4d中,这个模型是使用扫描nurbs中的两个圆圈制作的。一个圆是轮廓样条,它沿另一个圆路径扫过。使用Sweep Nurbs,您可以指定开始和结束完成百分比和比例等。
有没有办法在Three 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);
}
那么下一步可能是将这些圆几何结合到一个对象中吗?
答案 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示例