Skip to main content
OCCT category icon with a stylized logo representation

Thick Solids from Complex Faces

Thick solids are powerful 3D modeling features that create volumetric objects by adding thickness to planar or curved faces. While simple circular or rectangular faces are common starting points, thick solids truly shine when working with complex, curved surfaces created through advanced operations like lofting.

Understanding Thick Solids

A thick solid operation takes a face (planar or curved) and extrudes it in the direction of its surface normal(s) to create a solid with the specified thickness. This operation is particularly useful for:

  • Shell structures: Creating hollow objects with consistent wall thickness
  • Architectural elements: Building walls, roofs, and structural components
  • Mechanical parts: Designing brackets, housings, and enclosures
  • Organic shapes: Creating complex curved objects with controlled thickness

Complex Face Creation Through Lofting

To demonstrate the versatility of thick solids, we'll create a complex curved face using the loft operation. Lofting creates a smooth surface between multiple cross-sectional curves, allowing us to build sophisticated organic shapes.

The Process

  1. Create Multiple Curved Cross-Sections: Use interpolation algorithms to create smooth curves through defined points
  2. Loft Between Curves: Generate a complex surface that smoothly transitions between the cross-sections
  3. Apply Thick Solid: Add uniform thickness to create a 3D solid

Convex vs Concave Considerations

Thick solid operations work on both:

  • Convex faces: Outward-curving surfaces (like the outside of a sphere)
  • Concave faces: Inward-curving surfaces (like the inside of a bowl)

The algorithm automatically determines the correct direction for thickness application based on the face normals.

Practical Applications

This technique is invaluable for:

  • Product Design: Creating ergonomic handles, grips, and curved components
  • Architecture: Designing complex roof structures and curved walls
  • Art and Sculpture: Building organic, flowing forms
  • Engineering: Developing aerodynamic shapes and fluid-flow components

Interactive Examples

The following examples demonstrate creating thick solids from complex lofted surfaces, showing how sophisticated 3D geometry can emerge from simple point-based definitions.

Bitbybit Platform

Thick Solid from Lofted Surface

