Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CapsuleGeometry: Add heightSegments parameter #30868

Merged
merged 1 commit into from
Apr 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/api/ar/geometries/CapsuleGeometry.html
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ <h3>
الافتراضي هو 4.<br />
radialSegments — عدد الوجوه المقسمة حول محيط
الكبسولة. اختياري؛ الافتراضي هو 8.<br />
heightSegments — عدد الوجوه المقسمة على الارتفاع
الكبسولة. اختياري؛ الافتراضي هو 1.<br />
</p>

<h2>الخصائص (Properties)</h2>
Expand Down
4 changes: 3 additions & 1 deletion docs/api/en/geometries/CapsuleGeometry.html
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ <h2>Code Example</h2>
<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 />
Expand All @@ -57,6 +57,8 @@ <h3>
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>
Expand Down
1 change: 1 addition & 0 deletions docs/api/fr/geometries/CapsuleGeometry.html
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ <h3>[name]([param:Float radius], [param:Float length], [param:Integer capSegment
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>
Expand Down
1 change: 1 addition & 0 deletions docs/api/it/geometries/CapsuleGeometry.html
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ <h3>[name]([param:Float radius], [param:Float length], [param:Integer capSegment
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>
Expand Down
1 change: 1 addition & 0 deletions docs/api/ko/geometries/CapsuleGeometry.html
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ <h3>[name]([param:Float radius], [param:Float length], [param:Integer capSegment
length — 중간 구역의 길이입니다. Optional; 기본값은 1 입니다.<br />
capSegments — 캡을 구성하는 데 사용된 곡선 면의 수입니다. Optional; 기본값은 4 입니다.<br />
radialSegments — 캡슐 둘레 주변의 분할된 면의 수입니다. Optional; 기본값은 8 입니다.<br />
heightSegments — 캡슐의 높이에 따라 분할된 면의 수입니다. Optional; 기본값은 1 입니다.<br />
</p>

<h2>프로퍼티</h2>
Expand Down
1 change: 1 addition & 0 deletions docs/api/zh/geometries/CapsuleGeometry.html
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ <h3>
length — 中间区域的长度。可选的; 默认值为1。<br />
capSegments — 构造盖子的曲线部分的个数。可选的; 默认值为4。<br />
radialSegments — 覆盖胶囊圆周的分离的面的个数。可选的; 默认值为8。<br />
heightSegments — 胶囊侧面沿其高度的段数,默认值为 1。<br />
</p>

<h2>属性</h2>
Expand Down
6 changes: 4 additions & 2 deletions docs/scenes/geometry-browser.html
Original file line number Diff line number Diff line change
Expand Up @@ -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 ),
);

}
Expand All @@ -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();

Expand Down
2 changes: 1 addition & 1 deletion editor/js/Menubar.Add.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down
14 changes: 13 additions & 1 deletion editor/js/Sidebar.Geometry.CapsuleGeometry.js
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -64,6 +74,7 @@ function GeometryParametersPanel( editor, object ) {
length.setValue( parameters.length );
capSegments.setValue( parameters.capSegments );
radialSegments.setValue( parameters.radialSegments );
heightSegments.setValue( parameters.heightSegments );

}

Expand All @@ -85,7 +96,8 @@ function GeometryParametersPanel( editor, object ) {
radius.getValue(),
length.getValue(),
capSegments.getValue(),
radialSegments.getValue()
radialSegments.getValue(),
heightSegments.getValue()
) ) );

}
Expand Down
6 changes: 6 additions & 0 deletions editor/js/Strings.js
Original file line number Diff line number Diff line change
Expand Up @@ -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': 'بخش ها',
Expand Down Expand Up @@ -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',
Expand Down Expand Up @@ -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',
Expand Down Expand Up @@ -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': '分段',
Expand Down Expand Up @@ -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': 'セグメント',
Expand Down Expand Up @@ -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': '세그먼트',
Expand Down
19 changes: 17 additions & 2 deletions src/geometries/CapsuleGeometry.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 );
Expand All @@ -45,6 +59,7 @@ class CapsuleGeometry extends LatheGeometry {
length: length,
capSegments: capSegments,
radialSegments: radialSegments,
heightSegments: heightSegments,
};

}
Expand All @@ -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 );

}

Expand Down
4 changes: 3 additions & 1 deletion test/unit/src/geometries/CapsuleGeometry.tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ export default QUnit.module( 'Geometries', () => {
radius: 2,
length: 2,
capSegments: 20,
radialSegments: 20
radialSegments: 20,
heightSegments: 1
};

geometries = [
Expand All @@ -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 )
];

} );
Expand Down