У меня есть SenseKit SceneView с подсветкой камеры и модели. У меня также есть view.allowsCameraControl = YES
.Я хочу хранить pointOfView.position ofCameraControl in coredata
Я понимаю, что когда я использую это, он создает новую камеру, прикрепленную к rootNode
моей сцене. Я пытаюсь захватить позицию, поворот и ориентацию камеры и сохранить ее в основных данных. Поэтому, когда проект вызывается снова, эти значения могут быть помещены в мою камеру, которую я положил в сцену.
Прямо сейчас у меня есть приложение, которое создает проект со статической камерой, установленной в SCNVectorMake3(0, -550, 900)
. Это была начальная дата, когда пользователь показывает, что они могут зажимать, панорамировать и вращать, а когда они нажимают «Сохранить», отображаются сцена и сохраняет все там другие изменения, такие как текст и фоновое изображение в основных данных, но, конечно, мне нужно добавить атрибут к Entity для тысяч значений.
Я добавил NSLog
, чтобы распечатать положение, поворот и ориентацию в окне вывода, поэтому я знаю, что данные генерируются и должны быть извлечены. Мне нужна переменная для положения, вращения и ориентации камеры, а также метод, который проверяет, чтобы они не были (0, 0, 0)
, и если они установлены по умолчанию (0, -550, 900)
.
Прошу прощения за отсутствие опыта, но я просто изучаю цель-c. Я был повсюду в Интернете и видел несколько способов вращения дуги, но ничего, что захватывает ценности из SecneKits allowsCameraControl
и добавляет их в камеру, которая в моем случае была бы легким решением.
Вот мой код ...
- (struct SCNVector3) readCameraPosition {
return SCNVector3Make(
_topScene.pointOfView.position.x,
_topScene.pointOfView.position.y,
_topScene.pointOfView.position.z);
}
- (void) update3DTextForScene: (SCNView *)view{
height3DString = 0;
view.scene = [SCNScene scene];
view.allowsCameraControl = YES;
SCNScene *scene = view.scene;
NSLog(@"Camera position: %f %f %f",
_topScene.pointOfView.position.x,
_topScene.pointOfView.position.y,
_topScene.pointOfView.position.z);
NSLog(@"Camera rotation: %f %f %f %f",
_topScene.pointOfView.rotation.x,
_topScene.pointOfView.rotation.y,
_topScene.pointOfView.rotation.z,
_topScene.pointOfView.rotation.w);
NSLog(@"Camera orientat: %f %f %f %f",
_topScene.pointOfView.orientation.x,
_topScene.pointOfView.orientation.y,
_topScene.pointOfView.orientation.z,
_topScene.pointOfView.orientation.w);
view.backgroundColor = [UIColor UIColorFromRGBAhex:0xFFFFFF00];
// camera
self.cameraNode = [SCNNode node];
self.cameraNode.camera = [SCNCamera camera];
[scene.rootNode addChildNode:self.cameraNode];
view.pointOfView = self.cameraNode;
self.cameraNode.camera.zFar = 10000;
self.cameraNode.position = SCNVector3Make(0, -550, 900);
self.cameraNode.rotation = SCNVector4Make(1.0, 0, 0, 0.588002);
self.cameraNode.orientation = SCNVector4Make(0.289784, 0, 0, 0.957092);
self.cameraNode.camera.xFov = 40;
//self.cameraNode.eulerAngles = SCNVector3Make(atan(2./3.), 0, 0);
// light
UIColor *lightColorLeft = [UIColor UIColorFromRGBhex:0xFFFFFF];
UIColor *lightColorRight = [UIColor UIColorFromRGBhex:0xFFFFFF];
_lightLeftNode = [SCNNode node];
_lightLeftNode.light = [SCNLight light];
_lightLeftNode.light.type = SCNLightTypeSpot;
_lightLeftNode.light.color = lightColorLeft;
_lightLeftNode.light.spotInnerAngle = 30;
_lightLeftNode.light.spotOuterAngle = 120;
_lightLeftNode.light.shadowRadius = 5.0;
_lightLeftNode.light.zFar = 10000;
_lightLeftNode.castsShadow = YES;
_lightLeftNode.eulerAngles = SCNVector3Make(0.6, 0, 0);
[scene.rootNode addChildNode:_lightLeftNode];
_lightRightNode = [SCNNode node];
_lightRightNode.light = [SCNLight light];
_lightRightNode.light.type = SCNLightTypeSpot;
_lightRightNode.light.color = lightColorRight;
_lightRightNode.light.spotInnerAngle = 30;
_lightRightNode.light.spotOuterAngle = 120;
_lightRightNode.light.shadowRadius = 5.0;
_lightRightNode.light.zFar = 10000;
_lightRightNode.castsShadow = YES;
_lightRightNode.eulerAngles = SCNVector3Make(0.6, 0, 0);
[scene.rootNode addChildNode:_lightRightNode];
// text
_arrayTextNodes = [NSMutableArray new];
NSString *text = [_project findBlockWithType:0].text;
NSArray *stringArray = [text componentsSeparatedByString: @"\n"];
for (NSString *string in stringArray) {
[_arrayTextNodes addObject: [self addTextNoteWithText: string view:view]];
}
CGFloat height = 0;
for (NSInteger i = 0; i < _arrayTextNodes.count; ++i) {
height += [self takeANewPositionForTextNote: _arrayTextNodes[i] withIndex: i];
}
self.lightRightNode.position = SCNVector3Make(300,
250,
600);
self.lightLeftNode.position = SCNVector3Make(-300,
250,
600);
self.lightRightNode.eulerAngles = SCNVector3Make(0.2, 0.1, 0);
self.lightLeftNode.eulerAngles = SCNVector3Make(0.2, -0.1, 0);
}
////////////////////////////////////////////////////////////////////
#pragma mark - ScreenKit
////////////////////////////////////////////////////////////////////
- (SCNNode *) addTextNoteWithText: (NSString *) text view:(SCNView *)view{
TextBlock *textBlockTopScene = [_project findBlockWithType:0];
CGFloat mainSize = textBlockTopScene? [textBlockTopScene.size integerValue] * 3 : 90;
SCNText *sceneText = [SCNText textWithString:text extrusionDepth: textBlockTopScene? [textBlockTopScene.depth doubleValue] : mainSize/3. ];
sceneText.chamferRadius = MIN(sceneText.extrusionDepth/5., 5); // first way
sceneText.font = textBlockTopScene?
[UIFont fontWithName:textBlockTopScene.font size: mainSize] :
[UIFont fontWithName:@"HelveticaNeue-Medium" size: mainSize];
sceneText.alignmentMode = kCAAlignmentCenter;
sceneText.wrapped = YES;
SCNNode *textNode = [SCNNode nodeWithGeometry:sceneText];
SCNMaterial *material1 = [SCNMaterial new];
material1.diffuse.contents = [UIColor UIColorFromRGBhex: textBlockTopScene? [textBlockTopScene.color integerValue] : 0];
UIColor * specularColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"noise"]];
material1.specular.contents = [specularColor offsetWithHue:0 saturation:0 lightness: textBlockTopScene? [textBlockTopScene.specular doubleValue] : 0.5 alpha:0];
textNode.geometry.materials = @[material1];
[view.scene.rootNode addChildNode:textNode];
return textNode;
}
- (CGFloat) takeANewPositionForTextNote: (SCNNode *) textNode withIndex: (NSInteger) index{
SCNVector3 v1 = SCNVector3Make(0,0,0);
SCNVector3 v2 = SCNVector3Make(0,0,0);
[textNode getBoundingBoxMin:&v1 max:&v2];
NSInteger count = _arrayTextNodes.count;
CGFloat dx = (v1.x - v2.x)/2.0;
CGFloat dy = (v1.y - v2.y)/2.0;
if (!height3DString) {
height3DString = dy;
}
textNode.position = SCNVector3Make(dx,
height3DString * ((count + index * 2.5) - (count - 1) * 2.5),
0);
return dy * 1.25;
}
Но когда вы запускаете приложение you'er либо создавая новый проект, который имеет значение по умолчанию для положения камеры или открытия проекта, который уже был сохранен в ядре данные с внесенными в него изменениями. Если я не сохраню изменения пользователей в позиции камеры в основных данных, когда они закроют проект, они будут потеряны и будут установлены по умолчанию при их повторном открытии. Имеет ли смысл, почему мне нужно использовать основные данные?
Но когда вы запускаете приложение, вы создаете новый проект, который имеет настройку по умолчанию или открывает проект, который уже внес изменения, тысячи изменений хранятся в основных данных, потому что когда вы создаете новый проект или начинаете для редактирования другого, все данные, которые не хранятся в core-data, освобождаются, выкидываются. Если пользователь перемещает камеру, а затем сохраняет и затем открывает сохраненный проект, мне нужна камера, чтобы она находилась в последней сохраненной позиции и вращении. Имеет ли смысл, почему мне нужно использовать основные данные? – losersteelman
Кулак всего благодарю за помощь Маркус. Я очень ценю это. Я не знаю, объясняю ли я это правильно, или просто не понимаю вашего ответа. Я уже использую CoreData. Я храню три объекта Project, BackgroundSettings, TextBlock. В разделе Project у меня есть пять атрибутов, backgroundURL, dateCreated, imageURL, имя и ориентация. Я думал, что добавлю его прямо сейчас для камеры, если я смогу добиться этого, я бы добавил еще две камерыRotation и cameraOrientation. – losersteelman
В приложении вы можете создать новый проект, когда вы это сделаете, он создает все настройки по умолчанию. Затем вы устанавливаете изменение фонового изображения, текста, используемого шрифта, размера текста и других пользовательских вариантов, затем вы сохраняете. Все тысячи редактирований теперь сохраняются в основных данных. Существует список со всеми вашими проектами, это может быть от нуля до пятидесяти различных проектов. Как получить измененную позицию камеры в каждом проекте для сохранения с этим проектом, если я не использую CoreData? Это карточки, которые люди делают и экономят, и возвращаются к редактированию. В очередной раз благодарим за помощь. – losersteelman