【发布时间】:2018-05-20 01:06:44
【问题描述】:
好的,我们在MTKView 中绘制了几个东西,我们可以使用 Metal、MetalKit 函数移动和转动它们,但我们无法获取 3D (x,y,z) 中给定点的像素信息。我们搜索了几个小时,但找不到任何解决方案。
【问题讨论】:
好的,我们在MTKView 中绘制了几个东西,我们可以使用 Metal、MetalKit 函数移动和转动它们,但我们无法获取 3D (x,y,z) 中给定点的像素信息。我们搜索了几个小时,但找不到任何解决方案。
【问题讨论】:
这似乎是一个经典案例,试图咨询您的视图(在模型-视图-控制器范式意义上)以获取模型所拥有的信息。直接咨询您的模型。
像 Metal 这样的 3D 渲染技术就是将 3D 信息扁平化为 2D 并有效地丢弃与该 2D 表示无关的信息。在渲染结束时,Metal 和 MTKView 都没有关于 3D 点的任何信息。
另外请注意,您的模型可能没有任意 3D 点的信息。很可能您的所有 3D 模型(在术语的另一个意义上)都是壳。它们没有内部,只有表面。因此,除非 3D 点正好落在表面上,而不是完全不在模型内部或外部,否则它没有颜色。
【讨论】:
无法从 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
}
【讨论】: