好的,我们已经在 a 中绘制了几个东西MTKView
我们可以使用 Metal、MetalKit 函数移动和转动它们,但是我们无法获得 3D (x,y,z) 中给定点的像素信息。我们搜索了几个小时,但找不到任何解决方案。
问问题
446 次
2 回答
2
不可能从 3D 模型空间获取颜色,但可以从 2D 视图空间获取颜色。
func getColor(x: CGFloat, y: CGFloat) -> UIColor? {
if let curDrawable = self.currentDrawable {
var pixel: [CUnsignedChar] = [0, 0, 0, 0] // bgra
let textureScale = CGFloat(curDrawable.texture.width) / self.bounds.width
let bytesPerRow = curDrawable.texture.width * 4
let y = self.bounds.height - y
curDrawable.texture.getBytes(&pixel, bytesPerRow: bytesPerRow, from: MTLRegionMake2D(Int(x * textureScale), Int(y * textureScale), 1, 1), mipmapLevel: 0)
let red: CGFloat = CGFloat(pixel[2]) / 255.0
let green: CGFloat = CGFloat(pixel[1]) / 255.0
let blue: CGFloat = CGFloat(pixel[0]) / 255.0
let alpha: CGFloat = CGFloat(pixel[3]) / 255.0
let color = UIColor(red:red, green: green, blue:blue, alpha:alpha)
return color
}
return nil
}
于 2018-06-12T11:53:46.967 回答
1
这似乎是一个经典案例,试图咨询您的视图(在模型-视图-控制器范式意义上)以获取模型所拥有的信息。直接咨询您的模型。
像 Metal 这样的 3D 渲染技术就是将 3D 信息扁平化为 2D 并有效地丢弃与该 2D 表示无关的信息。在渲染结束时, Metal 和 theMTKView
都没有关于 3D 点的任何信息。
另请注意,您的模型可能没有任意 3D 点的信息。很可能您的所有 3D 模型(在术语的另一个意义上)都是壳。它们没有内部,只有表面。因此,除非 3D 点正好落在表面上,而不是完全不在模型内部或外部,否则它没有颜色。
于 2017-12-07T00:28:02.960 回答