2015-09-16 2 views
1

Я хочу отобразить текст внутри сцены SceneKit, где символы имеют другой цвет. В documentation of SCNText состоянии:NSAttributedString не работает с SCNText

При создании текста геометрии из приписываемой строки, стили SceneKit текст в соответствии с атрибутами в строке, и свойство объекта SCNText определяет стиль по умолчанию для частей строки, не имеют атрибутов стиля.

Я пробовал это, но он не работает. SCNText, похоже, игнорирует атрибуты моей строки. Я проверил, правильно ли сохранено содержимое моей NSAttributedString и добавлено его в UILabel, где он отображается по назначению.

Почему 3D-текст не окрашен?

Вот небольшое тестовое приложение (из шаблона Single View Application) и скриншот:

Screenshot of test application

#import "ViewController.h" 

#import <SceneKit/SceneKit.h> 

@interface ViewController() 

@end 

@implementation ViewController 

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSAttributedString* str = [ViewController makeSomeText]; 

    [self addSceneViewWithText: str]; 
    [self addLabelWithText: str]; 
} 

+ (NSMutableAttributedString*) makeSomeText 
{ 
    NSDictionary* redAttr = @{NSForegroundColorAttributeName : [UIColor redColor]}; 
    NSDictionary* greenAttr = @{NSForegroundColorAttributeName : [UIColor greenColor]}; 
    NSDictionary* blueAttr = @{NSForegroundColorAttributeName : [UIColor blueColor]}; 

    NSAttributedString* redStr = [[NSAttributedString alloc] initWithString: @"red" attributes: redAttr]; 
    NSAttributedString* greenStr = [[NSAttributedString alloc] initWithString: @"green" attributes: greenAttr]; 
    NSAttributedString* blueStr = [[NSAttributedString alloc] initWithString: @"blue" attributes: blueAttr]; 

    NSMutableAttributedString* str = [[NSMutableAttributedString alloc] init]; 
    [str appendAttributedString: redStr]; 
    [str appendAttributedString: greenStr]; 
    [str appendAttributedString: blueStr]; 

    return str; 
} 

- (void) addSceneViewWithText: (NSAttributedString*) string 
{ 
    SCNView* view = [[SCNView alloc] initWithFrame: self.view.bounds]; 
    view.scene = [SCNScene scene]; 
    view.backgroundColor = [UIColor grayColor]; 
    view.autoenablesDefaultLighting = true; 
    view.allowsCameraControl = true; 
    SCNNode* root = view.scene.rootNode; 
    [self.view addSubview: view]; 

    SCNNode* cameraNode = [SCNNode node]; 
    cameraNode.camera = [SCNCamera camera]; 
    cameraNode.camera.automaticallyAdjustsZRange = true; 
    [root addChildNode: cameraNode]; 

    SCNText* text = [SCNText textWithString: string extrusionDepth: 3]; 
    // text.firstMaterial.diffuse.contents = [UIColor yellowColor]; 
    SCNNode* textNode = [SCNNode nodeWithGeometry: text]; 
    textNode.rotation = SCNVector4Make (1, 0, 0, 0.5f); 
    [root addChildNode: textNode]; 

    SCNVector3 text_center; 
    float dummy; 
    [text getBoundingSphereCenter: &text_center radius: &dummy]; 
    textNode.position = SCNVector3Make (-text_center.x, -text_center.y, -150); 
} 

- (void) addLabelWithText: (NSAttributedString*) string 
{ 
    CGRect bounds = self.view.bounds; 
    UILabel* label = [[UILabel alloc] initWithFrame: CGRectMake (0, 50, bounds.size.width, 50)]; 
    label.attributedText = string; 
    label.textAlignment = NSTextAlignmentCenter; 
    [self.view addSubview: label]; 
} 

- (void) didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
} 

@end 

ответ

2

В прямой ответ на ваш вопрос: «Почему 3D текст не окрашены? "

Цвет, вероятно, не считается частью «стиля», поскольку они используют слово в документах. Вероятно, это тоже неправильное слово, потому что это описание качеств текста, которые согнуты и скручены в каждом месте, которое когда-либо использовалось.

Скорее всего, что они хотят сказать, это вещи, такие как вес, выравнивание, подчеркивание, зачеркивания, кернинг и ведение ... вещи этой природы интерпретируются SceneKit. Но только проб и ошибок наверняка найдет, что делает и не работает.

Apple должна предоставлять таблицу со списком атрибутов/качеств текста, распознаваемых и используемых SceneKit.

Единственное использование «стиля», которое я могу найти в документах Core Text и NSAttributedString, предполагает, что эти фреймворки рассматривают слово для группировки этих качеств в абзаце, что также мало помогает, когда вы думаете о тексте SceneKit.


Edit: Дополнительный материал о 3D и материалов, только в случае, если это для вас новость:

«Материалы» в 3D говорят создавать впечатления цвета, реакция на свет, рефлексивность и других качеств материал на объекте в 3D, и его необходимо создать и применить. Это не так просто, как сказать «сделать objectABC красным», как в 2D-мышлении.

Один текстовый объект (в 3D говорят, а не о том, как вы думаете об этих вещах в какао), вероятно, не будет иметь возможности автоматизировать с использованием разных материалов и/или идентификаторов материалов в SceneKit. Идентификаторы материалов - это то, как различные материалы применяются к различным частям одного объекта в таких вещах, как 3ds Max, где большинство людей создают геометрию и материалы.

К сожалению, SceneKit не следует этому соглашению, вместо этого использует «элементы» как часть объектов геометрии, каждая из которых является частью индекса, который соответствует любым материалам, предоставляющим эту геометрию.

Вы можете прочитать об этом здесь:

https://developer.apple.com/library/ios/documentation/SceneKit/Reference/SCNGeometry_Class/index.html#//apple_ref/doc/uid/TP40012000-CLSCHSCNGeometry-SW15

Итак, чтобы получить то, что вы ищете, вы, вероятно, будет необходимо сделать 3 текстовые объекты и дать каждому из них уникальный материал из цвет, который вам нужен, или сломайте объект 3 слова на 3 элемента, а затем получайте удовольствие, угадывая, как получить нужный материал на каждом из них.

EDIT: Игнорировать последнюю часть вышеприведенного абзаца. Вам нужно сделать 3 текстовых объекта, чтобы получить внешний вид. Элементы распределения материала в наборе сцен зарезервированы в текстовых объектах, поэтому вы не можете разбить текст на уровне слова на разные элементы.

От Документах:

Текст геометрия может содержать один, три или пять геометрических элементов:

  • Если его свойство extrusionDepth 0.0, текст геометрии имеет один элемент, соответствующий его одна видимая сторона.

  • Если глубина экструзии больше нуля, и его свойство chamferRadius 0.0, текст геометрии имеет три элемента, соответствующие к его передней, задней и экструдированные сторон.

  • Если оба глубины экструзии и радиус фаски больше нуля, то текста геометрия состоит из пяти элементов, соответствующий его передней, задняя, ​​ экструдированных сторон, передняя фаска, фаска и обратно.

Смежные вопросы