⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spurgear.java

📁 JAVA网络三维技术3D的设计与实现
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
				     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 + -