Примените файлы.jpg и.mtl к файлу.obj в SceneKit.
Дизайнер поставил три файла:
- образ.JPG
- что-то. средний уровеньприлива
- без разницы.OBJ
Я могу успешно загрузить файл.obj в мою сцену следующим образом:
SCNView * sceneView = [SCNView new];
sceneView.frame = view.bounds;
[view addSubview:sceneView];
SCNScene * scene = [SCNScene sceneNamed:@"models.scnassets/whatever.obj"];
[sceneView setScene:scene];
Я борюсь с тем, чтобы применить файлы.jpg и.mtl к файлу.obj. Я попытался применить изображение с помощью следующего кода, но без любви:
SCNMaterial * material = [SCNMaterial material];
material.diffuse.contents = [UIImage imageNamed:@"image.jpg"];
SCNNode * materialNode = [SCNNode node];
materialNode.geometry.firstMaterial = material;
[scene.rootNode addChildNode:materialNode];
3 ответа
Привет @Johnny Есть несколько способов применить файлы текстур к файлу.obj.
Если вы хотите загрузить некоторые файлы.obj с отличными настройками, вы можете открыть файл.obj в Xcode и применить текстуры (также Diffuse Map, Normal Map и т. Д., Также в Окружающей среде и в камере освещения). Затем файл.obj преобразует файл.scn для использования в SCNView,
Если вы хотите динамически применять текстуры / изменять текстуры на конкретном узле файла.obj или.scn, вы можете использовать Framework I/O Framework, который обеспечивает импорт, экспорт и манипулирование 3D-моделями, используя общую инфраструктуру, которая объединяет MetalKit, GLKit и SceneKit., SceneKit предоставляет классы для ресурсов ModelIO, например.+ (Instancetype)sceneWithMDLAsset:(MDLAsset *)mdlAsset;(как ответил @Zeeshan).
Ваш дизайнер может экспортировать файлы 3D-моделей в формат.dae. В файле.dae один файл содержит текстуру, камеру, источник света. Нет. Mtl или другие файлы, необходимые, как вы используете в.obj. .dae также поддерживается в SCNKit
Если вы используете рендеринг металла, вы можете загружать текстуры непосредственно из NSURL.
Это помогло мне, хотя и без использования файла.mtl:
//START 3D
NSURL * url = [[NSBundle mainBundle] URLForResource:@"playerModel" withExtension:@"obj"];
MDLAsset * asset = [[MDLAsset alloc] initWithURL:url];
MDLMesh * object = (MDLMesh *)[asset objectAtIndex:0];
MDLScatteringFunction * scatFunction = [MDLScatteringFunction new];
MDLMaterial * material = [[MDLMaterial alloc] initWithName:@"playerMaterial" scatteringFunction:scatFunction];
NSURL * materialURL = [[NSBundle mainBundle] URLForResource:skinFilename withExtension:@"jpg"];
MDLMaterialProperty * baseColour = [MDLMaterialProperty new];
[baseColour setType:MDLMaterialPropertyTypeTexture];
[baseColour setSemantic:MDLMaterialSemanticBaseColor];
[baseColour setURLValue:materialURL];
[material setProperty:baseColour];
for (MDLSubmesh * sub in object.submeshes){
sub.material = material;
}
SCNScene * scene = [SCNScene new];
SCNNode * node = [SCNNode nodeWithMDLObject:object];
SCNVector3 v = SCNVector3Make(100, 200, 0);
[node setPosition:v];
[scene.rootNode addChildNode:node];
SCNView * view = [SCNView new];
view.frame = transferInView.bounds;
view.autoenablesDefaultLighting = true;
view.allowsCameraControl = false;
view.scene = scene;
view.backgroundColor = [UIColor clearColor];
[transferInView addSubview:view];
SCNAction * rotate = [SCNAction rotateByX:0 y:1 z:0 duration:1.0f];
[node runAction:[SCNAction repeatActionForever:rotate]];
SCNVector3 min = SCNVector3Zero;
SCNVector3 max = SCNVector3Zero;
[node getBoundingBoxMin:&min max:&max];
node.pivot = SCNMatrix4MakeTranslation((max.x - min.x) / 2 + min.x, (max.y - min.y) / 2 + min.y, 0);
//END 3D
Я столкнулся с той же проблемой, и единственное решение, которое я нашел, находится в этой ссылке. Нажмите здесь. Я мог загрузить информацию.mtl, чтобы создать объект через сцену
let scene = SCNScene(named: "rose.obj")
Убедитесь, что у вас есть.mtl и jpg с текстурами в вашем комплекте.