SCNGeometrySource
SCNGeometrySource
объект указывает данные на вершину для набора вершин, формирующих поверхность трехмерного объекта или геометрию. Вы используете источники геометрии вместе с SCNGeometryElement
объекты определить пользовательский SCNGeometry
объекты или проверить данные, составляющие существующую геометрию.
Вы создаете пользовательскую геометрию с помощью трехступенчатого процесса:
Создайте один или больше
SCNGeometrySource
объекты, содержащие данные вершины. Каждый источник геометрии определяет атрибут, или семантический, вершин, которые он описывает. Необходимо обеспечить по крайней мере один источник геометрии, с помощьюSCNGeometrySourceSemanticVertex
семантический, для создания пользовательской геометрии; обычно Вы также обеспечиваете источники геометрии для поверхности normals и координат текстуры.Создайте по крайней мере один
SCNGeometryElement
объект, содержа массив индексов, идентифицирующих вершины в источниках геометрии и описывающих получение, примитивное, что использование SceneKit для соединения вершин при рендеринге геометрии.Создайте
SCNGeometry
экземпляр из источников геометрии и элементов геометрии.
Чередование данных вершины
Поскольку большинство конфигураций использует больше чем один источник геометрии, и GPU обычно использует данные из многократных источников вместе, можно достигнуть лучшей производительности рендеринга для пользовательских конфигураций путем чередования данных вершины для многократной семантики в том же массиве.
Чтобы сделать это, сначала создайте массив, где каждый элемент содержит значения для многократной семантики для той же вершины. Затем, создайте NSData
объект от того массива, и создает каждый источник геометрии из тех данных с помощью offset
и stride
параметры для указания, где значения для каждого семантического могут быть найдены в массиве. Для создания указания размеров и расположений векторов более удобным можно определить собственную структуру данных для вершин и использовать sizeof
(и, в Objective C, offsetof
) функции, как показано в Перечислении 1.
Swift
struct Float3 {
var x, y, z: GLfloat
}
struct Float2 {
var s, t: GLfloat
}
struct Vertex {
var position: Float3
var normal: Float3
var tcoord: Float2
}
var vertices: [Vertex] = [ /* ... vertex data ... */ ]
let data = NSData(bytes: vertices, length: vertices.count * sizeof(Vertex))
let vertexSource = SCNGeometrySource(data: data,
semantic: SCNGeometrySourceSemanticVertex,
vectorCount: vertices.count,
floatComponents: true,
componentsPerVector: 3,
bytesPerComponent: sizeof(GLfloat),
dataOffset: 0, // position is first member in Vertex
dataStride: sizeof(Vertex))
let normalSource = SCNGeometrySource(data: data,
semantic: SCNGeometrySourceSemanticNormal,
vectorCount: vertices.count,
floatComponents: true,
componentsPerVector: 3,
bytesPerComponent: sizeof(GLfloat),
dataOffset: sizeof(Float3), // one Float3 before normal in Vertex
dataStride: sizeof(Vertex))
let tcoordSource = SCNGeometrySource(data: data,
semantic: SCNGeometrySourceSemanticTexcoord,
vectorCount: vertices.count,
floatComponents: true,
componentsPerVector: 2,
bytesPerComponent: sizeof(GLfloat),
dataOffset: 2 * sizeof(Float3), // 2 Float3s before tcoord in Vertex
dataStride: sizeof(Vertex))
Objective C
typedef struct {
float x, y, z; // position
float nx, ny, nz; // normal
float s, t; // texture coordinates
} MyVertex;
MyVertex vertices[VERTEX_COUNT] = { /* ... vertex data ... */ };
NSData *data = [NSData dataWithBytes:vertices length:sizeof(vertices)];
SCNGeometrySource *vertexSource, *normalSource, *tcoordSource;
vertexSource = [SCNGeometrySource geometrySourceWithData:data
semantic:SCNGeometrySourceSemanticVertex
vectorCount:VERTEX_COUNT
floatComponents:YES
componentsPerVector:3 // x, y, z
bytesPerComponent:sizeof(float)
dataOffset:offsetof(MyVertex, x)
dataStride:sizeof(MyVertex)];
normalSource = [SCNGeometrySource geometrySourceWithData:data
semantic:SCNGeometrySourceSemanticNormal
vectorCount:VERTEX_COUNT
floatComponents:YES
componentsPerVector:3 // nx, ny, nz
bytesPerComponent:sizeof(float)
dataOffset:offsetof(MyVertex, nx)
dataStride:sizeof(MyVertex)];
tcoordSource = [SCNGeometrySource geometrySourceWithData:data
semantic:SCNGeometrySourceSemanticTexcoord
vectorCount:VERTEX_COUNT
floatComponents:YES
componentsPerVector:2 // s, t
bytesPerComponent:sizeof(float)
dataOffset:offsetof(MyVertex, s)
dataStride:sizeof(MyVertex)];
Соответствует
-
AnyObject
-
CVarArgType
-
Сопоставимый
-
Hashable
-
NSCoding
-
NSObjectProtocol
-
NSSecureCoding
-
Печатаемый
-
NSObject
-
NSSecureCoding
Оператор импорта
Swift
import SceneKit
Objective C
@import SceneKit;
Доступность
Доступный в OS X v10.8 и позже.
-
init (data:semantic:vectorCount:floatComponents:componentsPerVector:bytesPerComponent:dataOffset:dataStride:) + geometrySourceWithData:semantic:vectorCount:floatComponents:componentsPerVector:bytesPerComponent:dataOffset:dataStride:
Создает источник геометрии из указанных данных и опций.
Объявление
Swift
convenience init(data
data
: NSData, semanticsemantic
: String, vectorCountvectorCount
: Int, floatComponentsfloatComponents
: Bool, componentsPerVectorcomponentsPerVector
: Int, bytesPerComponentbytesPerComponent
: Int, dataOffsetoffset
: Int, dataStridestride
: Int)Objective C
+ (instancetype)geometrySourceWithData:(NSData *)
data
semantic:(NSString *)semantic
vectorCount:(NSInteger)vectorCount
floatComponents:(BOOL)floatComponents
componentsPerVector:(NSInteger)componentsPerVector
bytesPerComponent:(NSInteger)bytesPerComponent
dataOffset:(NSInteger)offset
dataStride:(NSInteger)stride
Параметры
data
Данные для источника геометрии.
semantic
Семантическое значение (или атрибут), который источник геометрии описывает для каждой вершины. Посмотрите Геометрию Семантические Идентификаторы для доступных значений.
vectorCount
Число исходных векторов геометрии.
floatComponents
Булево значение, указывающее, являются ли векторные компоненты значениями с плавающей точкой. Указать
YES
true
для значений с плавающей точкой, илиNO
false
для целочисленных значений.componentsPerVector
Число скалярных компонентов в каждом векторе.
bytesPerComponent
Размер, в байтах, каждого векторного компонента.
offset
Смещение, в байтах, с начала данных к первому векторному компоненту, который будет использоваться в источнике геометрии.
stride
Число байтов от каждого вектора до следующего в данных.
Возвращаемое значение
Новый исходный объект геометрии.
Обсуждение
Данные источника геометрии являются массивом векторов, каждый из которых представляет определенный атрибут (или семантический) вершины в геометрии. Другие параметры определяют, как SceneKit интерпретирует эти данные. Например, массив позиций вершины может иметь три 32-разрядных компонента с плавающей точкой на вектор, но массив координат текстуры может иметь два 8-разрядных целых числа coponents на вектор. Можно использовать
offset
иstride
параметры вместе для чередования данных для многократных источников геометрии в том же массиве, улучшая рендеринг производительности. Посмотрите Чередующиеся Данные Вершины для подробных данных.Создать пользовательское
SCNGeometry
объект из источника геометрии, используйтеgeometryWithSources:elements:
метод.Оператор импорта
Objective C
@import SceneKit;
Swift
import SceneKit
Доступность
Доступный в OS X v10.8 и позже.
-
Создает источник геометрии из массива позиций вершины.
Объявление
Swift
convenience init(vertices
vertices
: UnsafePointer<SCNVector3>, countcount
: Int)Objective C
+ (instancetype)geometrySourceWithVertices:(const SCNVector3 *)
vertices
count:(NSInteger)count
Параметры
vertices
Массив трехкомпонентных векторов, каждый из которых представляет позицию вершины для источника геометрии.
count
Число позиций вершины.
Возвращаемое значение
Новый источник геометрии, чей
semantic
свойствоSCNGeometrySourceSemanticVertex
.Обсуждение
SceneKit преобразовывает эти данные в свой собственный формат для оптимизации производительности рендеринга. Для чтения преобразованных данных исследуйте свойства создаваемого
SCNGeometrySource
объект.Создать пользовательское
SCNGeometry
объект из источника геометрии, используйтеgeometryWithSources:elements:
метод.Оператор импорта
Objective C
@import SceneKit;
Swift
import SceneKit
Доступность
Доступный в OS X v10.8 и позже.
-
Создает источник геометрии из массива векторов нормали.
Объявление
Swift
convenience init(normals
normals
: UnsafePointer<SCNVector3>, countcount
: Int)Objective C
+ (instancetype)geometrySourceWithNormals:(const SCNVector3 *)
normals
count:(NSInteger)count
Параметры
normals
Массив трехкомпонентных векторов, каждый из которых представляет поверхность, нормальную для источника геометрии.
count
Число векторов нормали.
Возвращаемое значение
Новый источник геометрии, чей
semantic
свойствоSCNGeometrySourceSemanticNormal
.Обсуждение
SceneKit преобразовывает эти данные в свой собственный формат для оптимизации производительности рендеринга. Для чтения преобразованных данных исследуйте свойства создаваемого
SCNGeometrySource
объект.Создать пользовательское
SCNGeometry
объект из источника геометрии, используйтеgeometryWithSources:elements:
метод.Оператор импорта
Objective C
@import SceneKit;
Swift
import SceneKit
Доступность
Доступный в OS X v10.8 и позже.
-
Создает источник геометрии из массива точек координаты текстуры.
Объявление
Параметры
texcoord
Массив точек, каждая из которых представляет пару координаты текстуры для источника геометрии.
count
Число точек координаты текстуры.
Возвращаемое значение
Новый источник геометрии, чей
semantic
свойствоSCNGeometrySourceSemanticTexcoord
.Обсуждение
SceneKit преобразовывает эти данные в свой собственный формат для оптимизации производительности рендеринга. Для чтения преобразованных данных исследуйте свойства создаваемого
SCNGeometrySource
объект.Создать пользовательское
SCNGeometry
объект из источника геометрии, используйтеgeometryWithSources:elements:
метод.Оператор импорта
Objective C
@import SceneKit;
Swift
import SceneKit
Доступность
Доступный в OS X v10.8 и позже.
-
Данные для источника геометрии. (только для чтения)
Обсуждение
Данные источника геометрии являются массивом векторов, каждый из которых представляет определенный атрибут (или семантический) вершины в геометрии. Другие свойства источника геометрии определяют, как SceneKit интерпретирует эти данные. Например, массив позиций вершины может иметь три 32-разрядных компонента с плавающей точкой на вектор, но массив координат текстуры может иметь два 8-разрядных целых числа coponents на вектор.
Оператор импорта
Objective C
@import SceneKit;
Swift
import SceneKit
Доступность
Доступный в OS X v10.8 и позже.
-
семантический семантический
СвойствоСемантическое значение (или атрибут) источник геометрии описывает для каждой вершины. (только для чтения)
Объявление
Swift
var semantic: String { get }
Objective C
@property(nonatomic, readonly) NSString *semantic
Обсуждение
Семантическое описывает атрибут для каждой вершины, такой как позиция, цвет, поверхностный вектор нормали или координаты текстуры.
Посмотрите Геометрию Семантические Идентификаторы для доступных значений.
Оператор импорта
Objective C
@import SceneKit;
Swift
import SceneKit
Доступность
Доступный в OS X v10.8 и позже.
-
vectorCount vectorCount
Свойство -
floatComponents floatComponents
СвойствоБулево значение, указывающее, являются ли векторные компоненты значениями с плавающей точкой. (только для чтения)
Объявление
Swift
var floatComponents: Bool { get }
Objective C
@property(nonatomic, readonly) BOOL floatComponents
Обсуждение
Если
YES
true
, SceneKit интерпретирует данные источника геометрии как массив векторов, компоненты которых являются значениями с плавающей точкой. Тип значения с плавающей точкой определяетсяbytesPerComponent
свойство: 4 байта дляfloat
значения или 8 байтов дляdouble
значения.Если
NO
false
, SceneKit интерпретирует данные источника геометрии как массив векторов, компоненты которых являются целочисленными значениями. Тип целочисленного значения определяетсяbytesPerComponent
свойство; например, 2 байта дляunsigned short
значения или 4 байта дляunsigned int
значения.Оператор импорта
Objective C
@import SceneKit;
Swift
import SceneKit
Доступность
Доступный в OS X v10.8 и позже.
-
componentsPerVector componentsPerVector
СвойствоЧисло скалярных компонентов в каждом векторе. (только для чтения)
Объявление
Swift
var componentsPerVector: Int { get }
Objective C
@property(nonatomic, readonly) NSInteger componentsPerVector
Оператор импорта
Objective C
@import SceneKit;
Swift
import SceneKit
Доступность
Доступный в OS X v10.8 и позже.
-
bytesPerComponent bytesPerComponent
СвойствоРазмер, в байтах, каждого векторного компонента. (только для чтения)
Объявление
Swift
var bytesPerComponent: Int { get }
Objective C
@property(nonatomic, readonly) NSInteger bytesPerComponent
Оператор импорта
Objective C
@import SceneKit;
Swift
import SceneKit
Доступность
Доступный в OS X v10.8 и позже.
-
dataOffset dataOffset
СвойствоСмещение, в байтах, с начала данных к первому векторному компоненту, который будет использоваться в источнике геометрии. (только для чтения)
Объявление
Swift
var dataOffset: Int { get }
Objective C
@property(nonatomic, readonly) NSInteger dataOffset
Обсуждение
Можно использовать
dataOffset
иdataStride
параметры могут вместе для чередования данных для многократных источников геометрии в том же массиве, улучшая рендеринг производительности. Посмотрите Чередующиеся Данные Вершины для подробных данных.Оператор импорта
Objective C
@import SceneKit;
Swift
import SceneKit
Доступность
Доступный в OS X v10.8 и позже.
-
dataStride dataStride
СвойствоЧисло байтов от вектора до следующего в данных. (только для чтения)
Объявление
Swift
var dataStride: Int { get }
Objective C
@property(nonatomic, readonly) NSInteger dataStride
Обсуждение
Можно использовать
dataOffset
иdataStride
параметры могут вместе для чередования данных для многократных источников геометрии в том же массиве, улучшая рендеринг производительности. Посмотрите Чередующиеся Данные Вершины для подробных данных.Оператор импорта
Objective C
@import SceneKit;
Swift
import SceneKit
Доступность
Доступный в OS X v10.8 и позже.