まとめ
関数main(params)
{
// メインのエントリポイント。ここでは私たちのソリッドを構築します。
var gear = Gear(params).translate([dist,dist,0]);
パラメータ.numTeeth = パラメータ.numTeeth2;
パラメータ.circularPitch = パラメータ.circularPitch2;
パラメータ.圧力角度 = パラメータ.圧力角度2;
パラメータ.クリアランス = パラメータ.クリアランス2;
パラメータ.厚さ = パラメータ.厚さ2;
ギア = ギアとGear(パラメータ)の組み合わせ;
ギアを戻す;
}
関数 Gear(params)
{
// メインのエントリポイント。ここでは私たちのソリッドを構築します。
変速ギア = involuteGear(
パラメータのnumTeeth、
パラメーターのcircularPitch、
パラメータの圧力角度、
パラメータのクリアランス、
パラメータの厚さ
);
もし(params.centerholeradius > 0)ならば、
{
センターホール = CSG.cylinder({start: [0,0,-params.thickness], end: [0,0,params.thickness], radius: params.centerholeradius, resolution: 16});
ギア = ギア.subtract(センターホール);
}
ギアを戻します。
}
ここでは、ユーザーが編集できるパラメータを定義します。
関数 getParameterDefinitions() {
戻る [ ]
{ name: 'numTeeth', caption: '歯の数:', type: 'int', default: 15 },
{ name: 'circularPitch', caption: '円形ピッチ:', type: 'float', default: 10 },
{ name: 'pressureAngle', caption: '圧力角度:', type: 'float', default: 20 },
{ name: 'clearance', caption: 'クリアランス:', type: 'float', default: 0 },
{ name: 'thickness', caption: '厚さ:', type: 'float', default: 5 },
{ name: 'centerholeradius', caption: 'センターホールの半径(ホールがない場合は0):', type: 'float', default: 2 },
];
}
/*
ギアの用語については、以下をご覧ください。
http://www.astronomiainumbria.org/advanced_internet_files/meccanica/easyweb.easynet.co.uk/_chrish/geardata.htm
アルゴリズムは以下に基づいています。
http://www.cartertools.com/involute.html
サークルピッチ: ピッチサークルで測定された隣り合う歯の間の距離
*/
関数 involuteGear(numTeeth, circularPitch, pressureAngle, clearance, thickness)
{
// デフォルトの値:
もし引数の長さが3未満なら、プレッシャーアングルは20になります。
もし引数の長さが4未満なら、クリアランスは0になります。
もし引数の長さが4未満なら、厚さは1になります。
加算値 = 円周率 / 数学のπです。
var dedendum = addendum + clearance;
・4つの円の半径:
ピッチ半径はnumTeethになります。サークルピッチ / (2マス.PI);
ベース半径 = ピッチ半径マス.cos(マス.PI)プレッシャーアングル / 180);
変数outerRadiusは、ピッチ半径と加算値の合計になります。
ルート半径 = ピッチ半径 - デデンダム。
外半径の平方根を取ると、最大タイヤ長さが求められます。外半径 - ベース半径ベース半径);
変数maxangleは、最大タンレングスとベースラジアスの比です。
ピッチ円の半径を計算するには、Math.sqrt(pitchRadius)を使用します。ピッチ半径 - ベース半径ベース半径);
ピッチ円での角度は、tl_at_pitchcircle / baseRadius で計算されます。
var diffangle = angle_at_pitchcircle - Math.atan(angle_at_pitchcircle);
根元でのアンギュラー歯幅は、Math.PI / numTeeth + 2*diffangle です。
・'points' 配列に単一の2D歯を作成する:
変数 resolution の値は 5 です。
var points = [new CSG.Vector2D(0,0)];
for(var i = 0; i <= resolution; i++)
{
・歯の最初の側面:
角度 = 最大角度私/解決策;
変数tanlength = 角度ベース半径;
var radvector = CSG.Vector2D.fromAngle(angle);
var tanvector = radvector.normal();
var p = radvector.times(baseRadius).plus(tanvector.times(tanlength));
ポイント[i+1] = p;
』
・ポリゴンを作成し、3Dにエクストルードする:
var tooth3d = new CSG.Polygon2D(points).extrude({offset: [0, 0, thickness]});
var allteeth = new CSG();
for(var i = 0; i < numTeeth; i++)
{
変数angleは、i*360/numTeethで計算されます。
var rotatedtooth = tooth3d.rotateZ(angle);
allteeth = allteeth.unionForNonIntersecting(rotatedtooth);
}
// ルートサークルを作成する:
ポイント = [];
歯の角度は2です。マス.PI / ナムテス;
歯の中心角度は0.5です。ベースでの角度別歯幅;
for(var i = 0; i < numTeeth; i++)
{
変数angleは、toothCenterAngleとi * toothAngleの組み合わせになります。
var p = CSG.Vector2D.fromAngle(angle).times(rootRadius);
ポイント.push(p);
}
・ポリゴンを作成し、3Dにエクストルードする:
var rootcircle = new CSG.Polygon2D(points).extrude({offset: [0, 0, thickness]});
結果 = rootcircle.union(allteeth);
・原点にセンタリング:
結果 = 結果.translate([0, 0, -厚さ/2]);
結果を返します。
}
Tags
Model Source
