我想在SceneKit场景中显示一些文字,其中字符具有不同的颜色。 documentation of SCNText州:
当您从属性字符串创建文本几何体时,SceneKit会根据字符串中的属性设置文本样式,并且SCNText对象的属性确定字符串中没有样式属性的部分的默认样式。
我试过了,但它没有用。 SCNText似乎忽略了我的字符串的属性。我检查了我的NSAttributedString的内容是否正确并将其添加到UILabel中,并按预期显示。
为什么3D文字没有着色?
这是一个小型测试应用程序(来自Single View 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
答案 0 :(得分:3)
直接回答您的问题:&#34;为什么3D文字没有着色?&#34;
颜色可能不被视为&#34; style&#34;因为他们正在使用文档中的单词。它可能也是一个错误的用词,因为它描述了文字的质量,这些文字在它曾经使用过的每一个地方都会被弯曲和扭曲。
他们的意思很可能就是说重量,对齐,下划线,删除线,字距调整和引导......这种性质的东西都是由SceneKit解释的。但只有反复试验才能确定哪些有效,哪些无效。
Apple应该提供一个表格,其中包含SceneKit识别和使用的文本属性/质量列表。
&#34; style&#34;的唯一用途我可以在Core Text和NSAttributedString文档中找到这些文档,建议这些框架考虑每个段落对这些类型的质量进行分组,这在思考SceneKit文本时也几乎没有帮助。
编辑:关于3D和材料的其他内容,以防这对您来说是新闻:
&#39;材料&#39;在3D中,用3D创建颜色的印象,对光的反射,反射和材料的其他质量,并且需要创建和应用。它并不像说&#34;使objectABC为红色&#34;就像二维思维一样。
单个文本对象(用3D表示,而不是你如何看待Cocoa中的这些东西)可能无法通过SceneKit中的不同材质和/或材质ID自动制作。材质ID是在3ds Max等大多数人创建几何体和材质的东西中,不同材质应用于单个对象的不同部分的方式。
不幸的是,SceneKit并没有遵循这个惯例,而是使用&#39;元素&#39;作为几何对象的一部分,每个对象都是索引的一部分,该索引对应于提供该几何的任何材料。
您可以在此处详细了解:
因此,要获得您正在寻找的东西,可能需要制作3个文本对象并为每个文本对象提供您想要的颜色的独特材料,或打破3个字对象分为3个元素,然后猜测如何在每个元素上获得正确的材料。
编辑:忽略上段的最后一部分。你需要制作3个文本对象才能获得你想要的外观。 Scene Kit中的材质分布的元素功能保留在文本对象上,因此您无法将单词级别的文本分解为不同的元素。
来自docs:
文本几何体可能包含一个,三个或五个几何元素:
如果其extrusionDepth属性为0.0,则文本几何具有一个 元素对应于其一个可见侧。
如果其拉伸深度大于零且其chamferRadius property是0.0,文本几何有三个元素,对应 到它的正面,背面和挤压边。
如果挤出深度和倒角半径都大于零,则为 文本几何有五个元素,对应于它的正面,背面, 挤压边,前倒角和后倒角。