Просмотр исходного кода

CapsuleGeometry: Add heightSegments parameter (#30868)

Michael Blix 10 месяцев назад
Родитель
Сommit
311af89ebf

+ 2 - 0
docs/api/ar/geometries/CapsuleGeometry.html

@@ -56,6 +56,8 @@
  		الافتراضي هو 4.<br />
  		radialSegments — عدد الوجوه المقسمة حول محيط
  		الكبسولة. اختياري؛ الافتراضي هو 8.<br />
+		heightSegments — عدد الوجوه المقسمة على الارتفاع
+		الكبسولة. اختياري؛ الافتراضي هو 1.<br />
  		</p>
 
  		<h2>الخصائص (Properties)</h2>

+ 3 - 1
docs/api/en/geometries/CapsuleGeometry.html

@@ -48,7 +48,7 @@ const capsule = new THREE.Mesh( geometry, material ); scene.add( capsule );
 		<h2>Constructor</h2>
 
 		<h3>
-			[name]([param:Float radius], [param:Float length], [param:Integer capSegments], [param:Integer radialSegments])
+			[name]([param:Float radius], [param:Float length], [param:Integer capSegments], [param:Integer radialSegments], [param:Integer heightSegments])
 		</h3>
 		<p>
 			radius — Radius of the capsule. Optional; defaults to `1`.<br />
@@ -57,6 +57,8 @@ const capsule = new THREE.Mesh( geometry, material ); scene.add( capsule );
 			defaults to `4`.<br />
 			radialSegments — Number of segmented faces around the circumference of the
 			capsule. Optional; defaults to `8`.<br />
+			heightSegments — Number of rows of faces along the height of the capsule. Optional;
+			defaults to `1`.<br />
 		</p>
 
 		<h2>Properties</h2>

+ 1 - 0
docs/api/fr/geometries/CapsuleGeometry.html

@@ -51,6 +51,7 @@
 		length — Longueur de la section médiane. Optionnel; par défaut à 1.<br />
 		capSegments — Nombre de segments de courbe utilisés pour construire les demi-sphères. Optionnel; par défaut à 4.<br />
 		radialSegments — Nombre de faces segmentées autour de la circonférence de la capsule. Optionnel; par défaut à 8.<br />
+		heightSegments — Nombre de faces rectangulaires segmentées sur la hauteur de la capsule. Optionnel; par défaut à 1.<br />
 		</p>
 
 		<h2>Propriétés</h2>

+ 1 - 0
docs/api/it/geometries/CapsuleGeometry.html

@@ -51,6 +51,7 @@
 		length — Lunghezza della sezione centrale. Opzionale; il valore predefinito è 1.<br />
 		capSegments — Numero di segmenti curvi utilizzato per costruire i tappi della capsula. Opzionale; il valore predefinito è 4.<br />
 		radialSegments — Numero di facce segmentate attorno alla circonferenza della capsula. Opzionale; il valore predefinito è 8.<br />
+		heightSegments — Numero di facce rettangolari segmentate sull'altezza della capsula. Opzionale; il valore predefinito è 1.<br />
 		</p>
 
 		<h2>Proprietà</h2>

+ 1 - 0
docs/api/ko/geometries/CapsuleGeometry.html

@@ -52,6 +52,7 @@
 		length — 중간 구역의 길이입니다. Optional; 기본값은 1 입니다.<br />
 		capSegments — 캡을 구성하는 데 사용된 곡선 면의 수입니다. Optional; 기본값은 4 입니다.<br />
 		radialSegments — 캡슐 둘레 주변의 분할된 면의 수입니다. Optional; 기본값은 8 입니다.<br />
+		heightSegments — 캡슐의 높이에 따라 분할된 면의 수입니다. Optional; 기본값은 1 입니다.<br />
 		</p>
 
 		<h2>프로퍼티</h2>

+ 1 - 0
docs/api/zh/geometries/CapsuleGeometry.html

@@ -54,6 +54,7 @@ const capsule = new THREE.Mesh( geometry, material ); scene.add( capsule );
 			length — 中间区域的长度。可选的; 默认值为1。<br />
 			capSegments — 构造盖子的曲线部分的个数。可选的; 默认值为4。<br />
 			radialSegments — 覆盖胶囊圆周的分离的面的个数。可选的; 默认值为8。<br />
+			heightSegments — 胶囊侧面沿其高度的段数,默认值为 1。<br />
 		</p>
 
 		<h2>属性</h2>

+ 4 - 2
docs/scenes/geometry-browser.html

@@ -168,13 +168,14 @@
 						radius: 5,
 						length: 5,
 						capSegments: 10,
-						radialSegments: 20
+						radialSegments: 20,
+						heightSegments: 1
 					};
 
 					function generateGeometry() {
 
 						updateGroupGeometry( mesh,
-							new CapsuleGeometry( data.radius, data.length, data.capSegments, data.radialSegments ),
+							new CapsuleGeometry( data.radius, data.length, data.capSegments, data.radialSegments, data.heightSegments ),
 						);
 
 					}
