diff --git a/docs/api/ar/geometries/CapsuleGeometry.html b/docs/api/ar/geometries/CapsuleGeometry.html index fde02a3e687d01..5b1c54414b99cc 100644 --- a/docs/api/ar/geometries/CapsuleGeometry.html +++ b/docs/api/ar/geometries/CapsuleGeometry.html @@ -56,6 +56,8 @@

الافتراضي هو 4.
radialSegments — عدد الوجوه المقسمة حول محيط الكبسولة. اختياري؛ الافتراضي هو 8.
+ heightSegments — عدد الوجوه المقسمة على الارتفاع + الكبسولة. اختياري؛ الافتراضي هو 1.

الخصائص (Properties)

diff --git a/docs/api/en/geometries/CapsuleGeometry.html b/docs/api/en/geometries/CapsuleGeometry.html index 3f630f9c748807..0da2c6ea3f332e 100644 --- a/docs/api/en/geometries/CapsuleGeometry.html +++ b/docs/api/en/geometries/CapsuleGeometry.html @@ -48,7 +48,7 @@

Code Example

Constructor

- [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])

radius — Radius of the capsule. Optional; defaults to `1`.
@@ -57,6 +57,8 @@

defaults to `4`.
radialSegments — Number of segmented faces around the circumference of the capsule. Optional; defaults to `8`.
+ heightSegments — Number of rows of faces along the height of the capsule. Optional; + defaults to `1`.

Properties

diff --git a/docs/api/fr/geometries/CapsuleGeometry.html b/docs/api/fr/geometries/CapsuleGeometry.html index f1567c7df5c32f..4880ea67fc27ce 100644 --- a/docs/api/fr/geometries/CapsuleGeometry.html +++ b/docs/api/fr/geometries/CapsuleGeometry.html @@ -51,6 +51,7 @@

[name]([param:Float radius], [param:Float length], [param:Integer capSegment length — Longueur de la section médiane. Optionnel; par défaut à 1.
capSegments — Nombre de segments de courbe utilisés pour construire les demi-sphères. Optionnel; par défaut à 4.
radialSegments — Nombre de faces segmentées autour de la circonférence de la capsule. Optionnel; par défaut à 8.
+ heightSegments — Nombre de faces rectangulaires segmentées sur la hauteur de la capsule. Optionnel; par défaut à 1.

Propriétés

diff --git a/docs/api/it/geometries/CapsuleGeometry.html b/docs/api/it/geometries/CapsuleGeometry.html index d68208cf1966c1..beed123c2fa617 100644 --- a/docs/api/it/geometries/CapsuleGeometry.html +++ b/docs/api/it/geometries/CapsuleGeometry.html @@ -51,6 +51,7 @@

[name]([param:Float radius], [param:Float length], [param:Integer capSegment length — Lunghezza della sezione centrale. Opzionale; il valore predefinito è 1.
capSegments — Numero di segmenti curvi utilizzato per costruire i tappi della capsula. Opzionale; il valore predefinito è 4.
radialSegments — Numero di facce segmentate attorno alla circonferenza della capsula. Opzionale; il valore predefinito è 8.
+ heightSegments — Numero di facce rettangolari segmentate sull'altezza della capsula. Opzionale; il valore predefinito è 1.

Proprietà

diff --git a/docs/api/ko/geometries/CapsuleGeometry.html b/docs/api/ko/geometries/CapsuleGeometry.html index 5a6ae2e7e2765c..0eb3bca2ab612e 100644 --- a/docs/api/ko/geometries/CapsuleGeometry.html +++ b/docs/api/ko/geometries/CapsuleGeometry.html @@ -52,6 +52,7 @@

[name]([param:Float radius], [param:Float length], [param:Integer capSegment length — 중간 구역의 길이입니다. Optional; 기본값은 1 입니다.
capSegments — 캡을 구성하는 데 사용된 곡선 면의 수입니다. Optional; 기본값은 4 입니다.
radialSegments — 캡슐 둘레 주변의 분할된 면의 수입니다. Optional; 기본값은 8 입니다.
+ heightSegments — 캡슐의 높이에 따라 분할된 면의 수입니다. Optional; 기본값은 1 입니다.

프로퍼티

diff --git a/docs/api/zh/geometries/CapsuleGeometry.html b/docs/api/zh/geometries/CapsuleGeometry.html index 01f2c1324cb55d..ae36e579919190 100644 --- a/docs/api/zh/geometries/CapsuleGeometry.html +++ b/docs/api/zh/geometries/CapsuleGeometry.html @@ -54,6 +54,7 @@

length — 中间区域的长度。可选的; 默认值为1。
capSegments — 构造盖子的曲线部分的个数。可选的; 默认值为4。
radialSegments — 覆盖胶囊圆周的分离的面的个数。可选的; 默认值为8。
+ heightSegments — 胶囊侧面沿其高度的段数,默认值为 1。

属性

diff --git a/docs/scenes/geometry-browser.html b/docs/scenes/geometry-browser.html index dcc4826355b3eb..fa02b85cc13a8c 100644 --- a/docs/scenes/geometry-browser.html +++ b/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(); diff --git a/editor/js/Menubar.Add.js b/editor/js/Menubar.Add.js index dd6c319602a82f..41b2a33928f72e 100644 --- a/editor/js/Menubar.Add.js +++ b/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'; diff --git a/editor/js/Sidebar.Geometry.CapsuleGeometry.js b/editor/js/Sidebar.Geometry.CapsuleGeometry.js index a3fea62abb79e7..dbfab7393611de 100644 --- a/editor/js/Sidebar.Geometry.CapsuleGeometry.js +++ b/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() ) ) ); } diff --git a/editor/js/Strings.js b/editor/js/Strings.js index 45111b87f29bf3..e4867abe364f09 100644 --- a/editor/js/Strings.js +++ b/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': '세그먼트', diff --git a/src/geometries/CapsuleGeometry.js b/src/geometries/CapsuleGeometry.js index 47187f3f5e3540..41ca994a1a174d 100644 --- a/src/geometries/CapsuleGeometry.js +++ b/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 ); } diff --git a/test/unit/src/geometries/CapsuleGeometry.tests.js b/test/unit/src/geometries/CapsuleGeometry.tests.js index ff81e38a2ee4b0..3943dcd58cf105 100644 --- a/test/unit/src/geometries/CapsuleGeometry.tests.js +++ b/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 ) ]; } );