<!--
{
  "availability" : [
    "iOS: 8.0.0 - 26.0.0",
    "iPadOS: 8.0.0 - 26.0.0",
    "macCatalyst: 13.1.0 - 26.0.0",
    "macOS: 10.8.0 - 26.0.0",
    "tvOS: 9.0.0 - 26.0.0",
    "visionOS: 1.0.0 - 26.0.0",
    "watchOS: 3.0.0 - 26.0.0"
  ],
  "documentType" : "symbol",
  "framework" : "SceneKit",
  "identifier" : "/documentation/SceneKit/SCNGeometry",
  "metadataVersion" : "0.1.0",
  "role" : "Class",
  "symbol" : {
    "kind" : "Class",
    "modules" : [
      "SceneKit"
    ],
    "preciseIdentifier" : "c:objc(cs)SCNGeometry"
  },
  "title" : "SCNGeometry"
}
-->

# SCNGeometry

A three-dimensional shape (also called a model or mesh) that can be displayed in a scene, with attached materials that define its appearance.

```
class SCNGeometry
```

## Overview

In SceneKit, geometries attached to [`SCNNode`](/documentation/SceneKit/SCNNode) objects form the visible elements of a scene, and [`SCNMaterial`](/documentation/SceneKit/SCNMaterial) objects attached to a geometry determine its appearance.

### Working with Geometry Objects

You control a geometry’s appearance in a scene with nodes and materials. A geometry object provides only the form of a visible object rendered by SceneKit. You specify color and texture for a geometry’s surface, control how it responds to light, and add special effects by attaching materials (for details, see the methods in Managing a Geometry’s Materials). You position and orient a geometry in a scene by attaching it to an [`SCNNode`](/documentation/SceneKit/SCNNode) object. Multiple nodes can reference the same geometry object, allowing it to appear at different positions in a scene.

You can easily copy geometries and change their materials. A geometry object manages the association between immutable vertex data and a mutable assignment of materials. To make a geometry appear more than once in the same scene with a different set of materials, use its inherited <doc://com.apple.documentation/documentation/ObjectiveC/NSObject-swift.class/copy()> method. The copy shares the underlying vertex data of the original, but can be assigned materials independently. You can thus make many copies of a geometry without incurring a significant cost to rendering performance.

You can animate a geometry object. The vertex data associated with a geometry is immutable, but SceneKit provides several ways to animate geometry. You can use a [`SCNMorpher`](/documentation/SceneKit/SCNMorpher) or [`SCNSkinner`](/documentation/SceneKit/SCNSkinner) object to deform a geometry’s surface, or run animations created in an external 3D authoring tool and loaded from a scene file. You can also use methods in the [`SCNShadable`](/documentation/SceneKit/SCNShadable) protocol to add custom GLSL shader programs that alter SceneKit’s rendering of a geometry.

### Obtaining a Geometry Object

SceneKit provides several ways to introduce geometry objects to your app:

|Action                                                          |For further information                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
|----------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|Load from a scene file created using external 3D authoring tools|``doc://com.apple.scenekit/documentation/SceneKit/SCNScene``, ``doc://com.apple.scenekit/documentation/SceneKit/SCNSceneSource``                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
|Use and customize SceneKit’s built-in primitive shapes          |``doc://com.apple.scenekit/documentation/SceneKit/SCNPlane``, ``doc://com.apple.scenekit/documentation/SceneKit/SCNBox``, ``doc://com.apple.scenekit/documentation/SceneKit/SCNSphere``, ``doc://com.apple.scenekit/documentation/SceneKit/SCNPyramid``, ``doc://com.apple.scenekit/documentation/SceneKit/SCNCone``, ``doc://com.apple.scenekit/documentation/SceneKit/SCNCylinder``, ``doc://com.apple.scenekit/documentation/SceneKit/SCNCapsule``, ``doc://com.apple.scenekit/documentation/SceneKit/SCNTube``, and ``doc://com.apple.scenekit/documentation/SceneKit/SCNTorus``|
|Create 3D geometry from 2D text or Bézier curves                |``doc://com.apple.scenekit/documentation/SceneKit/SCNText``, ``doc://com.apple.scenekit/documentation/SceneKit/SCNShape``                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
|Create a custom geometry from vertex data                       |``doc://com.apple.scenekit/documentation/SceneKit/SCNGeometrySource``, ``doc://com.apple.scenekit/documentation/SceneKit/SCNGeometryElement``, ``doc://com.apple.scenekit/documentation/SceneKit/SCNGeometry/init(sources:elements:)``, Managing Geometry Data                                                                                                                                                                                                                                                                                                                      |

## Topics

### Creating a Geometry Object

[`+  geometryWithSources:elements:`](/documentation/SceneKit/SCNGeometry/init(sources:elements:))

Creates a new geometry built from the specified geometry sources and elements.

[`+  geometry`](/documentation/SceneKit/SCNGeometry/geometry)

Creates a new geometry object with no content (or default content).

[`+  geometryWithMDLMesh:`](/documentation/SceneKit/SCNGeometry/geometryWithMDLMesh:)

Creates a geometry from the specified Model I/O mesh object.

### Managing Geometry Attributes

[`name`](/documentation/SceneKit/SCNGeometry/name)

A name associated with the geometry object.

[`SCNBoundingVolume`](/documentation/SceneKit/SCNBoundingVolume)

