2016-10-28 19 views
3

Я хочу отобразить несколько объектов, расположенных вокруг одной точки, например, на сфере, в пределах SceneKit, но есть некоторые проблемы с конфигурацией объектов.Настройка SCNNode в сцене

Основная идея состоит в том, чтобы сделать камеру в центре (0,0,0), и весь объект будет сконфигурирован для использования сферической системы координат, поэтому, когда я помещу объект вокруг в какую-нибудь сферическую систему изображений, я буду вращать камеру вокруг некоторой оси, чтобы смотреть на объект (ы) в выбранной части пространства.

Что я пытаюсь сделать для начала - хочу создать пустой SCNScene, добавить свет, прочитать .dae файл и настроить объекты.

Но пока я не могу понять, где я ошибаюсь - когда я пытаюсь изменить какое-либо свойство для SCNNode - ничего не изменилось. Также мне нужно поставить zFar для камеры странному большого значения - 10000 - чтобы быть в состоянии объекта см (я использую allowsCameraControl выставиться в YES сейчас, чтобы иметь возможность вращаться OBJ)

Собственно код:

SCNScene *scene = [SCNScene scene]; //main scene 

    SCNNode *cameraNode = [SCNNode node]; 
    cameraNode.camera = [SCNCamera camera]; 
    cameraNode.camera.zFar = 10000; //only with this value i can see my obj 
    cameraNode.position = SCNVector3Make(0, 0, 0); //position in the center 
    [scene.rootNode addChildNode:cameraNode]; 

    // create and add a light to the scene 
    SCNNode *lightNode = [SCNNode node]; 
    lightNode.light = [SCNLight light]; 
    lightNode.light.type = SCNLightTypeOmni; 
    lightNode.position = SCNVector3Make(0, 10, 10); 
    [scene.rootNode addChildNode:lightNode]; 

    // create and add an ambient light to the scene 
    SCNNode *ambientLightNode = [SCNNode node]; 
    ambientLightNode.light = [SCNLight light]; 
    ambientLightNode.light.type = SCNLightTypeAmbient; 
    ambientLightNode.light.color = [UIColor darkGrayColor]; 
    [scene.rootNode addChildNode:ambientLightNode]; 

    SCNScene *objScene = [SCNScene sceneNamed:@"art.scnassets/file.dae"]; 

    SCNMaterial *material = [SCNMaterial material]; 
    material.diffuse.contents = [UIImage imageNamed:@"art.scnassets/texture.png"]; 
    material.locksAmbientWithDiffuse = true; 

    SCNNode *node = [objScene.rootNode childNodeWithName:@"obj" recursively:YES]; 
    node.geometry.firstMaterial = material; 
//try next: 
// node.position = SCNVector3Make(0, 0, 0); 
// node.presentationNode.position = SCNVector3Make(0, 0, 0); -> should't be modified as explainde by Apple devs - "The effect of attempting to modify the returned node in any way is undefined" 
// node.transform = SCNMatrix4MakeScale(0.5, 0.5, 0.5); 
// node.scale = SCNVector3Make(0.1, 0.1, 0.1); 
    [scene.rootNode addChildNode:node]; 

Любое предложение? Может быть, я что-то пропустил - не очень хорошо знаком с SceneKit. Дополнительное примечание. У меня также есть анимация на основе кости в файле .dae.

Как изменить положение, масштаб, вращение SCNNode (при изменении свойства SCNNode на самом деле ничего не происходит)?

+0

Что вы видите? Что бы вы хотели увидеть? Снимок экрана поможет. –

+0

@HalMueller Я вижу полный объект, если я панорамирую экран - так что, если я применяю стандартную модификацию камеры ('allowCameraControl = YES;'), при запуске я вижу только часть объекта - так что это немного несоосность с началом fov. То, что я хочу увидеть, это масштабированный объект или объект, который можно перемещать в пространстве, если я изменяю положение по оси, или масштаб или что-то еще. Но, как я опишу выше, я вижу только часть obj, на ходу, как отмечено, я вижу весь объект. Дополнительно: когда я пытаюсь приостановить анимацию с помощью методов 'pauseAnimationForKey:', это alos не имеет никакого эффекта, но с '.presentationNode.paused = YES' - это работает. – gbk

ответ

0

Я думаю, что ключевая фраза в запросе является

я вращать камеру вокруг оси, чтобы смотреть на объект (ы) в выбранной части пространства.

Проверить SCNLookAtConstraint.

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

+0

Я вижу на AppleDev - «Ограничение, которое ориентирует узел всегда указывать на указанный другой узел». Всегда указывайте, но мне нужно создать сцену, где пользователь может видеть только часть объекта, зависящую от вращения телефона, возможно, с использованием CoreMotion или что-то подобное. – gbk

+0

Да. Но вы можете динамически изменять цель ограничения. Итак, если по мере поворота телефона вы измените цель ограничения на другой объект, камера укажет на него. –

+0

Камера точно укажет на объект? Иногда мне нужно указывать точки между несколькими объектами или указывать на пустое пространство. Возможно ли это с предлагаемым решением? – gbk