ios - 为什么 SCNLights 适用于 Apple 的内置几何图形,而不适用于 OBJ 或 DAE 文件?
问题描述
我整天都在努力让我的 SCNLights 在我的场景模型上工作。我有一个 SCNNode,一个 SCNLight 在游戏中投射一个“.spot”类型的光。
当我使用 Apple 的内置 SCNBox 并点亮对象(图像中的橙色)时,灯光会得到适当的调整。但是,当使用我自己的模型(绿草)时,无论使用何种位掩码,照明都不合适。怎么来的?我需要在我的代码中进行哪些更改,以便我的模型正确响应位掩码?
我已经尝试使用 OBJ、DAE 和 SCN 文件(通过转到编辑器 -> 转换为 SceneKit 文件格式),它们都产生了同样的问题。我首先认为我的位掩码是问题所在,但它们在苹果的原始模型上运行良好,但不是我的。
橙色长方体的代码:
//These few lines sit in a class called "Tile," which contains an SCNNode called "grass"
let grassGeo = SCNBox(width: 0.3, height: 0.6, length: 0.3, chamferRadius: 0)
grassGeo.materials.first!.diffuse.contents = UIColor.orange
self.grass.geometry = grassGeo
self.grass.position = SCNVector3(0, 0, 0)
self.grass.categoryBitMask = Constants.bitMask.tile
self.addChildNode(self.grass)
草模型代码
self.grass = SCNNodeFromDAE(filePath: "testgame.scnassets/Models/t_grass/t_grass.dae")
self.grass.scale = SCNVector3(1, 1, 1)
self.grass.position = SCNVector3(0, 0, 0)
self.grass.categoryBitMask = Constants.bitMask.tile
self.addChildNode(grass)
代码SCNNodeFromDAE
:
func SCNNodeFromDAE(filePath: String) -> SCNNode {
guard let s = SCNScene(named: filePath) else { fatalError("Failed to find DAE file.") }
let n = SCNNode()
for i in s.rootNode.childNodes {
n.addChildNode(i as SCNNode)
}
return n
}
更新:根据@Lock 的建议,我发现连接到场景相机的灯正在照亮节点,但是,我使用的是位掩码,这应该会给我想要的结果。我没有正确设置/使用它们吗?这是相机设置代码,我的位掩码结构在一个名为“常量”的文件中:
func setupCamera() {
cam = SCNNode()
cam.camera = SCNCamera()
cam.eulerAngles = c.camAngle
cam.light = SCNLight()
cam.light!.type = .omni
cam.light!.color = UIColor.white
cam.light!.intensity = c.cam_l_intensity
cam.light!.categoryBitMask = Constants.bitMask.usr //ONLY light the user
scn.rootNode.addChildNode(cam)
}
这是位掩码代码:
struct bitMask {
static let usr:Int = 0x1 << 0 //1
static let tile:Int = 0x1 << 1 //2
}
解决方案
推荐阅读
- python - 如何处理从 Dataframe 到 SQL 的大整数
- javascript - 期望从 observable 的下一个处理程序中抛出错误,使用 Jasmine 测试 Angular
- visual-studio-code - 如何在@符号上使用换行符格式化VS Code中的车把?
- linux - Systemctl 命令正在返回此输出。`无法获取属性:启动帮助程序以未知的返回码 1 退出`
- react-native - 请有人告诉我如何解决这个问题
- javascript - 如何在 Vue3 的 js 文件中访问 Vue 实例?
- go - 按自定义参数过滤 Hugo 分页
- ros - ROS Gmaping 能否像 Google 的 Cartographer 一样出色地处理大地图?
- java - java可以用pdfbox把红戳变成黑色吗
- android - 从 Play 商店结算库中获取用户的货币