1

好的,我们已经在 a 中绘制了几个东西MTKView我们可以使用 Metal、MetalKit 函数移动和转动它们,但是我们无法获得 3D (x,y,z) 中给定点的像素信息。我们搜索了几个小时,但找不到任何解决方案。

4

2 回答 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 回答