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

Posted

技术标签:

【中文标题】SCNGeometry / SCNCylinder 仅渲染边缘/边框(存储颜色,清除内容)【英文标题】:SCNGeometry / SCNCylinder render edges / border only (Store color, clear content) 【发布时间】:2016-06-21 07:05:06 【问题描述】:

我正在尝试弄清楚如何在屏幕上显示一个 SCNS 圆柱体,并且只显示一个边框/描边/边缘。我的场景中的一切都工作正常,我正在考虑将清晰的颜色应用于 specular.contents

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

任何指针?感谢您的帮助

【问题讨论】:

【参考方案1】:

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

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

编辑

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

【讨论】:

谢谢哈尔,似乎正是我所需要的【参考方案2】:

这需要一些努力,但您可以检查您的圆柱体的 geometryElementsgeometrySources 以构建一个新的 SCNGeometryprimitiveTypeSCNGeometryPrimitiveTypeLine

编辑

从 iOS 11 开始 SCNMaterial 会公开 fillMode 属性,该属性可用于将几何图形渲染为线框。

【讨论】:

我该怎么做?搜索足够但无法获得任何资源。 :( 您现在可以使用SCNMaterialfillMode 属性轻松实现这一目标。 由于我是这个领域的新手,你能帮我写一些代码吗?【参考方案3】:

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

首先,我在 Adob​​e Illustrator 中创建了一个方形图像,它有绿色边缘,但中心是透明的。这称为“轮廓面”。

然后我创建了一个 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")
  


这里的关键是让内容双面。

这对我来说非常有用!

【讨论】:

以上是关于SCNGeometry / SCNCylinder 仅渲染边缘/边框(存储颜色,清除内容)的主要内容,如果未能解决你的问题,请参考以下文章

在 SceneKit 中镜像 SCNGeometry

iOS开发之SceneKit框架--SCNGeometry.h

为啥自定义 SCNGeometry 中的黑色比 SCNSphere 中的浅

SCNGeometry 与多边形作为primitiveType

SceneKit:使用 dae 动画更新 SCNGeometry

从 SceneKit 中的 SCNGeometry 中提取人脸信息