📄 spurgear.java
字号:
toothFaceStripCount);
for(int count = 0; count < toothCount; count++) {
index = count * toothFacetVertexCount;
toothStartAngle
= gearStartAngle + circularPitchAngle * (double)count;
toothTopStartAngle = toothStartAngle + toothTopAngleIncrement;
toothDeclineStartAngle
= toothStartAngle + toothDeclineAngleIncrement;
toothValleyStartAngle
= toothStartAngle + toothValleyAngleIncrement;
xRoot0 = rootRadius * (float)Math.cos(toothStartAngle);
yRoot0 = rootRadius * (float)Math.sin(toothStartAngle);
xOuter1 = outsideRadius * (float)Math.cos(toothTopStartAngle);
yOuter1 = outsideRadius * (float)Math.sin(toothTopStartAngle);
xOuter2 = outsideRadius * (float)Math.cos(toothDeclineStartAngle);
yOuter2 = outsideRadius * (float)Math.sin(toothDeclineStartAngle);
xRoot3 = rootRadius * (float)Math.cos(toothValleyStartAngle);
yRoot3 = rootRadius * (float)Math.sin(toothValleyStartAngle);
tempCoordinate1.set(xRoot0, yRoot0, frontZ);
tempCoordinate2.set(xRoot3, yRoot3, frontZ);
tempVector1.sub(tempCoordinate2, tempCoordinate1);
tempCoordinate2.set(xOuter1, yOuter1, toothTipFrontZ);
tempVector2.sub(tempCoordinate2, tempCoordinate1);
frontToothNormal.cross(tempVector1, tempVector2);
frontToothNormal.normalize();
coordinate.set(xOuter1, yOuter1, toothTipFrontZ);
frontGearTeeth.setCoordinate(index, coordinate);
frontGearTeeth.setNormal(index, frontToothNormal);
coordinate.set(xRoot0, yRoot0, frontZ);
frontGearTeeth.setCoordinate(index + 1, coordinate);
frontGearTeeth.setNormal(index + 1, frontToothNormal);
coordinate.set(xOuter2, yOuter2, toothTipFrontZ);
frontGearTeeth.setCoordinate(index + 2, coordinate);
frontGearTeeth.setNormal(index + 2, frontToothNormal);
coordinate.set(xRoot3, yRoot3, frontZ);
frontGearTeeth.setCoordinate(index + 3, coordinate);
frontGearTeeth.setNormal(index + 3, frontToothNormal);
}
newShape = new Shape3D(frontGearTeeth, look);
this.addChild(newShape);
/* Construct the gear's rear facing teeth facets (Using Quads)
* 1______2
* / \
* / \
* / \
* /____________\
* 0 3
*/
toothFacetVertexCount = 4;
toothFaceTotalVertexCount = toothFacetVertexCount * toothCount;
QuadArray rearGearTeeth
= new QuadArray(toothCount * toothFacetVertexCount,
GeometryArray.COORDINATES
| GeometryArray.NORMALS);
for(int count = 0; count < toothCount; count++) {
index = count * toothFacetVertexCount;
toothStartAngle =
gearStartAngle + circularPitchAngle * (double)count;
toothTopStartAngle = toothStartAngle + toothTopAngleIncrement;
toothDeclineStartAngle
= toothStartAngle + toothDeclineAngleIncrement;
toothValleyStartAngle = toothStartAngle + toothValleyAngleIncrement;
xRoot0 = rootRadius * (float)Math.cos(toothStartAngle);
yRoot0 = rootRadius * (float)Math.sin(toothStartAngle);
xOuter1 = outsideRadius * (float)Math.cos(toothTopStartAngle);
yOuter1 = outsideRadius * (float)Math.sin(toothTopStartAngle);
xOuter2 = outsideRadius * (float)Math.cos(toothDeclineStartAngle);
yOuter2 = outsideRadius * (float)Math.sin(toothDeclineStartAngle);
xRoot3 = rootRadius * (float)Math.cos(toothValleyStartAngle);
yRoot3 = rootRadius * (float)Math.sin(toothValleyStartAngle);
tempCoordinate1.set(xRoot0, yRoot0, rearZ);
tempCoordinate2.set(xRoot3, yRoot3, rearZ);
tempVector1.sub(tempCoordinate2, tempCoordinate1);
tempCoordinate2.set(xOuter1, yOuter1, toothTipRearZ);
tempVector2.sub(tempCoordinate2, tempCoordinate1);
rearToothNormal.cross(tempVector2, tempVector1);
rearToothNormal.normalize();
coordinate.set(xRoot0, yRoot0, rearZ);
rearGearTeeth.setCoordinate(index, coordinate);
rearGearTeeth.setNormal(index, rearToothNormal);
coordinate.set(xOuter1, yOuter1, toothTipRearZ);
rearGearTeeth.setCoordinate(index + 1, coordinate);
rearGearTeeth.setNormal(index + 1, rearToothNormal);
coordinate.set(xOuter2, yOuter2, toothTipRearZ);
rearGearTeeth.setCoordinate(index + 2, coordinate);
rearGearTeeth.setNormal(index + 2, rearToothNormal);
coordinate.set(xRoot3, yRoot3, rearZ);
rearGearTeeth.setCoordinate(index + 3, coordinate);
rearGearTeeth.setNormal(index + 3, rearToothNormal);
}
newShape = new Shape3D(rearGearTeeth, look);
this.addChild(newShape);
/*
* Construct the gear's top teeth faces (As seen from above)
* Root0 Outer1 Outer2 Root3 Root4 (RearZ)
* 0_______3 2_______5 4_______7 6_______9
* |0 3| |4 7| |8 11| |12 15|
* | | | | | | | |
* | | | | | | | |
* |1_____2| |5_____6| |9____10| |13___14|
* 1 2 3 4 5 6 7 8
* Root0 Outer1 Outer2 Root3 Root4 (FrontZ)
*
* Quad 0123 uses a left normal
* Quad 2345 uses an out normal
* Quad 4567 uses a right normal
* Quad 6789 uses an out normal
*/
topVertexCount = 8 * toothCount + 2;
topStripCount[0] = topVertexCount;
toothFacetVertexCount = 4;
toothFacetCount = 4;
QuadArray topGearTeeth
= new QuadArray(toothCount * toothFacetVertexCount
* toothFacetCount,
GeometryArray.COORDINATES
| GeometryArray.NORMALS);
for(int count = 0; count < toothCount; count++) {
index = count * toothFacetCount * toothFacetVertexCount;
toothStartAngle = gearStartAngle +
circularPitchAngle * (double)count;
toothTopStartAngle = toothStartAngle + toothTopAngleIncrement;
toothDeclineStartAngle
= toothStartAngle + toothDeclineAngleIncrement;
toothValleyStartAngle
= toothStartAngle + toothValleyAngleIncrement;
nextToothStartAngle = toothStartAngle + circularPitchAngle;
xRoot0 = rootRadius * (float)Math.cos(toothStartAngle);
yRoot0 = rootRadius * (float)Math.sin(toothStartAngle);
xOuter1 = outsideRadius * (float)Math.cos(toothTopStartAngle);
yOuter1 = outsideRadius * (float)Math.sin(toothTopStartAngle);
xOuter2 = outsideRadius * (float)Math.cos(toothDeclineStartAngle);
yOuter2 = outsideRadius * (float)Math.sin(toothDeclineStartAngle);
xRoot3 = rootRadius * (float)Math.cos(toothValleyStartAngle);
yRoot3 = rootRadius * (float)Math.sin(toothValleyStartAngle);
xRoot4 = rootRadius * (float)Math.cos(nextToothStartAngle);
yRoot4 = rootRadius * (float)Math.sin(nextToothStartAngle);
// Compute normal for quad 1
tempCoordinate1.set(xRoot0, yRoot0, frontZ);
tempCoordinate2.set(xOuter1, yOuter1, toothTipFrontZ);
tempVector1.sub(tempCoordinate2, tempCoordinate1);
leftNormal.cross(frontNormal, tempVector1);
leftNormal.normalize();
// Coordinate labeled 0 in the quad
coordinate.set(xRoot0, yRoot0, rearZ);
topGearTeeth.setCoordinate(index, coordinate);
topGearTeeth.setNormal(index, leftNormal);
// Coordinate labeled 1 in the quad
coordinate.set(tempCoordinate1);
topGearTeeth.setCoordinate(index + 1, coordinate);
topGearTeeth.setNormal(index + 1, leftNormal);
// Coordinate labeled 2 in the quad
topGearTeeth.setCoordinate(index + 2, tempCoordinate2);
topGearTeeth.setNormal(index + 2, leftNormal);
topGearTeeth.setCoordinate(index + 5, tempCoordinate2);
// Coordinate labeled 3 in the quad
coordinate.set(xOuter1, yOuter1, toothTipRearZ);
topGearTeeth.setCoordinate(index + 3, coordinate);
topGearTeeth.setNormal(index + 3, leftNormal);
topGearTeeth.setCoordinate(index + 4, coordinate);
// Compute normal for quad 2
tempCoordinate1.set(xOuter1, yOuter1, toothTipFrontZ);
tempCoordinate2.set(xOuter2, yOuter2, toothTipFrontZ);
tempVector1.sub(tempCoordinate2, tempCoordinate1);
outNormal.cross(frontNormal, tempVector1);
outNormal.normalize();
topGearTeeth.setNormal(index + 4, outNormal);
topGearTeeth.setNormal(index + 5, outNormal);
// Coordinate labeled 4 in the quad
topGearTeeth.setCoordinate(index + 6, tempCoordinate2);
topGearTeeth.setNormal(index + 6, outNormal);
topGearTeeth.setCoordinate(index + 9, tempCoordinate2);
// Coordinate labeled 5 in the quad
coordinate.set(xOuter2, yOuter2, toothTipRearZ);
topGearTeeth.setCoordinate(index + 7, coordinate);
topGearTeeth.setNormal(index + 7, outNormal);
topGearTeeth.setCoordinate(index + 8, coordinate);
// Compute normal for quad 3
tempCoordinate1.set(xOuter2, yOuter2, toothTipFrontZ);
tempCoordinate2.set(xRoot3, yRoot3, frontZ);
tempVector1.sub(tempCoordinate2, tempCoordinate1);
rightNormal.cross(frontNormal, tempVector1);
rightNormal.normalize();
topGearTeeth.setNormal(index + 8, rightNormal);
topGearTeeth.setNormal(index + 9, rightNormal);
// Coordinate labeled 7 in the quad
topGearTeeth.setCoordinate(index + 10, tempCoordinate2);
topGearTeeth.setNormal(index + 10, rightNormal);
topGearTeeth.setCoordinate(index + 13, tempCoordinate2);
// Coordinate labeled 6 in the quad
coordinate.set(xRoot3, yRoot3, rearZ);
topGearTeeth.setCoordinate(index + 11, coordinate);
topGearTeeth.setNormal(index + 11, rightNormal);
topGearTeeth.setCoordinate(index + 12, coordinate);
// Compute normal for quad 4
tempCoordinate1.set(xRoot3, yRoot3, frontZ);
tempCoordinate2.set(xRoot4, yRoot4, frontZ);
tempVector1.sub(tempCoordinate2, tempCoordinate1);
outNormal.cross(frontNormal, tempVector1);
outNormal.normalize();
topGearTeeth.setNormal(index + 12, outNormal);
topGearTeeth.setNormal(index + 13, outNormal);
// Coordinate labeled 9 in the quad
topGearTeeth.setCoordinate(index + 14, tempCoordinate2);
topGearTeeth.setNormal(index + 14, outNormal);
// Coordinate labeled 8 in the quad
coordinate.set(xRoot4, yRoot4, rearZ);
topGearTeeth.setCoordinate(index + 15, coordinate);
topGearTeeth.setNormal(index + 15, outNormal);
// Prepare for the loop by computing the new normal
toothTopStartAngle
= nextToothStartAngle + toothTopAngleIncrement;
xOuter1 = outsideRadius * (float)Math.cos(toothTopStartAngle);
yOuter1 = outsideRadius * (float)Math.sin(toothTopStartAngle);
tempCoordinate1.set(xRoot4, yRoot4, toothTipFrontZ);
tempCoordinate2.set(xOuter1, yOuter1, toothTipFrontZ);
tempVector1.sub(tempCoordinate2, tempCoordinate1);
leftNormal.cross(frontNormal, tempVector1);
leftNormal.normalize();
}
newShape = new Shape3D(topGearTeeth, look);
this.addChild(newShape);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -