在场景中配置 SCNNode

Posted

技术标签:

【中文标题】在场景中配置 SCNNode【英文标题】:Configure SCNNode in scene 【发布时间】:2017-03-11 10:15:03 【问题描述】:

我想在SceneKit 内显示一些放置在一个点周围的对象,例如在球体上,但对象配置有一些问题。

主要的想法是让相机定位在中心 (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 的属性实际上什么都没有发生)?

【问题讨论】:

你看到了什么?你要看什么?截图会有所帮助。 @HalMueller 如果我平移屏幕,我会看到完整的对象 - 这意味着如果我应用标准相机修改 (allowsCameraControl = YES;),在开始时我只看到对象的一部分 - 所以它与开始有点不一致视野我想看到它是按比例缩小的对象,或者如果我改变历史位置或比例或其他可以在空间中移动的对象。但正如我上面描述的,我只能看到 obj 的一部分,如前所述,在移动时我看到了所有对象。附加:当我尝试使用 pauseAnimationForKey: 方法暂停动画时,它的 alos 没有效果,但使用 .presentationNode.paused = YES - 它有效。 【参考方案1】:

我认为您请求中的关键短语是

我将围绕轴旋转相机以查看 选定的空间部分。

检查SCNLookAtConstraint。

您可以使用约束属性将约束分配给 SCNNode。将目标节点更改为空间选定部分对应的对象。

【讨论】:

我在 AppleDev 上看到 - “将节点定向为始终指向指定的其他节点的约束。”始终指向,但我需要制作用户只能看到部分对象的场景,这取决于手机旋转,可能使用 CoreMotion 或类似选项 是的。但是您可以动态更改约束的目标。因此,如果随着手机旋转,您将约束的目标更改为不同的对象,相机将指向它。 相机会准确指向 obj 吗?我有时需要指向几个 obj 之间的点或指向空白空间。建议的解决方案是否可行? 它将指向您传递给它的任何 SCNNode。您可以在必要时始终将空节点作为目标(只是占位符,没有附加任何几何图形)。但是,如果这对于您的目的来说太复杂了,那么您将不得不自己为相机进行计算。

以上是关于在场景中配置 SCNNode的主要内容,如果未能解决你的问题,请参考以下文章

数据流行Zookeeper典型应用场景介绍

场景选项配置--笔记

spring security4.2 配置CSRF防御场景

ZooKeeper典型应用场景一览

Alluxio架构场景与部分配置参数详解

如何在 laravel 中配置多封电子邮件 [关闭]