Methods common to the [`SCNNode`](/documentation/SceneKit/SCNNode) and [`SCNGeometry`](/documentation/SceneKit/SCNGeometry) classes for measuring location and size.

### Managing a Geometry’s Materials

[`materials`](/documentation/SceneKit/SCNGeometry/materials)

An array of [`SCNMaterial`](/documentation/SceneKit/SCNMaterial) objects that determine the geometry’s appearance when rendered.

[`firstMaterial`](/documentation/SceneKit/SCNGeometry/firstMaterial)

The first material attached to the geometry.

[`-  materialWithName:`](/documentation/SceneKit/SCNGeometry/material(named:))

Returns the first material attached to the geometry with the specified name.

[`-  insertMaterial:atIndex:`](/documentation/SceneKit/SCNGeometry/insertMaterial(_:at:))

Attaches a material to the geometry at the specified index.

[`-  removeMaterialAtIndex:`](/documentation/SceneKit/SCNGeometry/removeMaterial(at:))

Removes a material attached to the geometry.

[`-  replaceMaterialAtIndex:withMaterial:`](/documentation/SceneKit/SCNGeometry/replaceMaterial(at:with:))

Replaces a material attached to the geometry with another.

### Managing Geometry Data

[`geometryElements`](/documentation/SceneKit/SCNGeometry/elements)

An array of geometry elements that describe the geometry’s shape.

[`geometrySources`](/documentation/SceneKit/SCNGeometry/sources)

An array of geometry sources that provide vertex data for the geometry.

[`geometryElementCount`](/documentation/SceneKit/SCNGeometry/elementCount)

The number of geometry elements in the geometry.

[`-  geometryElementAtIndex:`](/documentation/SceneKit/SCNGeometry/element(at:))

Returns the geometry element at a specified index.

[`-  geometrySourcesForSemantic:`](/documentation/SceneKit/SCNGeometry/sources(for:))

Returns the geometry sources for a specified semantic.

### Optimizing Level of Detail

[`levelsOfDetail`](/documentation/SceneKit/SCNGeometry/levelsOfDetail)

An array of [`SCNLevelOfDetail`](/documentation/SceneKit/SCNLevelOfDetail) objects for managing the geometry’s appearance when viewed from far away.

[`SCNLevelOfDetail`](/documentation/SceneKit/SCNLevelOfDetail)

An alternate resolution for a geometry that SceneKit automatically substitutes to improve rendering performance.

### Smoothing and Subdividing Geometry

[`subdivisionLevel`](/documentation/SceneKit/SCNGeometry/subdivisionLevel)

The number of subdivisions SceneKit uses to smooth the geometry’s surface at render time.

[`edgeCreasesElement`](/documentation/SceneKit/SCNGeometry/edgeCreasesElement)

The geometry element identifying which edges of the geometry’s surface should remain sharp after subdivision.

[`edgeCreasesSource`](/documentation/SceneKit/SCNGeometry/edgeCreasesSource)

The geometry source specifying the smoothness or sharpness of edges after surface subdivision.

[`wantsAdaptiveSubdivision`](/documentation/SceneKit/SCNGeometry/wantsAdaptiveSubdivision)

### Managing Tessellation

[`tessellator`](/documentation/SceneKit/SCNGeometry/tessellator)

[`SCNGeometryTessellator`](/documentation/SceneKit/SCNGeometryTessellator)

## Relationships

### Inherited By

[`SCNTube`](/documentation/SceneKit/SCNTube)

[`SCNShape`](/documentation/SceneKit/SCNShape)

[`SCNCone`](/documentation/SceneKit/SCNCone)

[`SCNCapsule`](/documentation/SceneKit/SCNCapsule)

[`SCNCylinder`](/documentation/SceneKit/SCNCylinder)

[`SCNBox`](/documentation/SceneKit/SCNBox)

[`SCNSphere`](/documentation/SceneKit/SCNSphere)

[`SCNFloor`](/documentation/SceneKit/SCNFloor)

[`SCNTorus`](/documentation/SceneKit/SCNTorus)

[`SCNPlane`](/documentation/SceneKit/SCNPlane)

[`SCNPyramid`](/documentation/SceneKit/SCNPyramid)

[`SCNText`](/documentation/SceneKit/SCNText)

### Conforms To

[`NSObjectProtocol`](/documentation/ObjectiveC/NSObjectProtocol)

[`Hashable`](/documentation/Swift/Hashable)

[`CustomStringConvertible`](/documentation/Swift/CustomStringConvertible)

[`Equatable`](/documentation/Swift/Equatable)

[`NSSecureCoding`](/documentation/Foundation/NSSecureCoding)

[`SCNShadable`](/documentation/SceneKit/SCNShadable)

[`SCNBoundingVolume`](/documentation/SceneKit/SCNBoundingVolume)

[`NSCoding`](/documentation/Foundation/NSCoding)

[`CVarArg`](/documentation/Swift/CVarArg)

[`CustomDebugStringConvertible`](/documentation/Swift/CustomDebugStringConvertible)

[`NSCopying`](/documentation/Foundation/NSCopying)

[`SCNAnimatable`](/documentation/SceneKit/SCNAnimatable)

### Inherits From

[`NSObject-swift.class`](/documentation/ObjectiveC/NSObject-swift.class)

---

Copyright &copy; 2026 Apple Inc. All rights reserved. | [Terms of Use](https://www.apple.com/legal/internet-services/terms/site.html) | [Privacy Policy](https://www.apple.com/privacy/privacy-policy)