@@ -185,6 +186,7 @@
 					folder.add( data, 'length', 1, 30 ).onChange( generateGeometry );
 					folder.add( data, 'capSegments', 1, 32 ).step( 1 ).onChange( generateGeometry );
 					folder.add( data, 'radialSegments', 1, 64 ).step( 1 ).onChange( generateGeometry );
+					folder.add( data, 'heightSegments', 1, 64 ).step( 1 ).onChange( generateGeometry );
 
 					generateGeometry();
 

+ 1 - 1
editor/js/Menubar.Add.js

@@ -81,7 +81,7 @@ function MenubarAdd( editor ) {
 	option.setTextContent( strings.getKey( 'menubar/add/mesh/capsule' ) );
 	option.onClick( function () {
 
-		const geometry = new THREE.CapsuleGeometry( 1, 1, 4, 8 );
+		const geometry = new THREE.CapsuleGeometry( 1, 1, 4, 8, 1 );
 		const material = new THREE.MeshStandardMaterial();
 		const mesh = new THREE.Mesh( geometry, material );
 		mesh.name = 'Capsule';

+ 13 - 1
editor/js/Sidebar.Geometry.CapsuleGeometry.js

@@ -54,6 +54,16 @@ function GeometryParametersPanel( editor, object ) {
 
 	container.add( radialSegmentsRow );
 
+	// heightSegments
+
+	const heightSegmentsRow = new UIRow();
+	const heightSegments = new UIInteger( parameters.heightSegments ).setRange( 1, Infinity ).onChange( update );
+
+	heightSegmentsRow.add( new UIText( strings.getKey( 'sidebar/geometry/capsule_geometry/heightseg' ) ).setClass( 'Label' ) );
+	heightSegmentsRow.add( heightSegments );
+
+	container.add( heightSegmentsRow );
+
 	//
 
 	function refreshUI() {
@@ -64,6 +74,7 @@ function GeometryParametersPanel( editor, object ) {
 		length.setValue( parameters.length );
 		capSegments.setValue( parameters.capSegments );
 		radialSegments.setValue( parameters.radialSegments );
+		heightSegments.setValue( parameters.heightSegments );
 
 	}
 
@@ -85,7 +96,8 @@ function GeometryParametersPanel( editor, object ) {
 			radius.getValue(),
 			length.getValue(),
 			capSegments.getValue(),
-			radialSegments.getValue()
+			radialSegments.getValue(),
+			heightSegments.getValue()
 		) ) );
 
 	}

+ 6 - 0
editor/js/Strings.js

@@ -182,6 +182,7 @@ function Strings( config ) {
 			'sidebar/geometry/capsule_geometry/length': 'طول',
 			'sidebar/geometry/capsule_geometry/capseg': 'Cap Seg',
 			'sidebar/geometry/capsule_geometry/radialseg': 'Radial Seg',
+			'sidebar/geometry/capsule_geometry/heightseg': 'Height Seg',
 
 			'sidebar/geometry/circle_geometry/radius': 'شعاع',
 			'sidebar/geometry/circle_geometry/segments': 'بخش ها',
@@ -583,6 +584,7 @@ function Strings( config ) {
 			'sidebar/geometry/capsule_geometry/length': 'Length',
 			'sidebar/geometry/capsule_geometry/capseg': 'Cap Seg',
 			'sidebar/geometry/capsule_geometry/radialseg': 'Radial Seg',
+			'sidebar/geometry/capsule_geometry/heightseg': 'Height Seg',
 
 			'sidebar/geometry/circle_geometry/radius': 'Radius',
 			'sidebar/geometry/circle_geometry/segments': 'Segments',
@@ -985,6 +987,7 @@ function Strings( config ) {
 			'sidebar/geometry/capsule_geometry/length': 'Length',
 			'sidebar/geometry/capsule_geometry/capseg': 'Cap Seg',
 			'sidebar/geometry/capsule_geometry/radialseg': 'Radial Seg',
+			'sidebar/geometry/capsule_geometry/heightseg': 'Height Seg',
 
 			'sidebar/geometry/circle_geometry/radius': 'Rayon',
 			'sidebar/geometry/circle_geometry/segments': 'Segments',
@@ -1387,6 +1390,7 @@ function Strings( config ) {
 			'sidebar/geometry/capsule_geometry/length': '长度',
 			'sidebar/geometry/capsule_geometry/capseg': '胶囊分段',
 			'sidebar/geometry/capsule_geometry/radialseg': '半径分段',
+			'sidebar/geometry/capsule_geometry/heightseg': '高度分段',
 
 			'sidebar/geometry/circle_geometry/radius': '半径',
 			'sidebar/geometry/circle_geometry/segments': '分段',
@@ -1789,6 +1793,7 @@ function Strings( config ) {
 			'sidebar/geometry/capsule_geometry/length': '長さ',
 			'sidebar/geometry/capsule_geometry/capseg': 'キャップの分割数',
 			'sidebar/geometry/capsule_geometry/radialseg': '円の分割数',
+			'sidebar/geometry/capsule_geometry/heightseg': '高さの分割数',
 
 			'sidebar/geometry/circle_geometry/radius': '半径',
 			'sidebar/geometry/circle_geometry/segments': 'セグメント',
@@ -2190,6 +2195,7 @@ function Strings( config ) {
 			'sidebar/geometry/capsule_geometry/length': '길이',
 			'sidebar/geometry/capsule_geometry/capseg': '캡 분할 수',
 			'sidebar/geometry/capsule_geometry/radialseg': '방사 분할 수',
+			'sidebar/geometry/capsule_geometry/heightseg': '높이 분할 수',
 
 			'sidebar/geometry/circle_geometry/radius': '반지름',
 			'sidebar/geometry/circle_geometry/segments': '세그먼트',

+ 17 - 2
src/geometries/CapsuleGeometry.js

@@ -22,11 +22,25 @@ class CapsuleGeometry extends LatheGeometry {
 	 * @param {number} [length=1] - Length of the middle section.
 	 * @param {number} [capSegments=4] - Number of curve segments used to build the caps.
 	 * @param {number} [radialSegments=8] - Number of segmented faces around the circumference of the capsule.
+	 * @param {number} [heightSegments=1] - Number of rows of faces along the height of the capsule.
 	 */
-	constructor( radius = 1, length = 1, capSegments = 4, radialSegments = 8 ) {
+	constructor( radius = 1, length = 1, capSegments = 4, radialSegments = 8, heightSegments = 1 ) {
 
 		const path = new Path();
 		path.absarc( 0, - length / 2, radius, Math.PI * 1.5, 0 );
+
+		if ( heightSegments > 1 ) {
+
+			for ( let i = 1; i < heightSegments; i ++ ) {
+
+				const y = - length / 2 + ( length * i / heightSegments );
+
+				path.lineTo( radius, y );
+
+			}
+
+		}
+
 		path.absarc( 0, length / 2, radius, 0, Math.PI * 0.5 );
 
 		super( path.getPoints( capSegments ), radialSegments );
@@ -45,6 +59,7 @@ class CapsuleGeometry extends LatheGeometry {
 			length: length,
 			capSegments: capSegments,
 			radialSegments: radialSegments,
+			heightSegments: heightSegments,
 		};
 
 	}
@@ -58,7 +73,7 @@ class CapsuleGeometry extends LatheGeometry {
 	 */
 	static fromJSON( data ) {
 
-		return new CapsuleGeometry( data.radius, data.length, data.capSegments, data.radialSegments );
+		return new CapsuleGeometry( data.radius, data.length, data.capSegments, data.radialSegments, data.heightSegments );
 
 	}
 

+ 3 - 1
test/unit/src/geometries/CapsuleGeometry.tests.js

@@ -16,7 +16,8 @@ export default QUnit.module( 'Geometries', () => {
 				radius: 2,
 				length: 2,
 				capSegments: 20,
-				radialSegments: 20
+				radialSegments: 20,
+				heightSegments: 1
 			};
 
 			geometries = [
@@ -25,6 +26,7 @@ export default QUnit.module( 'Geometries', () => {
 				new CapsuleGeometry( parameters.radius, parameters.length ),
 				new CapsuleGeometry( parameters.radius, parameters.length, parameters.capSegments ),
 				new CapsuleGeometry( parameters.radius, parameters.length, parameters.capSegments, parameters.radialSegments ),
+				new CapsuleGeometry( parameters.radius, parameters.length, parameters.capSegments, parameters.radialSegments, parameters.heightSegments )
 			];
 
 		} );

粤ICP备19079148号