【问题标题】:Physics Issue When Loading SCNScene from .dae从 .dae 加载 SCNScene 时的物理问题
【发布时间】:2014-08-05 01:15:46
【问题描述】:

我正在尝试加载当前只有 3 面墙、天花板和地板的场景。我正在加载我在搅拌机中创建的场景并加载它。但是,具有SCNBox 几何形状的SCNNode 会直接通过。该盒子附有一个动态物理体,我手动将walls/floor 设置为静态节点。下面是我用来设置场景和添加框的代码,如果需要,我也可以发布我的.dae。有人对可能发生的事情有任何想法吗?

//Load the scene from file
SCNScene *scene = [SCNScene sceneNamed:@"mainScene.dar"];

//Get each node in the scene, and give it a static physics bodt
for (SCNNode *node in [[scene rootNode] childNodes]) {
    SCNPhysicsBody *staticBody = [SCNPhysicsBody staticBody];
    staticBody.restitution = 1.0;
    node.presentationNode.physicsBody = staticBody;
    NSLog(@"node.name %@",node.name);
}

//Create box
SCNNode *block = [SCNNode node];
block.position = SCNVector3Make(0, 0, 3);

//Set up the geometry
block.geometry = [SCNBox boxWithWidth:.8 height:.8 length:.8 chamferRadius:0.05];
block.geometry.firstMaterial.diffuse.mipFilter = SCNFilterModeLinear;
block.castsShadow = YES;


//Make it blue
for (SCNMaterial *mat in block.geometry.materials) {
    mat.emission.contents = [UIColor blueColor];
}


//Add physics body
SCNPhysicsBody *body = [SCNPhysicsBody staticBody];
body.mass = 5;
body.restitution = .7;
body.friction = 0.5;
block.physicsBody = body;

//Add the node to the scene
[[scene rootNode] addChildNode:block];

为了回应 ricksters 的回答,我尝试为每个新节点创建自定义几何图形,但我的盒子仍然失败。这是我用于自定义几何的代码。这替换了原始代码中的 for-in。

//Get each node in the scene, and give it a static physics bodt
for (SCNNode *node in [[scene rootNode] childNodes]) {
    SCNGeometry *geometry = [SCNBox boxWithWidth:node.scale.x height:node.scale.y length:node.scale.z chamferRadius:0.0];
    SCNPhysicsShape *physicsShape = [SCNPhysicsShape shapeWithGeometry:geometry options:nil];
    SCNPhysicsBody *staticBody = [SCNPhysicsBody bodyWithType:SCNPhysicsBodyTypeStatic shape:physicsShape];
    staticBody.restitution = 1.0;
    node.physicsBody = staticBody;
}

【问题讨论】:

    标签: ios objective-c scenekit


    【解决方案1】:

    所以我遇到了类似的问题。我发现问题源于文件是如何在 3d 建模软件中创建的。我正在使用 Blender 来测试这个;我用一个盒子制作了一架飞机,在盒子上添加了一个物理体,然后飞机和盒子掉了下来。我意识到这与规模有关。在 Blender 中,我应用了对象变换,通过按 CTRL A 并选择缩放选项,将缩放重置为 1.0 1.0 1.0。所以最终似乎正在发生的是 SceneKit 使用基本几何体忽略几何体的变换。您在屏幕上看到的是应用了节点变换的基本几何图形。在导出 Collada 文件之前将转换设置为身份,您应该已经设置好了。

    【讨论】:

    • 你是如何为盒子创建几何图形的?
    • 我在 Blender 中创建了几何图形,并按照您的方式创建了几何图形。两者都有效。您可能还想使用选项字典 NSDictionary *options = [NSDictionary dictionaryWithObject:SCNPhysicsShapeTypeConvexHull forKey:SCNPhysicsShapeTypeKey];或者也使用 SCNPhysicsShapeTypeConcavePolyhedron 看看你得到了什么。我建议进行测试,开始一个全新的项目,从 Blender 的 dae 文件中加载一个简单的场景。在 Blender 中制作一个立方体和一个平面。缩放平面后,按 CTRL A 重置缩放变换。
    【解决方案2】:

    根据在 DAE 中构建这些节点的几何形状的方式,SceneKit 可能无法自动构建符合您要求的物理形状。

    相反,使用bodyWithType:shape: 精确创建您想要的碰撞形状,与节点的可见几何图形分开。从参数几何创建物理形状(例如SCNBoxSCNSphere)效果最好。

    【讨论】:

    • 我尝试添加自定义几何图形,但我的框仍然失败,我在原始问题的编辑中添加了新代码。
    猜你喜欢
    • 2018-04-10
    • 2017-09-12
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 2013-08-20
    • 2017-12-07
    • 2017-12-16
    相关资源
    最近更新 更多