2017-01-02 155 views
1

在Cinema4d中,这个模型使用两个圆圈扫描nurbs。一个圆是轮廓样条曲线,并沿另一个圆弧路径扫描。随着扫描的Nurbs您可以指定启动和停止的完成率和规模等如何在Three.js中重新创建此扫描nurbs模型?

enter image description here

有没有一种方式重现这三个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); 
 
}

所以,也许下一步就是这些圈的几何形状,结合一个对象?

回答

2

如果我找到你的话,那么你可以弯曲一个锥体。

创建一个圆柱几何。它有radiusTop(r1),radiusBottom(r2)。其高度等于弯曲角度(theta)。我们还需要弯曲半径(rMain)。创建几何图形后,将其转换为点号(rMain, theta/2, 0)。最后,对几何体中的每个顶点应用这种变换,以使其新位置位于极坐标中,其中半径是x值,角度是y值。

function bendTheCone(r1, r2, rMain, theta, segments){ 
    var geom = new THREE.CylinderGeometry(r1, r2, theta, 16, segments); 
    geom.translate(rMain, theta/2 ,0); 

    geom.vertices.forEach(function(vertex){ 
    var localTheta = vertex.y; 
    var localRadius = vertex.x; 
    vertex.x = Math.cos(localTheta) * localRadius; 
    vertex.y = Math.sin(localTheta) * localRadius; 
    }); 

    geom.computeFaceNormals(); 
    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例如

+0

这是辉煌的。谢谢! – Chris