2014-01-06 54 views
1

我正在嘗試沿着路徑繪製一個管,並且TubeGeometry對象似乎是爲此而製作的。但是,有一個問題 - 我也希望半徑在路徑的每個點上都是可變的。基本上,我試圖繪製一個可變寬度的管。three.js可變半徑的管

我可以使用多個管和圓柱體繪製這個圖,但我不禁想到應該有更好的方法。

+0

是管直?如果是這樣,請使用'THREE.LatheGeometry'。 – WestLangley

+0

不幸的是,沒有。但是,謝謝你的建議! –

+2

那麼,你可以通過'TubeGeometry.js'來接受一個可變半徑作爲沿路徑距離的函數。 – WestLangley

回答

4

WestLangley的建議效果很好。我結束了創建基於THREE.TubeGeometry具有以下修改(R59)的一類:

  1. 改性構造參數半徑取表示在每個控制點的半徑的數字陣列。
  2. ,如下所示(導入posRadius變量和取代爲半徑)修改後的代碼:

    爲(I = 0;我<爲NumPoints;我++){ this.grid [I] = [];

    u = i/(numpoints - 1); 
    
    pos = path.getPointAt(u); 
    var posRadius = this.radius[Math.floor((this.radius.length - 1) * u)]; 
    
    tangent = tangents[i]; 
    normal = normals[i]; 
    binormal = binormals[i]; 
    
    for (j = 0; j < this.radialSegments; j++) { 
    
        v = j/this.radialSegments * 2 * Math.PI; 
        cx = -posRadius * Math.cos(v); // TODO: Hack: Negating it so it faces outside. 
        cy = posRadius * Math.sin(v); 
    
        pos2.copy(pos); 
        pos2.x += cx * normal.x + cy * binormal.x; 
        pos2.y += cx * normal.y + cy * binormal.y; 
        pos2.z += cx * normal.z + cy * binormal.z; 
    
        this.grid[i][j] = vert(pos2.x, pos2.y, pos2.z); 
    
    } 
    

    }