rete logoRete
Script Source (rete)
{
"id": "rete-v2-json",
"nodes": {
"5dd18ebda288b926": {
"id": "5dd18ebda288b926",
"name": "bitbybit.lists.createList",
"customName": "create list",
"data": {},
"inputs": {
"listElements": {
"connections": [
{
"node": "bp1",
"output": "result",
"data": {}
},
{
"node": "bp2",
"output": "result",
"data": {}
},
{
"node": "bp3",
"output": "result",
"data": {}
},
{
"node": "bp4",
"output": "result",
"data": {}
},
{
"node": "bp5",
"output": "result",
"data": {}
}
]
}
},
"position": [
381.4700511813048,
-759.23178075394
]
},
"bp1": {
"id": "bp1",
"name": "bitbybit.vector.vectorXYZ",
"customName": "bottom point 1",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": -3,
"y": 0,
"z": -2
},
"inputs": {},
"position": [
-200.2509251796141,
-1530.6237744580028
]
},
"bp2": {
"id": "bp2",
"name": "bitbybit.vector.vectorXYZ",
"customName": "bottom point 2",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": -1,
"y": 0,
"z": 0
},
"inputs": {},
"position": [
-200.6438837464586,
-1185.4839083695801
]
},
"bp3": {
"id": "bp3",
"name": "bitbybit.vector.vectorXYZ",
"customName": "bottom point 3",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 0,
"y": 0,
"z": 1
},
"inputs": {},
"position": [
-201.51603233009413,
-841.1047664734106
]
},
"bp4": {
"id": "bp4",
"name": "bitbybit.vector.vectorXYZ",
"customName": "bottom point 4",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 1,
"y": 0,
"z": 0
},
"inputs": {},
"position": [
-201.80719478417944,
-501.30789904857716
]
},
"bp5": {
"id": "bp5",
"name": "bitbybit.vector.vectorXYZ",
"customName": "bottom point 5",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 3,
"y": 0,
"z": -2
},
"inputs": {},
"position": [
-203.40586709326126,
-159.85873216886546
]
},
"a78038f1fcf20364": {
"id": "a78038f1fcf20364",
"name": "bitbybit.lists.createList",
"customName": "create list",
"data": {},
"inputs": {
"listElements": {
"connections": [
{
"node": "mp1",
"output": "result",
"data": {}
},
{
"node": "mp2",
"output": "result",
"data": {}
},
{
"node": "mp3",
"output": "result",
"data": {}
},
{
"node": "mp4",
"output": "result",
"data": {}
},
{
"node": "mp5",
"output": "result",
"data": {}
}
]
}
},
"position": [
359.8960910544257,
639.4093382334145
]
},
"mp1": {
"id": "mp1",
"name": "bitbybit.vector.vectorXYZ",
"customName": "middle point 1",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": -2,
"y": 2,
"z": -1
},
"inputs": {},
"position": [
-207.40751268680148,
182.20607249446778
]
},
"mp2": {
"id": "mp2",
"name": "bitbybit.vector.vectorXYZ",
"customName": "middle point 2",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": -0.5,
"y": 2,
"z": 1.5
},
"inputs": {},
"position": [
-208.55231756947538,
522.7333695018547
]
},
"mp3": {
"id": "mp3",
"name": "bitbybit.vector.vectorXYZ",
"customName": "middle point 3",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 0,
"y": 2,
"z": 2
},
"inputs": {},
"position": [
-209.95734117017489,
863.2062131607103
]
},
"mp4": {
"id": "mp4",
"name": "bitbybit.vector.vectorXYZ",
"customName": "middle point 4",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 0.5,
"y": 2,
"z": 1.5
},
"inputs": {},
"position": [
-209.44110803182636,
1202.5708000257098
]
},
"mp5": {
"id": "mp5",
"name": "bitbybit.vector.vectorXYZ",
"customName": "middle point 5",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 2,
"y": 2,
"z": -1
},
"inputs": {},
"position": [
-206.9406246017676,
1536.4767388714486
]
},
"dc177fbbaa4a29dd": {
"id": "dc177fbbaa4a29dd",
"name": "bitbybit.lists.createList",
"customName": "create list",
"data": {},
"inputs": {
"listElements": {
"connections": [
{
"node": "tp1",
"output": "result",
"data": {}
},
{
"node": "tp2",
"output": "result",
"data": {}
},
{
"node": "tp3",
"output": "result",
"data": {}
},
{
"node": "tp4",
"output": "result",
"data": {}
},
{
"node": "tp5",
"output": "result",
"data": {}
}
]
}
},
"position": [
325.21285353635943,
2380.7128964061235
]
},
"tp1": {
"id": "tp1",
"name": "bitbybit.vector.vectorXYZ",
"customName": "top point 1",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": -1.5,
"y": 4,
"z": 0
},
"inputs": {},
"position": [
-205.696683844526,
1880.3195147672093
]
},
"tp2": {
"id": "tp2",
"name": "bitbybit.vector.vectorXYZ",
"customName": "top point 2",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": -0.5,
"y": 4,
"z": 0.5
},
"inputs": {},
"position": [
-203.37989474966056,
2226.564708840056
]
},
"tp3": {
"id": "tp3",
"name": "bitbybit.vector.vectorXYZ",
"customName": "top point 3",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 0,
"y": 4,
"z": 1
},
"inputs": {},
"position": [
-202.31448593117972,
2571.9360743612506
]
},
"tp4": {
"id": "tp4",
"name": "bitbybit.vector.vectorXYZ",
"customName": "top point 4",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 0.5,
"y": 4,
"z": 0.5
},
"inputs": {},
"position": [
-194.57652933131516,
2918.9034255832003
]
},
"tp5": {
"id": "tp5",
"name": "bitbybit.vector.vectorXYZ",
"customName": "top point 5",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 1.5,
"y": 4,
"z": 0
},
"inputs": {},
"position": [
-193.45283493150532,
3276.391368502901
]
},
"bottomwire": {
"id": "bottomwire",
"name": "bitbybit.occt.shapes.wire.interpolatePoints",
"customName": "bottom wire",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"periodic": false,
"tolerance": 0.1
},
"inputs": {
"points": {
"connections": [
{
"node": "5dd18ebda288b926",
"output": "list",
"data": {}
}
]
}
},
"position": [
800,
100
]
},
"middlewire": {
"id": "middlewire",
"name": "bitbybit.occt.shapes.wire.interpolatePoints",
"customName": "middle wire",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"periodic": false,
"tolerance": 0.1
},
"inputs": {
"points": {
"connections": [
{
"node": "a78038f1fcf20364",
"output": "list",
"data": {}
}
]
}
},
"position": [
800,
600
]
},
"topwire": {
"id": "topwire",
"name": "bitbybit.occt.shapes.wire.interpolatePoints",
"customName": "top wire",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"periodic": false,
"tolerance": 0.1
},
"inputs": {
"points": {
"connections": [
{
"node": "dc177fbbaa4a29dd",
"output": "list",
"data": {}
}
]
}
},
"position": [
800,
1100
]
},
"43d7b57c779072dd": {
"id": "43d7b57c779072dd",
"name": "bitbybit.lists.createList",
"customName": "create list",
"data": {},
"inputs": {
"listElements": {
"connections": [
{
"node": "bottomwire",
"output": "result",
"data": {}
},
{
"node": "middlewire",
"output": "result",
"data": {}
},
{
"node": "topwire",
"output": "result",
"data": {}
}
]
}
},
"position": [
1200,
600
]
},
"loftface": {
"id": "loftface",
"name": "bitbybit.occt.operations.loft",
"customName": "loft surface",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"makeSolid": false
},
"inputs": {
"shapes": {
"connections": [
{
"node": "43d7b57c779072dd",
"output": "list",
"data": {}
}
]
}
},
"position": [
1600,
600
]
},
"thicksolid": {
"id": "thicksolid",
"name": "bitbybit.occt.operations.makeThickSolidSimple",
"customName": "thick solid",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"offset": 0.1
},
"inputs": {
"shape": {
"connections": [
{
"node": "loftface",
"output": "result",
"data": {}
}
]
},
"offset": {
"connections": [
{
"node": "96c873eef1c78cc7",
"output": "result",
"data": {}
}
]
}
},
"position": [
2002.8551692459098,
976.481011449629
]
},
"96c873eef1c78cc7": {
"id": "96c873eef1c78cc7",
"name": "bitbybit.math.numberSlider",
"customName": "number slider",
"data": {
"options": {
"min": 0.1,
"max": 1,
"step": 0.05,
"width": 300,
"updateOnDrag": false
},
"number": 0.1
},
"inputs": {},
"position": [
1539.8694476885494,
1164.9000799960202
]
},
"translatesolid": {
"id": "translatesolid",
"name": "bitbybit.occt.transforms.translate",
"customName": "translate solid",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"translation": [
0,
0,
0
]
},
"inputs": {
"shape": {
"connections": [
{
"node": "thicksolid",
"output": "result",
"data": {}
}
]
},
"translation": {
"connections": [
{
"node": "translationvector",
"output": "result",
"data": {}
}
]
}
},
"position": [
2396.2389738447455,
1214.1709845358337
]
},
"translationvector": {
"id": "translationvector",
"name": "bitbybit.vector.vectorXYZ",
"customName": "offset vector",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 0,
"y": 0,
"z": 3
},
"inputs": {},
"position": [
1991.411559175958,
1412.0155515566744
]
},
"draworiginal": {
"id": "draworiginal",
"name": "bitbybit.draw.drawAnyAsync",
"customName": "draw loft surface",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
}
},
"inputs": {
"entity": {
"connections": [
{
"node": "loftface",
"output": "result",
"data": {}
}
]
},
"options": {
"connections": [
{
"node": "originalstyle",
"output": "result",
"data": {}
}
]
}
},
"position": [
2987.3294698123277,
115.68146773595515
]
},
"drawsolid": {
"id": "drawsolid",
"name": "bitbybit.draw.drawAnyAsync",
"customName": "draw thick solid",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
}
},
"inputs": {
"entity": {
"connections": [
{
"node": "translatesolid",
"output": "result",
"data": {}
}
]
},
"options": {
"connections": [
{
"node": "solidstyle",
"output": "result",
"data": {}
}
]
}
},
"position": [
2954.7988868780058,
1421.6642319213433
]
},
"originalstyle": {
"id": "originalstyle",
"name": "bitbybit.draw.optionsOcctShapeSimple",
"customName": "surface style",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"precision": 0.01,
"drawFaces": true,
"faceColour": "#00ff00",
"drawEdges": true,
"edgeColour": "#ffffff",
"edgeWidth": 2
},
"inputs": {},
"position": [
2386.091083151451,
-325.07566707744127
]
},
"solidstyle": {
"id": "solidstyle",
"name": "bitbybit.draw.optionsOcctShapeSimple",
"customName": "solid style",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"precision": 0.01,
"drawFaces": true,
"faceColour": "#ff6600",
"drawEdges": true,
"edgeColour": "#ffffff",
"edgeWidth": 2
},
"inputs": {},
"position": [
2394.9661875543998,
1607.1417164468255
]
}
}
}

Key Learning Points

Design Considerations

When working with thick solids from complex faces:

  1. Surface Continuity: Ensure your lofted surface has smooth transitions to avoid artifacts in the thick solid
  2. Thickness Distribution: The algorithm maintains consistent thickness perpendicular to the surface
  3. Self-Intersections: Complex shapes may create self-intersecting geometry; consider your design carefully
  4. Normal Direction: The thickness direction is determined automatically by face normals

Advanced Techniques

  • Multi-Surface Lofting: Create even more complex shapes by lofting between numerous cross-sections
  • Hybrid Operations: Combine with other OCCT operations like fillets, chamfers, or boolean operations

Performance Tips

  • Point Density: Balance curve smoothness with computational efficiency
  • Surface Complexity: More complex lofted surfaces require more processing time
  • Memory Usage: Large thick solids can consume significant memory resources

Summary

Thick solids from complex lofted faces represent one of the most powerful techniques in 3D modeling. By combining:

  • Interpolated curves for smooth cross-sections
  • Loft operations for complex surface generation
  • Thick solid operations for volumetric creation

You can create sophisticated 3D geometry that would be difficult or impossible to achieve through simple primitive operations. This approach bridges the gap between mathematical precision and organic design freedom.