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 )
];
} );