Настройте SCNNode в сцене

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

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

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

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

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

    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 фактически ничего не происходит)?


person hbk    schedule 28.10.2016    source источник
comment
Что ты видишь? Что бы вы хотели увидеть? Скриншот не помешал бы.   -  person Hal Mueller    schedule 30.10.2016
comment
@HalMueller я вижу весь объект, если я перемещаю экран - то есть, если я применяю стандартную модификацию камеры (allowsCameraControl = YES;), при запуске я вижу только часть объекта - так что это немного не совпадает с начальным полем зрения. То, что я хочу видеть, это масштабируемый объект или объект, который можно перемещать в пространстве, если я изменю его положение, или масштаб, или что-то еще. Но, как я описал выше, я могу видеть только часть объекта, при движении, как уже отмечалось, я вижу весь объект. Дополнительно: когда я пытаюсь приостановить анимацию с помощью методов pauseAnimationForKey:, это также не имеет никакого эффекта, но с помощью .presentationNode.paused = YES - это работает.   -  person hbk    schedule 30.10.2016


Ответы (1)


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

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

Проверьте SCNLookAtConstraint.

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

person Karl Sigiscar    schedule 28.10.2016
comment
Я вижу в AppleDev — ограничение, которое ориентирует узел так, чтобы он всегда указывал на указанный другой узел. Всегда указывайте, но мне нужно сделать сцену, в которой пользователь может видеть только часть объекта, в зависимости от поворота телефона, возможно, с использованием CoreMotion или чего-то подобного - person hbk; 28.10.2016
comment
Да. Но вы можете динамически изменить цель ограничения. Итак, если во время вращения телефона вы измените цель ограничения на другой объект, камера укажет на него. - person Karl Sigiscar; 31.10.2016
comment
камера будет указывать точно на obj? Иногда мне нужно указать точку между несколькими объектами или указать на пустое пространство. Возможно ли это с предложенным решением? - person hbk; 31.10.2016
comment
Он будет указывать на любой SCNNode, который вы ему передадите. Вы всегда можете иметь пустые узлы в качестве целей, где это необходимо (просто заполнители, без какой-либо прикрепленной геометрии). Но если это слишком запутанно для вашей цели, то вам придется сделать расчеты для камеры самостоятельно. - person Karl Sigiscar; 01.11.2016