Kaynağa Gözat

CapsuleGeometry: Add heightSegments parameter (#30868)

Michael Blix 10 ay önce
ebeveyn
işleme
311af89ebf

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

@@ -56,6 +56,8 @@
  		الافتراضي هو 4.<br />
  		الافتراضي هو 4.<br />
  		radialSegments — عدد الوجوه المقسمة حول محيط
  		radialSegments — عدد الوجوه المقسمة حول محيط
  		الكبسولة. اختياري؛ الافتراضي هو 8.<br />
  		الكبسولة. اختياري؛ الافتراضي هو 8.<br />
+		heightSegments — عدد الوجوه المقسمة على الارتفاع
+		الكبسولة. اختياري؛ الافتراضي هو 1.<br />
  		</p>
  		</p>
 
 
  		<h2>الخصائص (Properties)</h2>
  		<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>
 		<h2>Constructor</h2>
 
 
 		<h3>
 		<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>
 		</h3>
 		<p>
 		<p>
 			radius — Radius of the capsule. Optional; defaults to `1`.<br />
 			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 />
 			defaults to `4`.<br />
 			radialSegments — Number of segmented faces around the circumference of the
 			radialSegments — Number of segmented faces around the circumference of the
 			capsule. Optional; defaults to `8`.<br />
 			capsule. Optional; defaults to `8`.<br />
+			heightSegments — Number of rows of faces along the height of the capsule. Optional;
+			defaults to `1`.<br />
 		</p>
 		</p>
 
 
 		<h2>Properties</h2>
 		<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 />
 		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 />
 		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 />
 		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>
 		</p>
 
 
 		<h2>Propriétés</h2>
 		<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 />
 		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 />
 		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 />
 		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>
 		</p>
 
 
 		<h2>Proprietà</h2>
 		<h2>Proprietà</h2>

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

@@ -52,6 +52,7 @@
 		length — 중간 구역의 길이입니다. Optional; 기본값은 1 입니다.<br />
 		length — 중간 구역의 길이입니다. Optional; 기본값은 1 입니다.<br />
 		capSegments — 캡을 구성하는 데 사용된 곡선 면의 수입니다. Optional; 기본값은 4 입니다.<br />
 		capSegments — 캡을 구성하는 데 사용된 곡선 면의 수입니다. Optional; 기본값은 4 입니다.<br />
 		radialSegments — 캡슐 둘레 주변의 분할된 면의 수입니다. Optional; 기본값은 8 입니다.<br />
 		radialSegments — 캡슐 둘레 주변의 분할된 면의 수입니다. Optional; 기본값은 8 입니다.<br />
+		heightSegments — 캡슐의 높이에 따라 분할된 면의 수입니다. Optional; 기본값은 1 입니다.<br />
 		</p>
 		</p>
 
 
 		<h2>프로퍼티</h2>
 		<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 />
 			length — 中间区域的长度。可选的; 默认值为1。<br />
 			capSegments — 构造盖子的曲线部分的个数。可选的; 默认值为4。<br />
 			capSegments — 构造盖子的曲线部分的个数。可选的; 默认值为4。<br />
 			radialSegments — 覆盖胶囊圆周的分离的面的个数。可选的; 默认值为8。<br />
 			radialSegments — 覆盖胶囊圆周的分离的面的个数。可选的; 默认值为8。<br />
+			heightSegments — 胶囊侧面沿其高度的段数,默认值为 1。<br />
 		</p>
 		</p>
 
 
 		<h2>属性</h2>
 		<h2>属性</h2>

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

@@ -168,13 +168,14 @@
 						radius: 5,
 						radius: 5,
 						length: 5,
 						length: 5,
 						capSegments: 10,
 						capSegments: 10,
-						radialSegments: 20
+						radialSegments: 20,
+						heightSegments: 1
 					};
 					};
 
 
 					function generateGeometry() {
 					function generateGeometry() {
 
 
 						updateGroupGeometry( mesh,
 						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, 'length', 1, 30 ).onChange( generateGeometry );
 					folder.add( data, 'capSegments', 1, 32 ).step( 1 ).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, 'radialSegments', 1, 64 ).step( 1 ).onChange( generateGeometry );
+					folder.add( data, 'heightSegments', 1, 64 ).step( 1 ).onChange( generateGeometry );
 
 
 					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.setTextContent( strings.getKey( 'menubar/add/mesh/capsule' ) );
 	option.onClick( function () {
 	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 material = new THREE.MeshStandardMaterial();
 		const mesh = new THREE.Mesh( geometry, material );
 		const mesh = new THREE.Mesh( geometry, material );
 		mesh.name = 'Capsule';
 		mesh.name = 'Capsule';

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

@@ -54,6 +54,16 @@ function GeometryParametersPanel( editor, object ) {
 
 
 	container.add( radialSegmentsRow );
 	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() {
 	function refreshUI() {
@@ -64,6 +74,7 @@ function GeometryParametersPanel( editor, object ) {
 		length.setValue( parameters.length );
 		length.setValue( parameters.length );
 		capSegments.setValue( parameters.capSegments );
 		capSegments.setValue( parameters.capSegments );
 		radialSegments.setValue( parameters.radialSegments );
 		radialSegments.setValue( parameters.radialSegments );
+		heightSegments.setValue( parameters.heightSegments );
 
 
 	}
 	}
 
 
@@ -85,7 +96,8 @@ function GeometryParametersPanel( editor, object ) {
 			radius.getValue(),
 			radius.getValue(),
 			length.getValue(),
 			length.getValue(),
 			capSegments.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/length': 'طول',
 			'sidebar/geometry/capsule_geometry/capseg': 'Cap Seg',
 			'sidebar/geometry/capsule_geometry/capseg': 'Cap Seg',
 			'sidebar/geometry/capsule_geometry/radialseg': 'Radial Seg',
 			'sidebar/geometry/capsule_geometry/radialseg': 'Radial Seg',
+			'sidebar/geometry/capsule_geometry/heightseg': 'Height Seg',
 
 
 			'sidebar/geometry/circle_geometry/radius': 'شعاع',
 			'sidebar/geometry/circle_geometry/radius': 'شعاع',
 			'sidebar/geometry/circle_geometry/segments': 'بخش ها',
 			'sidebar/geometry/circle_geometry/segments': 'بخش ها',
@@ -583,6 +584,7 @@ function Strings( config ) {
 			'sidebar/geometry/capsule_geometry/length': 'Length',
 			'sidebar/geometry/capsule_geometry/length': 'Length',
 			'sidebar/geometry/capsule_geometry/capseg': 'Cap Seg',
 			'sidebar/geometry/capsule_geometry/capseg': 'Cap Seg',
 			'sidebar/geometry/capsule_geometry/radialseg': 'Radial 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/radius': 'Radius',
 			'sidebar/geometry/circle_geometry/segments': 'Segments',
 			'sidebar/geometry/circle_geometry/segments': 'Segments',
@@ -985,6 +987,7 @@ function Strings( config ) {
 			'sidebar/geometry/capsule_geometry/length': 'Length',
 			'sidebar/geometry/capsule_geometry/length': 'Length',
 			'sidebar/geometry/capsule_geometry/capseg': 'Cap Seg',
 			'sidebar/geometry/capsule_geometry/capseg': 'Cap Seg',
 			'sidebar/geometry/capsule_geometry/radialseg': 'Radial 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/radius': 'Rayon',
 			'sidebar/geometry/circle_geometry/segments': 'Segments',
 			'sidebar/geometry/circle_geometry/segments': 'Segments',
@@ -1387,6 +1390,7 @@ function Strings( config ) {
 			'sidebar/geometry/capsule_geometry/length': '长度',
 			'sidebar/geometry/capsule_geometry/length': '长度',
 			'sidebar/geometry/capsule_geometry/capseg': '胶囊分段',
 			'sidebar/geometry/capsule_geometry/capseg': '胶囊分段',
 			'sidebar/geometry/capsule_geometry/radialseg': '半径分段',
 			'sidebar/geometry/capsule_geometry/radialseg': '半径分段',
+			'sidebar/geometry/capsule_geometry/heightseg': '高度分段',
 
 
 			'sidebar/geometry/circle_geometry/radius': '半径',
 			'sidebar/geometry/circle_geometry/radius': '半径',
 			'sidebar/geometry/circle_geometry/segments': '分段',
 			'sidebar/geometry/circle_geometry/segments': '分段',
@@ -1789,6 +1793,7 @@ function Strings( config ) {
 			'sidebar/geometry/capsule_geometry/length': '長さ',
 			'sidebar/geometry/capsule_geometry/length': '長さ',
 			'sidebar/geometry/capsule_geometry/capseg': 'キャップの分割数',
 			'sidebar/geometry/capsule_geometry/capseg': 'キャップの分割数',
 			'sidebar/geometry/capsule_geometry/radialseg': '円の分割数',
 			'sidebar/geometry/capsule_geometry/radialseg': '円の分割数',
+			'sidebar/geometry/capsule_geometry/heightseg': '高さの分割数',
 
 
 			'sidebar/geometry/circle_geometry/radius': '半径',
 			'sidebar/geometry/circle_geometry/radius': '半径',
 			'sidebar/geometry/circle_geometry/segments': 'セグメント',
 			'sidebar/geometry/circle_geometry/segments': 'セグメント',
@@ -2190,6 +2195,7 @@ function Strings( config ) {
 			'sidebar/geometry/capsule_geometry/length': '길이',
 			'sidebar/geometry/capsule_geometry/length': '길이',
 			'sidebar/geometry/capsule_geometry/capseg': '캡 분할 수',
 			'sidebar/geometry/capsule_geometry/capseg': '캡 분할 수',
 			'sidebar/geometry/capsule_geometry/radialseg': '방사 분할 수',
 			'sidebar/geometry/capsule_geometry/radialseg': '방사 분할 수',
+			'sidebar/geometry/capsule_geometry/heightseg': '높이 분할 수',
 
 
 			'sidebar/geometry/circle_geometry/radius': '반지름',
 			'sidebar/geometry/circle_geometry/radius': '반지름',
 			'sidebar/geometry/circle_geometry/segments': '세그먼트',
 			'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} [length=1] - Length of the middle section.
 	 * @param {number} [capSegments=4] - Number of curve segments used to build the caps.
 	 * @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} [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();
 		const path = new Path();
 		path.absarc( 0, - length / 2, radius, Math.PI * 1.5, 0 );
 		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 );
 		path.absarc( 0, length / 2, radius, 0, Math.PI * 0.5 );
 
 
 		super( path.getPoints( capSegments ), radialSegments );
 		super( path.getPoints( capSegments ), radialSegments );
@@ -45,6 +59,7 @@ class CapsuleGeometry extends LatheGeometry {
 			length: length,
 			length: length,
 			capSegments: capSegments,
 			capSegments: capSegments,
 			radialSegments: radialSegments,
 			radialSegments: radialSegments,
+			heightSegments: heightSegments,
 		};
 		};
 
 
 	}
 	}
@@ -58,7 +73,7 @@ class CapsuleGeometry extends LatheGeometry {
 	 */
 	 */
 	static fromJSON( data ) {
 	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,
 				radius: 2,
 				length: 2,
 				length: 2,
 				capSegments: 20,
 				capSegments: 20,
-				radialSegments: 20
+				radialSegments: 20,
+				heightSegments: 1
 			};
 			};
 
 
 			geometries = [
 			geometries = [
@@ -25,6 +26,7 @@ export default QUnit.module( 'Geometries', () => {
 				new CapsuleGeometry( parameters.radius, parameters.length ),
 				new CapsuleGeometry( parameters.radius, parameters.length ),
 				new CapsuleGeometry( parameters.radius, parameters.length, parameters.capSegments ),
 				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 ),
+				new CapsuleGeometry( parameters.radius, parameters.length, parameters.capSegments, parameters.radialSegments, parameters.heightSegments )
 			];
 			];
 
 
 		} );
 		} );

粤ICP备19079148号