修改 3D 模型的边界框大小
Modify the Bounding Box Size of 3D model
此函数应该在有限的空间内将 3D 模型添加到屏幕上 space:
func addCharacter(gridPosition: SCNVector3, levelNode: SCNNode){
let carScene = SCNScene(named: "assets.scnassets/Models/cube.dae")
// Create a material using the model_texture.tga image
let carMaterial = SCNMaterial()
carMaterial.diffuse.contents = UIImage(named: "assets.scnassets/Textures/model_texture.tga")
carMaterial.locksAmbientWithDiffuse = false
// Create a clone of the Car node of the carScene - you need a clone because you need to add many cars
let carNode = carScene!.rootNode.childNodeWithName("Cube", recursively: false)!.clone() as SCNNode
carNode.name = "Cube"
carNode.position = gridPosition
// Set the material
carNode.geometry!.firstMaterial = carMaterial
// Create a physicsbody for collision detection
let carPhysicsBodyShape = SCNPhysicsShape(geometry: SCNBox(width: 0.30, height: 0.20, length: 0.16, chamferRadius: 0.0), options: nil)
carNode.physicsBody = SCNPhysicsBody(type: SCNPhysicsBodyType.Kinematic, shape: carPhysicsBodyShape)
carNode.physicsBody!.categoryBitMask = PhysicsCategory.Car
carNode.physicsBody!.collisionBitMask = PhysicsCategory.Player
levelNode.addChildNode(carNode)
}
如果我在将 dae 文件添加到 Xcode 之前更改它的尺寸,代码就可以工作,尺寸是指 Xcode 的边界框大小 属性。我想知道是否可以直接从 Xcode 更改此边界框大小。从UI看来是不可能的。有可能用代码吗?或者,更好的是,将保持比例的对象缩小到 XYZ 范围 0.3 -> 0.7 之间的大小?目前,我的对象显示的 XYZ 框大小超过 45。此外,如果我在上面的代码中使用 .scn 文件而不是 .dae,它仍然有效吗?
编辑:
如果我通过代码更改大小,是否会对效率产生影响?我注意到对于较大的 .dae 模型,fps 从 60 下降到 30,并且游戏速度变慢。
改变 carNode
的 scale
属性 将减小汽车的外观尺寸。
但是,我认为您会提前将 .DAE 加载到 Xcode 场景编辑器中。这将允许您提前缩小它(在节点检查器中,option-command-3)。如果需要,您也可以添加纹理。然后将其另存为 .SCN 文件,压缩后加载速度应该更快。
在代码中或在 Xcode 场景编辑器中更改缩放比例不会影响效率。不过,降低汽车的复杂性(polygons/vertices 的数量)会加快速度。
考虑为您的汽车节点创建 SCNLevelOfDetail
个实例。当节点远离相机时,这将导致渲染器使用替代的、较低分辨率的几何体。 WWDC 2014 幻灯片演示了这一点,幻灯片 38,AAPLSlideLOD.m。
此函数应该在有限的空间内将 3D 模型添加到屏幕上 space:
func addCharacter(gridPosition: SCNVector3, levelNode: SCNNode){
let carScene = SCNScene(named: "assets.scnassets/Models/cube.dae")
// Create a material using the model_texture.tga image
let carMaterial = SCNMaterial()
carMaterial.diffuse.contents = UIImage(named: "assets.scnassets/Textures/model_texture.tga")
carMaterial.locksAmbientWithDiffuse = false
// Create a clone of the Car node of the carScene - you need a clone because you need to add many cars
let carNode = carScene!.rootNode.childNodeWithName("Cube", recursively: false)!.clone() as SCNNode
carNode.name = "Cube"
carNode.position = gridPosition
// Set the material
carNode.geometry!.firstMaterial = carMaterial
// Create a physicsbody for collision detection
let carPhysicsBodyShape = SCNPhysicsShape(geometry: SCNBox(width: 0.30, height: 0.20, length: 0.16, chamferRadius: 0.0), options: nil)
carNode.physicsBody = SCNPhysicsBody(type: SCNPhysicsBodyType.Kinematic, shape: carPhysicsBodyShape)
carNode.physicsBody!.categoryBitMask = PhysicsCategory.Car
carNode.physicsBody!.collisionBitMask = PhysicsCategory.Player
levelNode.addChildNode(carNode)
}
如果我在将 dae 文件添加到 Xcode 之前更改它的尺寸,代码就可以工作,尺寸是指 Xcode 的边界框大小 属性。我想知道是否可以直接从 Xcode 更改此边界框大小。从UI看来是不可能的。有可能用代码吗?或者,更好的是,将保持比例的对象缩小到 XYZ 范围 0.3 -> 0.7 之间的大小?目前,我的对象显示的 XYZ 框大小超过 45。此外,如果我在上面的代码中使用 .scn 文件而不是 .dae,它仍然有效吗?
编辑: 如果我通过代码更改大小,是否会对效率产生影响?我注意到对于较大的 .dae 模型,fps 从 60 下降到 30,并且游戏速度变慢。
改变 carNode
的 scale
属性 将减小汽车的外观尺寸。
但是,我认为您会提前将 .DAE 加载到 Xcode 场景编辑器中。这将允许您提前缩小它(在节点检查器中,option-command-3)。如果需要,您也可以添加纹理。然后将其另存为 .SCN 文件,压缩后加载速度应该更快。
在代码中或在 Xcode 场景编辑器中更改缩放比例不会影响效率。不过,降低汽车的复杂性(polygons/vertices 的数量)会加快速度。
考虑为您的汽车节点创建 SCNLevelOfDetail
个实例。当节点远离相机时,这将导致渲染器使用替代的、较低分辨率的几何体。 WWDC 2014 幻灯片演示了这一点,幻灯片 38,AAPLSlideLOD.m。