From iPhone-scan to bite-force visualisation, AR publish, and 3D-printable export — every demo a one-liner over MeshRegion. This post is the sequel to "Working with 3D Objects in the Wolfram Language". The prequel solved getting a textured mesh in; this one walks thirteen things you can do with it once it is in.
Marco Thiel, May 2026 — github.com/mthiel74/Wolfram3DObjects — read the prequel post on Wolfram Community
About this post
This is a direct sequel to "Working with 3D Objects in the Wolfram Language" (Wolfram Community, May 2026). Read the prequel first if you want the import side and the ImportTexturedOBJ.wl library that makes multi-material OBJ textures actually attach. Everything below assumes you already have a textured MeshRegion in hand and shows what the rest of the Wolfram Language can do with it: mass properties, slicing, curvature, FEM, transient heat conduction, modal analysis — real physics on real (scanned or NN-generated) geometry.
Many of the demos below need the scan to be watertight (closed, no holes); section 3 covers how to get there from a typical iPhone-LiDAR scan. Sections 4, 8, 9, 11, 12, and 13 then assume the output of section 3 is in scope.
This is a direct sequel to "Working with 3D Objects in the Wolfram Language" (Wolfram Community, May 2026). Read the prequel first if you want the import side and the ImportTexturedOBJ.wl library that makes multi-material OBJ textures actually attach. Everything below assumes you already have a textured MeshRegion in hand and shows what the rest of the Wolfram Language can do with it: mass properties, slicing, curvature, FEM, transient heat conduction, modal analysis — real physics on real (scanned or NN-generated) geometry.
Many of the demos below need the scan to be watertight (closed, no holes); section 3 covers how to get there from a typical iPhone-LiDAR scan. Sections 4, 8, 9, 11, 12, and 13 then assume the output of section 3 is in scope.
Above: von Mises stress on the photogrammetric T-Rex skull under a 35 kN bite load (§9). Drag to rotate. This is what the post is about — real geometry, real material constants, real load magnitudes, real PDE solver, all in two cells of Wolfram code.
1. Tour3DVideo — the cheapest thing you can do
1. Tour3DVideo — the cheapest thing you can do
The Wolfram Language has a one-liner for a turntable video over any imported mesh: Tour3DVideo. This works on built-in geometry, on Sketchfab downloads, on iPhone-LiDAR scans, on the AI-generated meshes from the prequel. Here is a 4-second turntable of the Tinkercad model from the prequel:
Tour3DVideo[Show[brutus,Boxed->False],DefaultDuration->4,FrameRate->12,RasterSize->360]
2. ARPublish — drop the model on the floor next to you
2. ARPublish — drop the model on the floor next to you
ARPublish uploads any Graphics3D to a Wolfram-hosted endpoint and returns a URL. Wrap that URL in BarcodeImage[..., "QR", {300, 300}] and you have a QR code printed in the notebook. Open the iPhone camera, point at the QR, tap the link banner; iOS Quick Look opens the model anchored on the floor in front of you. Any imported textured mesh works.
What you see below. The QR resolves to a live ARPublish endpoint for the photogrammetric T-Rex skull from §9. Scan it with your phone and the skull lands upright on the floor in front of you, life-size, walk-around-able.
What you see below. The QR resolves to a live ARPublish endpoint for the photogrammetric T-Rex skull from §9. Scan it with your phone and the skull lands upright on the floor in front of you, life-size, walk-around-able.
(*theT-Rexskullmeshfrom§3,decimatedforfastupload*)trexLite=DiscretizeRegion[trex,MaxCellMeasure->{"Length"->0.06}];arURL=ARPublish[trexLite,"PublicAccess"->True];qr=BarcodeImage[arURL,"QR",{300,300}];{Hyperlink[arURL,arURL],qr}
3. Fixing a scanned mesh — making it watertight + 3D-printable
3. Fixing a scanned mesh — making it watertight + 3D-printable
An iPhone-LiDAR scan is a surface: a single layer of triangles wrapped around what the cameras saw. There is no inside. Volume on a non-closed mesh either returns the wrong number, returns 0, or refuses to evaluate. Same for FEA. Same for STL export to a 3D printer. We need the scan to be watertight: every edge belongs to exactly two triangles, no gaps, no overhangs.
Here is the diagnostic on the raw 1 M-tri robot scan: 6819 boundary edges along the seams between the 87 atlas sub-meshes Luma's photogrammetry exporter produced. After convex-hull cap-fill, zero boundary edges; the result is a BoundaryMeshRegion ready for Volume[], NDSolveValue[], and Export["robot.stl"].
Here is the diagnostic on the raw 1 M-tri robot scan: 6819 boundary edges along the seams between the 87 atlas sub-meshes Luma's photogrammetry exporter produced. After convex-hull cap-fill, zero boundary edges; the result is a BoundaryMeshRegion ready for Volume[], NDSolveValue[], and Export["robot.stl"].
before=Diagnose[robot]after=Diagnose[CapHolesViaConvexHull[robot]]
before | after | |
open edges | 6819 | 0 |
vertices | 503110 | 1260 |
watertight | False | True |
Euler χ | -77 | 2 |
Convex-hull cap-fill is lossy
Wrapping the scan in its convex hull fills every concavity (the robot's recessed joints, the tooth gaps in a T-Rex skull) with solid material. Good for Volume[] and mass-property demos; not what you want if your scan has intentional cavities (a coffee mug interior, or the cranial vault of a real skull). For those, use per-hole patching: identify each open boundary loop, fan-triangulate it to its centroid, and rebuild as a BoundaryMeshRegion. Both helpers ship in mesh_repair.wl.
Wrapping the scan in its convex hull fills every concavity (the robot's recessed joints, the tooth gaps in a T-Rex skull) with solid material. Good for Volume[] and mass-property demos; not what you want if your scan has intentional cavities (a coffee mug interior, or the cranial vault of a real skull). For those, use per-hole patching: identify each open boundary loop, fan-triangulate it to its centroid, and rebuild as a BoundaryMeshRegion. Both helpers ship in mesh_repair.wl.
4. Mass properties — Volume, Centroid, Surface Area
4. Mass properties — Volume, Centroid, Surface Area
Geometry: volume integrals
Geometry: volume integrals
For a closed manifold body Ω in the standard mass properties are the volume, the surface area, and (for uniform density) the centroid:
3
V | = | ∫ Ω |
A | = | ∫ ∂Ω |
x | = | 1 V ∫ Ω |
Wolfram evaluates these directly on a MeshRegion using the divergence theorem — only the boundary needs to be integrated. No FEM mesh required.
Once the scan is watertight, mass properties are one-liners. Volume gives the enclosed volume, RegionMeasure[RegionBoundary[...]] the surface area, RegionCentroid the centre of mass (for uniform density). Visualised below: the centroid plotted as a red sphere inside the (translucent) robot.
{Volume[robot],RegionCentroid[robot]}
Volume: 2.002 m^3 ≈ 2001579 cm^3 |
Surface area: 8.502 m^2 |
Centroid: {-0.173,0.421,-0.098} |
5. Will it tip over? The support-polygon check
5. Will it tip over? The support-polygon check
Statics: gravitational stability
Statics: gravitational stability
An object resting on a flat floor is statically stable iff the gravity-projected centre of mass falls inside the convex hull of its floor-contact points (the support polygon):
where π_(xz) projects out the vertical (y) component, x\[Bar] is the centroid, and ∂Ω_floor is the floor-contact subset of the boundary. When tilted by angle θ, the centroid rotates around the tilt axis; the critical angle is reached when its projection just touches the support-polygon boundary (the tip-over angle).
Tip-over is a centre-of-mass question. Drop a vertical line from the centroid; if it leaves the convex hull of the floor-contact points, the figurine falls. RegionCentroid gives the centre of mass; ConvexHullMesh on the bottom-most vertices gives the support polygon; RegionMember checks containment. Below: the support polygon (blue) and the COM shadow (red dot) for the upright robot. Stable means the dot is inside the polygon.
6. Slicing and cross-sections — RegionIntersection with HalfSpace
6. Slicing and cross-sections — RegionIntersection with HalfSpace
Geometry: half-space intersection
Geometry: half-space intersection
A half-space H = {x : n·x ≥ d} is the set of all points on one side of the plane n·x = d. The cross-section of the body Ω by that plane is the region intersection:
For a sagittal cut along the body's mid-line, n = (1, 0, 0) and d = x_0 is the cut position. Sweeping d builds the plane-sweep animation. No PDE; pure Boolean geometry.
Cross-sections are one RegionIntersection away. Pass the mesh and a HalfSpace (or a Plane) and Wolfram returns the sliced solid. Below: the T-Rex hull (translucent grey) bisected by its sagittal plane; the cyan half is the lateral cross-section.
7. Surface curvature — discrete Gaussian curvature
7. Surface curvature — discrete Gaussian curvature
Geometry: discrete Gaussian curvature (angle defect)
Geometry: discrete Gaussian curvature (angle defect)
On a smooth surface, Gaussian curvature K is the product of the two principal curvatures, an intrinsic invariant. On a triangulated surface it is approximated at every vertex v by the angle defect:
where N(v) is the set of triangles incident to v, θ_(v,f) is the interior angle of triangle f at v, and A_v is the (Voronoi or barycentric) area assigned to v. Bowl-shaped vertices have K > 0, saddle-shaped have K < 0, flat regions have K = 0. The Gauss-Bonnet theorem says the total angle defect over a closed surface equals 2π χ (χ the Euler characteristic) — a topological constant. Reference: Meyer, Desbrun, Schröder & Barr 2003, Discrete Differential-Geometry Operators for Triangulated 2-Manifolds.
8. iPhone-mug volume — how much coffee does it hold?
8. iPhone-mug volume — how much coffee does it hold?
Geometry: cavity as a region difference
Geometry: cavity as a region difference
The mug's interior cavity is the part of the smallest enclosing cylinder C that is not inside the solid mug M. The capacity is the volume of that cavity:
where C\M is the set difference, computed by RegionDifference[C, M]. Output is in litres after the conversion factor 10^3 from m^3 to litres (or 10^6 from m^3 to ml).
How much coffee does this mug actually hold? Scan it (the same mug from the prequel), make it watertight (the photogrammetric scan was already closed), fit a cylinder to the rim, intersect with the solid, take the volume. The answer below is in ml; comparable to the manufacturer's stated capacity within the lossiness of the rim fit and the photogrammetric reconstruction.
9. T-Rex bite-force FEM — elastostatics on a museum-cast skull
9. T-Rex bite-force FEM — elastostatics on a museum-cast skull
Physics: linear elastostatics
Physics: linear elastostatics
Static linear-elasticity reduces the Cauchy momentum equation to balance of stresses against an applied body or boundary force. For displacement field u(x) on the volume Ω the governing PDE is
with stress σ linked to strain ϵ by Hooke's law for an isotropic linear-elastic material,
where the Lamé parameters μ (shear modulus) and λ are computed from Young's modulus E and Poisson ratio ν:
The Wolfram Language realisation
The Wolfram Language realisation
Each piece above maps to one Wolfram primitive: SolidMechanicsPDEComponent builds the ∇·σ operator from {E, ν, ρ}; SolidBoundaryLoadValue applies the traction σ·ν; SolidFixedCondition pins = 0; NDSolveValue assembles and solves on the tetrahedral mesh.
The Wolfram Language has had finite-element machinery for years. SolidMechanicsPDEComponent sets up the Cauchy momentum equation for linear elasticity; SolidBoundaryLoadValue applies surface loads; SolidFixedCondition pins displacement to zero on the rest; NDSolveValue solves. Material parameters live at the top of the parameter Association: YoungModulus, PoissonRatio, MassDensity — all Quantity-valued.
This section applies all of the above to the T-Rex skull from the prequel. The FEM domain is the photogrammetric scan run through voxel-reconstruction-plus-PyMeshLab repair (closes the 6306 atlas-seam open edges, makes the surface watertight) and tetrahedralised at ~31286 elements. Material constants are literature cortical-bone values (Y = 14 GPa, ν = 0.3, ρ = 2000 kg/m^3 — Erickson et al. 2003, Rayfield 2004); load is the 35 kN multibody-dynamics bite-force estimate from Bates & Falkingham 2012 for an adult T. rex, applied downward at the snout; occipital-condyle end fixed. Solve completes in under a second on an M-series Mac. Stress is sampled at every vertex of the actual anatomical surface (~14k vertices) using pre-computed derivative InterpolatingFunctions — the per-call Derivative form was the bottleneck that previously made stress computation hang.
Result. Median stress 0.19 MPa, 95th-percentile 0.47 MPa, peak 0.86 MPa. This compares sensibly to the rough analytical estimate F/A ≈ 35 kN / (skull cross-section ≈ 0.1 m^2) ≈ 0.35 MPa. The red region (peak stress) sits at the front of the skull where the load enters; the blue region (low stress) at the rear where the displacement is constrained. This is qualitatively the bite-force loading pattern published in Rayfield 2004.
This section applies all of the above to the T-Rex skull from the prequel. The FEM domain is the photogrammetric scan run through voxel-reconstruction-plus-PyMeshLab repair (closes the 6306 atlas-seam open edges, makes the surface watertight) and tetrahedralised at ~31286 elements. Material constants are literature cortical-bone values (Y = 14 GPa, ν = 0.3, ρ = 2000 kg/m^3 — Erickson et al. 2003, Rayfield 2004); load is the 35 kN multibody-dynamics bite-force estimate from Bates & Falkingham 2012 for an adult T. rex, applied downward at the snout; occipital-condyle end fixed. Solve completes in under a second on an M-series Mac. Stress is sampled at every vertex of the actual anatomical surface (~14k vertices) using pre-computed derivative InterpolatingFunctions — the per-call Derivative form was the bottleneck that previously made stress computation hang.
Result. Median stress 0.19 MPa, 95th-percentile 0.47 MPa, peak 0.86 MPa. This compares sensibly to the rough analytical estimate F/A ≈ 35 kN / (skull cross-section ≈ 0.1 m^2) ≈ 0.35 MPa. The red region (peak stress) sits at the front of the skull where the load enters; the blue region (low stress) at the rear where the displacement is constrained. This is qualitatively the bite-force loading pattern published in Rayfield 2004.
What this is and what it isn't
Literature-calibrated semi-quantitative bite-force FEA on a museum-cast scan of an adult T. rex skull. Genuine FEM, with literature material constants and literature load magnitudes, on the actual anatomical geometry (eye sockets, snout taper, jaw line all visible in the visualisation above — not a smoothed envelope). The boundary conditions are anatomically located (snout vs occipital). The stress patterns qualitatively reproduce Rayfield 2004's published von Mises maps.
What this is not: a peer-reviewable palaeobiomechanics study. The FEM mesh is the voxel-reconstructed solid envelope of the photogrammetric scan -- it preserves the outer shape but not the internal cavities (nasal chambers, cranial vault, the open palate). The material is homogeneous cortical bone, not the cortical-shell + trabecular-fill split a serious study would use. We have no CT geometry and no validated muscle-attachment vectors.
For a defensible study read Erickson et al. 2003 (Nature 416), Bates & Falkingham 2012 (Biology Letters 8), Rayfield 2004 (PRSB 271).
Literature-calibrated semi-quantitative bite-force FEA on a museum-cast scan of an adult T. rex skull. Genuine FEM, with literature material constants and literature load magnitudes, on the actual anatomical geometry (eye sockets, snout taper, jaw line all visible in the visualisation above — not a smoothed envelope). The boundary conditions are anatomically located (snout vs occipital). The stress patterns qualitatively reproduce Rayfield 2004's published von Mises maps.
What this is not: a peer-reviewable palaeobiomechanics study. The FEM mesh is the voxel-reconstructed solid envelope of the photogrammetric scan -- it preserves the outer shape but not the internal cavities (nasal chambers, cranial vault, the open palate). The material is homogeneous cortical bone, not the cortical-shell + trabecular-fill split a serious study would use. We have no CT geometry and no validated muscle-attachment vectors.
For a defensible study read Erickson et al. 2003 (Nature 416), Bates & Falkingham 2012 (Biology Letters 8), Rayfield 2004 (PRSB 271).
10. Pour hot coffee into the mug — transient heat conduction
10. Pour hot coffee into the mug — transient heat conduction
Physics: transient heat conduction
Physics: transient heat conduction
Different physics, same workflow. The empty ceramic mug stands on a cold counter (5 °C) in a cool kitchen (10 °C ambient air). At t = 0 we pour 95 °C coffee that fills the lower third of the cavity. We solve the transient heat equation for the temperature field T(t, x) in the ceramic wall:
where the right-hand identity holds for spatially-uniform conductivity. The thermal diffusivity is α = k / (ρ c_p), so an equivalent form is
Boundary conditions (Γ_X = wall portion):
Initial condition. T(0, x) = 10 °C everywhere (cold ceramic at room temperature before the pour).
Time interval. 0 ≤ t ≤ 600 s (10 minutes — long enough to see the slow heat-up and approach to a steady state).
Time interval. 0 ≤ t ≤ 600 s (10 minutes — long enough to see the slow heat-up and approach to a steady state).
Domain & visualisation
Domain & visualisation
FEM domain. An idealised hollow cylinder matched to the scan dimensions (outer radius 27 mm, inner radius 22 mm, height 100 mm). The photogrammetric mug surface has genus 3 (multi-handle topology, photogrammetric self-intersections) and ToElementMesh cannot mesh it directly. The visualisation maps the cylinder-FEM result back to the actual photogrammetric mug surface by cylindrical-coordinate matching, so you see the real gingerbread-mug shape coloured by the physically meaningful temperature field.
Boundary conditions. Inner wall, lower 1/3 (in contact with coffee): Dirichlet T = 95 °C. Inner wall, upper 2/3 (cavity air above the coffee): weak Newton cooling, h_air = 5 W/(m^2 K) to T = 10 °C. Outer wall: Newton cooling, h = 10 W/(m^2 K) to T = 10 °C. Bottom face (mug sits on cold counter): Dirichlet T = 5 °C. IC: T = 10 °C everywhere. Solve transient 0 ≤ t ≤ 600 s.
What you should see. 20 frames at log-spaced times. The bottom edge of the mug stays deep blue — cold counter. A hot ring develops in the lower-middle of the mug body where the coffee sits inside; this is what you feel when you grab the mug. Above the coffee level the ceramic stays cool. Steady state is reached in about 60 s with the hot ring at ~92 °C; the bottom of the mug never escapes the cold counter.
Boundary conditions. Inner wall, lower 1/3 (in contact with coffee): Dirichlet T = 95 °C. Inner wall, upper 2/3 (cavity air above the coffee): weak Newton cooling, h_air = 5 W/(m^2 K) to T = 10 °C. Outer wall: Newton cooling, h = 10 W/(m^2 K) to T = 10 °C. Bottom face (mug sits on cold counter): Dirichlet T = 5 °C. IC: T = 10 °C everywhere. Solve transient 0 ≤ t ≤ 600 s.
What you should see. 20 frames at log-spaced times. The bottom edge of the mug stays deep blue — cold counter. A hot ring develops in the lower-middle of the mug body where the coffee sits inside; this is what you feel when you grab the mug. Above the coffee level the ceramic stays cool. Steady state is reached in about 60 s with the hot ring at ~92 °C; the bottom of the mug never escapes the cold counter.
Same field, real texture. The animation above shows the temperature on the mug surface as pure colour. Below, the same heat field is rendered as a translucent overlay on top of the actual gingerbread-mug texture, so you can see where the heat sits relative to the printed pattern.
11. Crash test on the racecar — frontal-impact stress (linear-elastic FEM)
11. Crash test on the racecar — frontal-impact stress (linear-elastic FEM)
Physics: same elastostatics, surface traction load
Physics: same elastostatics, surface traction load
Identical PDE to §9 (∇·σ = 0 with isotropic Hooke), but the load now enters through the boundary as a surface traction on the front bumper:
Crash narrative
Crash narrative
A second body, a different physics. We import the racecar mesh from the prequel post (NN-generated from a single product photo, a clean 25 k-tri sports-car body), centre and scale it to a canonical 4 m length, and put a 100 kN compressive load on a small front-bumper patch with the rear of the car fixed to the ground. The output: linear-elastic von Mises stress on the actual NN-generated body, no simplified shape anywhere.
Material. Structural automotive steel: Y = 200 GPa, ν = 0.3, ρ = 7850 kg/m^3.
Load. 100 kN is the typical NCAP peak contact force at a 56 km/h frontal-impact test (real cars see 100–200 kN over a few tens of milliseconds). We apply it as a quasi-static compressive load on the front-centre bumper patch (lower half, central 50 % of width) so the stress concentrates the way a real bumper-to-wall contact does.
Domain. The photogrammetric mesh has high genus (interior cavities through the wheel wells, between body and chassis), so we mesh the coarsened convex hull as the FEM domain (~7 k tetrahedra) and map the stress field back onto the actual photogrammetric vertices for visualisation — same trick we used in §9 for the T-Rex.
What this is and what it isn't. This is a linear-elastic quasi-static stress field on a real-geometry domain at a real load magnitude. It shows where the stress concentrates on the body shell. It is not a crashworthiness simulation in the engineering sense — real crash tests need dynamic contact FEM with rate-dependent plasticity, deformable barriers, sheet-metal thinning, and explicit time integration on the order of 10^-7 s steps. The point of this section is the workflow: real geometry real material real load FEM solve visualisation, all in two cells of code with SolidMechanicsPDEComponent.
Material. Structural automotive steel: Y = 200 GPa, ν = 0.3, ρ = 7850 kg/m^3.
Load. 100 kN is the typical NCAP peak contact force at a 56 km/h frontal-impact test (real cars see 100–200 kN over a few tens of milliseconds). We apply it as a quasi-static compressive load on the front-centre bumper patch (lower half, central 50 % of width) so the stress concentrates the way a real bumper-to-wall contact does.
Domain. The photogrammetric mesh has high genus (interior cavities through the wheel wells, between body and chassis), so we mesh the coarsened convex hull as the FEM domain (~7 k tetrahedra) and map the stress field back onto the actual photogrammetric vertices for visualisation — same trick we used in §9 for the T-Rex.
What this is and what it isn't. This is a linear-elastic quasi-static stress field on a real-geometry domain at a real load magnitude. It shows where the stress concentrates on the body shell. It is not a crashworthiness simulation in the engineering sense — real crash tests need dynamic contact FEM with rate-dependent plasticity, deformable barriers, sheet-metal thinning, and explicit time integration on the order of 10^-7 s steps. The point of this section is the workflow: real geometry real material real load FEM solve visualisation, all in two cells of code with SolidMechanicsPDEComponent.
What you should see. A 16-frame turntable. Stress concentration on the front bumper (deep red) where the load is applied, gradually decaying along the body, with a secondary reaction concentration at the rear support (yellow/orange) where the boundary condition fixes the body to the ground. The cabin and roof region carry less stress — consistent with how a real shell body distributes a frontal load through its longitudinal members. Peak von Mises is ~0.4 MPa, well within the elastic regime for steel; this is what we expect from a quasi-static linear analysis (real crashes cause plastic deformation at hundreds of MPa locally, but plasticity is a whole separate solver).
12. 3D-printed robot under its own weight — gravity body force on a real figurine
12. 3D-printed robot under its own weight — gravity body force on a real figurine
Physics: elastostatics with body force
Physics: elastostatics with body force
Same elastostatics PDE as §9 and §11, but now the right-hand side is non-zero: the body force is gravity acting on every infinitesimal volume element of the figurine.
with gravity vector g = (0, -9.81, 0) m/s^2 and the same stress–strain law as before (Hooke + Lamé). Boundary conditions:
Material parameters (PLA filament, the default FDM 3D-print plastic): E = 3.5 GPa; ν = 0.36; ρ = 1240 kg/m^3.
Initial conditions: none (quasi-static).
Domain. The repaired robot from §3 (convex-hull watertight mesh), centred and scaled to a 10 cm canonical figurine height.
Output. Von Mises stress on the surface, plotted as a live, rotatable Graphics3D.
Initial conditions: none (quasi-static).
Domain. The repaired robot from §3 (convex-hull watertight mesh), centred and scaled to a 10 cm canonical figurine height.
Output. Von Mises stress on the surface, plotted as a live, rotatable Graphics3D.
3D-print failure narrative
3D-print failure narrative
A third body, a third physics. Print a 10 cm robot figurine in PLA on a desktop FDM printer; it sits on its feet under its own weight. Where does the stress concentrate?
Geometry. The repaired robot from §3 (convex-hull watertight mesh, ~30 k tris), centred and scaled to a 10 cm canonical figurine height.
Material. Standard PLA filament, the default desktop-3D-print plastic: Y = 3.5 GPa, ν = 0.36, ρ = 1240 kg/m^3.
Load. Gravity body force everywhere. Same SolidMechanicsPDEComponent as before, but the right-hand side is no longer zero — it's the constant body-force vector {0, -ρ g, 0} (downward, in N/m^3). Floor contact: bottom 5 % of the bbox fixed.
Why this is interesting. Self-weight loading is what every standing object on Earth experiences. For a tall thin figurine, the cross-section at the ankles carries the cumulative weight of everything above; that's where 3D prints typically snap. The FEM should reproduce this — high stress at the base, low stress at the head.
Geometry. The repaired robot from §3 (convex-hull watertight mesh, ~30 k tris), centred and scaled to a 10 cm canonical figurine height.
Material. Standard PLA filament, the default desktop-3D-print plastic: Y = 3.5 GPa, ν = 0.36, ρ = 1240 kg/m^3.
Load. Gravity body force everywhere. Same SolidMechanicsPDEComponent as before, but the right-hand side is no longer zero — it's the constant body-force vector {0, -ρ g, 0} (downward, in N/m^3). Floor contact: bottom 5 % of the bbox fixed.
Why this is interesting. Self-weight loading is what every standing object on Earth experiences. For a tall thin figurine, the cross-section at the ankles carries the cumulative weight of everything above; that's where 3D prints typically snap. The FEM should reproduce this — high stress at the base, low stress at the head.
What you should see. Drag the figure above to rotate it. Stress builds up from the top (deep blue, carrying nothing) down through the body, peaks at the feet/base (red/yellow), exactly where a print of this geometry would actually fail. Peak von Mises is ~3.9 kPa for a 9.9 cm robot — far below PLA's ~50 MPa yield, so a print at this scale is safe by a 13000× margin. Scale the robot up to a 1 m statue, though, and the weight grows as L^3 while the cross-section grows as L^2 (weight ∝ L^3, stress ∝ L^3 / L^2 = L), so stress at the ankles increases linearly. The 3.9 kPa here becomes ~39 kPa at 1 m, ~390 kPa at 10 m — still well within PLA's yield, but bending-fatigue and creep would dominate long before the linear-elastic limit. The point: same code, same solve, scientifically defensible answer about a real-world question ("will my 3D print snap at the feet?").
13. Modal analysis of the car — natural frequencies for vibration-based machine monitoring
13. Modal analysis of the car — natural frequencies for vibration-based machine monitoring
Physics: free-vibration eigenvalue problem
Physics: free-vibration eigenvalue problem
Modal analysis asks: what shapes can a structure vibrate in, and at what frequencies? Without external load and without damping, the equation of motion is the dynamic Cauchy momentum equation:
Sustained vibration at a single frequency takes the separable-in-time ansatz u(x, t) = ϕ(x) e^(iωt). Substituting reduces the time-derivative to -ω^2 and yields the generalised eigenvalue problem:
where K is the elastic stiffness operator (assembled from the same Hooke law as §9) and M is the mass operator (ρ times the identity). The eigenvalues ω_n^2 give the angular frequencies of the natural modes, and the eigenfunctions ϕ_n(x) give the corresponding mode shapes. Frequencies in Hz are
Modal-analysis narrative
Modal-analysis narrative
If §11 was a one-shot crash, this is the same car in the frequency domain. We solve the eigenvalue problem K ϕ = ω^2 M ϕ on the same FEM mesh and recover the first four natural frequencies and mode shapes of the car body.
Why this matters in industry. Modal analysis is the basis of vibration-based machine monitoring — one of the standard predictive-maintenance techniques for rotating machinery, bridges, aircraft components, and now consumer products. The natural frequencies of a structure depend on its stiffness and mass distribution; if a crack grows or a bolt loosens, those frequencies shift. By tracking δf / f over time you can detect damage before catastrophic failure. The workflow shown here — phone-scan or NN-generated mesh FEM modes baseline — is a complete digital-twin pipeline.
The eigenvalue formulation. We solve a generalised eigenvalue problem with the elastic stiffness operator on the LHS and the mass-density operator on the RHS. Wolfram's NDEigensystem returns ω^2 eigenvalues; we post-divide by ρ to recover physical SI angular frequencies (verified against an Euler-Bernoulli cantilever: 299 Hz computed vs 282 Hz theoretical, a 6 % FEM-discretisation error).
Why this matters in industry. Modal analysis is the basis of vibration-based machine monitoring — one of the standard predictive-maintenance techniques for rotating machinery, bridges, aircraft components, and now consumer products. The natural frequencies of a structure depend on its stiffness and mass distribution; if a crack grows or a bolt loosens, those frequencies shift. By tracking δf / f over time you can detect damage before catastrophic failure. The workflow shown here — phone-scan or NN-generated mesh FEM modes baseline — is a complete digital-twin pipeline.
The eigenvalue formulation. We solve a generalised eigenvalue problem with the elastic stiffness operator on the LHS and the mass-density operator on the RHS. Wolfram's NDEigensystem returns ω^2 eigenvalues; we post-divide by ρ to recover physical SI angular frequencies (verified against an Euler-Bernoulli cantilever: 299 Hz computed vs 282 Hz theoretical, a 6 % FEM-discretisation error).
What you should see. Four mode shapes oscillating in lock-step. Mode 1 (~61 Hz) and Mode 2 (~84 Hz) are the two fundamental bending modes, in perpendicular planes — the front of the body sweeps up-and-down and side-to-side. Mode 3 (~224 Hz) is a torsional twisting mode about the long axis. Mode 4 (~326 Hz) is a higher-order bending mode with a node mid-body.
Calibration note. Real car-body fundamentals sit at 5–15 Hz because a real body is a stiffened thin shell with most of the mass in the chassis and powertrain. Our FEM domain is a solid steel volume in the shape of the car — much stiffer per unit mass — so the frequencies come out proportionally higher. The pattern of mode shapes (two bending, then torsion, then higher bending) is exactly what the engineering literature predicts for any cantilever beam-like body. Real machine monitoring uses the same code with the right hollow-shell mesh.
Calibration note. Real car-body fundamentals sit at 5–15 Hz because a real body is a stiffened thin shell with most of the mass in the chassis and powertrain. Our FEM domain is a solid steel volume in the shape of the car — much stiffer per unit mass — so the frequencies come out proportionally higher. The pattern of mode shapes (two bending, then torsion, then higher bending) is exactly what the engineering literature predicts for any cantilever beam-like body. Real machine monitoring uses the same code with the right hollow-shell mesh.
14. Closing thoughts and references
14. Closing thoughts and references
The headline of the prequel was that the Wolfram Language is already very strong on 3D and that the only piece of plumbing missing for arbitrary textured imports was multi-material OBJ binding. The headline of this sequel is that once you have a textured MeshRegion in scope, the rest of the language opens up: AR publishing, mass properties, slicing, curvature, FEA, transient heat conduction, structural eigenmode analysis — all one-line operations on the same data type.
The pattern. Each physics demo (§9 bite-force, §10 heat, §11 crash, §12 self-weight, §13 modes) follows the same six-step recipe: import repair mesh choose material constants choose boundary conditions solve. Switch any one of those for a different real-world object, material, or load and the rest of the pipeline is unchanged. This is the workflow behind digital-twin engineering: phone-scan or NN-generate a part, mesh it, run the relevant physics, validate against measurement. The same code underpins crash certification, vibration-based predictive maintenance, biomechanics, and every other place where real geometry real physics replaces toy shapes.
The prequel post. "Working with 3D objects: built-in, web, LiDAR, and AI-generated pipelines" (Wolfram Community, May 2026) — the import side and the multi-material OBJ texture-binding fix that this whole sequel rests on.
References. Wolfram Solid Mechanics tutorial. Meyer, Desbrun, Schröder & Barr 2003, Discrete Differential-Geometry Operators for Triangulated 2-Manifolds. Erickson, Van Kirk, Su, Levenston, Caler & Carter 2003, Bite-force estimation for Tyrannosaurus rex from tooth-marked bones, Nature 416. Bates & Falkingham 2012, Estimating maximum bite performance in T. rex using multi-body dynamics, Biology Letters 8. Rayfield 2004, Cranial mechanics and feeding in T. rex, PRSB 271.
Code & assets. github.com/mthiel74/Wolfram3DObjects. mesh_repair.wl is the watertight-repair helper used in section 3. The cached geometry under community-followup/cached/ makes every cell in this notebook a one-liner.
This post. Released under MIT alongside the prequel.
The pattern. Each physics demo (§9 bite-force, §10 heat, §11 crash, §12 self-weight, §13 modes) follows the same six-step recipe: import repair mesh choose material constants choose boundary conditions solve. Switch any one of those for a different real-world object, material, or load and the rest of the pipeline is unchanged. This is the workflow behind digital-twin engineering: phone-scan or NN-generate a part, mesh it, run the relevant physics, validate against measurement. The same code underpins crash certification, vibration-based predictive maintenance, biomechanics, and every other place where real geometry real physics replaces toy shapes.
The prequel post. "Working with 3D objects: built-in, web, LiDAR, and AI-generated pipelines" (Wolfram Community, May 2026) — the import side and the multi-material OBJ texture-binding fix that this whole sequel rests on.
References. Wolfram Solid Mechanics tutorial. Meyer, Desbrun, Schröder & Barr 2003, Discrete Differential-Geometry Operators for Triangulated 2-Manifolds. Erickson, Van Kirk, Su, Levenston, Caler & Carter 2003, Bite-force estimation for Tyrannosaurus rex from tooth-marked bones, Nature 416. Bates & Falkingham 2012, Estimating maximum bite performance in T. rex using multi-body dynamics, Biology Letters 8. Rayfield 2004, Cranial mechanics and feeding in T. rex, PRSB 271.
Code & assets. github.com/mthiel74/Wolfram3DObjects. mesh_repair.wl is the watertight-repair helper used in section 3. The cached geometry under community-followup/cached/ makes every cell in this notebook a one-liner.
This post. Released under MIT alongside the prequel.
CITE THIS NOTEBOOK
CITE THIS NOTEBOOK
What to do with a textured 3D object -- applications in Wolfram
by Marco Thiel
Wolfram Community, STAFF PICKS, May 8, 2026
https://community.wolfram.com/groups/-/m/t/3713168
by Marco Thiel
Wolfram Community, STAFF PICKS, May 8, 2026
https://community.wolfram.com/groups/-/m/t/3713168