在 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)
那么下一步也许是将这些圆形几何图形组合成一个对象?
如果我猜对了,那么你就可以弯曲一个圆锥体。
创建圆柱体几何体。它有半径顶部(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示例
归档时间: |
|
查看次数: |
725 次 |
最近记录: |