2014-06-14 1 views
0

현재 벽, 천장 및 바닥면이 3 개 밖에없는 장면을로드하려고 시도하고 있습니다. 믹서기에서 만든 장면을로드하고 잘로드합니다. 그러나 SCNBox의 기하학을 가진 SCNNode은 바로 통과합니다. 상자에 부착 된 동적 물리학 몸체가 있고 나는 수동으로 walls/floor을 정적 노드로 설정하고 있습니다. 다음은 장면을 설정하고 상자를 추가하는 데 사용하는 코드입니다. 필요한 경우 내 .dae을 게시 할 수도 있습니다. 누구나 무슨 일이 벌어 질지에 대한 아이디어가 있습니까?물리학 문제 .dae에서 SCNScene을로드 할 때

//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; 
} 

답변

0

노드에 대한 Geometry가 DAE에서 빌드되는 방식에 따라 SceneKit은 원하는 것을 수행하는 물리 도형을 자동으로 구성하지 못할 수도 있습니다.

대신 노드의 보이는 지오메트리와 분리하여 원하는 충돌 셰이프를 정확하게 만들려면 bodyWithType:shape:을 사용하십시오. 파라 메트릭 지오메트리 (예 : SCNBox, SCNSphere)에서 물리 도형을 만드는 것이 가장 효과적입니다.

+0

맞춤 지오메트리를 추가하려고했지만 내 상자가 계속 떨어지는 경우 원래의 질문에 수정하여 새 코드를 추가했습니다. – Jeremy1026

4

그래서 비슷한 문제가있었습니다. 이 문제는 파일이 3D 모델링 소프트웨어에서 어떻게 생성되었는지에 기인합니다. Blender를 사용하여 이것을 테스트했습니다. 나는 상자가있는 비행기를 만들었고 상자에 물리학 자체를 추가했고 비행기와 상자는 쓰러졌습니다. 이것이 저울과 관련이 있다는 것을 깨달았습니다. 블렌더에서 CTRL A를 누르고 스케일 옵션을 선택하여 스케일을 1.0 1.0 1.0으로 리셋하는 오브젝트 변환을 적용했습니다. 그래서 궁극적으로 일어나는 일은 SceneKit이 기본 지오메트리를 사용하여 지오메트리의 변형을 무시한다는 것입니다. 화면에서 볼 수있는 것은 노드의 변형이 적용된 기본 형상입니다. Collada 파일을 내보내기 전에 변환을 ID로 설정하면 사용자가 설정해야합니다.

+0

상자의 형상을 어떻게 작성 했습니까? – Jeremy1026

+0

나는 블렌더와 당신이 그랬던 방식으로 도형을 만들었습니다. 둘 다 일했다. 또한 옵션 사전 NSDictionary * options = [NSDictionary dictionaryWithObject : SCNPhysicsShapeTypeConvexHull forKey : SCNPhysicsShapeTypeKey]로 놀고 싶을 수도 있습니다. 또는 SCNPhysicsShapeTypeConcavePolyhedron을 사용하여 얻은 결과를 확인하십시오. 나는 시험을 추천하고, Blender의 dae 파일에서 간단한 장면을로드하는 아주 새로운 프로젝트를 시작한다. Blender에서 입방체와 평면을 만듭니다. 평면을 축척 한 후 CTRL A를 눌러 축척 변환을 재설정합니다. – demeigh27