SCNGeometry / SCNCylinder仅渲染边缘/边框(存储颜色,内容清晰)

时间:2016-03-07 16:18:14

标签: ios opengl-es render scenekit metal

我试图找出如何在只有边框/笔触/边缘可见的情况下使用SCNScylinder。我场景中的所有东西都工作得很好,我正在考虑将一种清晰的颜色应用于specular.contents

是需要使用SCNNode委托/金属代码(我不在我的场景中使用opengl)

任何指针?感谢帮助

3 个答案:

答案 0 :(得分:5)

需要付出一些努力,但您可以检查您的广告系列geometryElementsgeometrySources以构建SCNGeometry primitiveType SCNGeometryPrimitiveTypeLine的新SCNMaterial

修改

启动iOS 11 - (void) applicationDidFinishLaunching:(UIApplication*)application会公开fillMode属性,该属性可用于将几何体渲染为线框。

答案 1 :(得分:4)

WWDC 2014演示文稿显示了仅有线框的轨道立方体。该技术是使用具有绿色边缘但透明内部的图像作为材料。来自AAPLSlideScenegraphSummary.m:

        // A node that will help visualize the position of the stars
        _wireframeBoxNode = [SCNNode node];
        _wireframeBoxNode.rotation = SCNVector4Make(0, 1, 0, M_PI_4);
        _wireframeBoxNode.geometry = [SCNBox boxWithWidth:1 height:1 length:1 chamferRadius:0];
        _wireframeBoxNode.geometry.firstMaterial.diffuse.contents = [NSImage imageNamed:@"box_wireframe"];
        _wireframeBoxNode.geometry.firstMaterial.lightingModelName = SCNLightingModelConstant; // no lighting
        _wireframeBoxNode.geometry.firstMaterial.doubleSided = YES; // double sided

enter image description here

对于与SCNCylinder类似的效果,您可能需要传递一组材质,一些具有边框,一些没有。

修改

对于High Sierra / iOS 11及更高版本,@mnuages的答案是一种更简单/更好的方法。

答案 2 :(得分:1)

我很欣赏这是一篇很老的帖子,但我最近不得不实施像这样的ARKit项目。

首先,我在Adobe Illustrator中创建了一个方形图像,它有绿色边缘,但是有一个透明的中心。这被称为'outlineFace'。

然后我按如下方式创建了一个SCNNode(Swift 4):

import UIKit
import ARKit

class CubeNode: SCNNode {

private var faceArray = [SCNMaterial]()
private let FACE_OUTLINE = "outlinedFace"

/// Initialization With Outline Only
///
/// - Parameters:
///   - width: Optional CGFloat (Defaults To 20cm)
///   - height: Optional CGFloat (Defaults To 20cm)
///   - length: Optional CGFloat (Defaults To 20cm)
///   - colours: [UIColor] - [Front, Right , Back , Left, Top , Bottom]
init(width: CGFloat = 0.2, height: CGFloat = 0.2, length: CGFloat = 0.2) {

    super.init()

    self.geometry = SCNBox(width: width, height: height, length: length, chamferRadius: 0)

        for _ in 0 ..< 6{
            let face = SCNMaterial()
            face.diffuse.contents = UIImage(named: FACE_OUTLINE)
            face.isDoubleSided = true
            face.lightingModel = .constant
            faceArray.append(face)
        }

    self.geometry?.materials = faceArray
    self.rotation = SCNVector4Make(0, 1, 0, .pi / 4)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

}

这里的关键是使内容加倍。

这对我来说非常有用!