我正在开发一个ARKit应用程序,您可以在其中浏览门户网站并在其他地方工作。我购买了一个拱门的3d模型作为门户。我将模型放入Blender将其压平为一块,但纹理消失了,每当我应用新纹理时,它只显示在模型的一部分上。
这是原始模型,只能通过将其更改为.dae格式进行修改。但是,我无法反复加载arch1,arch2,arch3等,而无需反复编写相同的行
使用这个模型,我一遍又一遍地编写相同的代码
private func addPortalArch(hitResult: ARHitTestResult) {
let portalScene = SCNScene(named: "art.scnassets/Medieval_portal.dae")
let portalNode = portalScene?.rootNode.childNode(withName: "arch1", recursively: true)
//我正在为每个拱门反复写这个portalNode = portalScene行。
//据我所知,我还必须获得每件作品的位置,我不知道我是如何根据用户点击放置门户的位置开始这样做的
portalNode?.position = SCNVector3(hitResult.worldTransform.columns.3.x, hitResult.worldTransform.columns.3.y, hitResult.worldTransform.columns.3.z)
self.sceneView.scene.rootNode.addChildNode(portalNode!)
}
我需要模型一次性完成但仍然在整个模型中使用相同的石雕材料。
答案 0 :(得分:0)
查看您发送的文件,最好的办法是使用包含拱门各个方面的模型(第1张图片)。
第一步(并非总是必要但有用)是将dae
文件转换为.scn
文件:
完成此操作后,您需要创建一个Empty Node
作为门户门RootNode
,并使门户网站的每个元素成为这样的孩子:
您还需要将每个ChildNode
的(不是PortalRoot)欧拉角X旋转-90(当您加载模型时门户门就在它旁边):
现在,由于您只有一个RootNode,因此无需遍历所有节点,以便显示在屏幕上。你可以简单地使用这样的函数:
/// Places The Portal Door 5m Aeay From The Camera
func setupPortalDoor(){
//1. Get The Portal Scene
guard let portalScene = SCNScene(named: "portalDoor.scn"),
//2. Get The Portal Node
let portalModel = portalScene.rootNode.childNode(withName: "PortalRoot", recursively: false) else { return }
//3. Add To The ARSCNView Root
augmentedRealityView?.scene.rootNode.addChildNode(portalModel)
//4. Position It 5m Away From The Camera
portalModel.position = SCNVector3(0, 0, -5)
/*
The Portal Is Large So I Suggest Scaling It ^__________*
*/
}
如果您以后想要将门户拱门更改为大理石,您可以轻松地执行此操作:
for node in portalModel.childNodes{
node.geometry?.firstMaterial?.diffuse.contents = UIColor.cyan
}
希望这会有所帮助......