SCNGeometry / SCNCylinder 仅渲染边缘/边框(存储颜色,清除内容)
SCNGeometry / SCNCylinder render edges / border only (Store color, clear content)
我想弄清楚如何在屏幕上显示一个 SCNScylinder,其中只有一个边框/描边/边缘可见。我场景中的一切都工作正常,我正在考虑将清晰的颜色应用于 specular.contents
是否需要使用 SCNNode 委托/金属代码(我没有在我的场景中使用 opengl)
有什么指点吗?感谢帮助
WWDC 2014 演示文稿展示了只有线框的轨道立方体。该技术是使用具有绿色边缘但内部透明的图像作为 material。来自 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 实现类似的效果,您可能需要传递一个 material 数组,一些有边框,一些没有。
编辑
对于 High Sierra/iOS 11 及更高版本,@mnuages 的回答是 simpler/better 方法。
这需要一些努力,但您可以检查圆柱体的 geometryElements
和 geometrySources
来构建一个新的 SCNGeometry
primitiveType
为 SCNGeometryPrimitiveTypeLine
编辑
开始 iOS 11 SCNMaterial
公开 fillMode
属性 可用于将几何图形渲染为线框。
我很欣赏这是一个旧的 post,但我最近不得不实现类似这样的 ARKit 项目。
首先,我在 Adobe Illustrator 中创建了一个方形图像,它有绿色边缘,但中心是透明的。这叫做'outlinedFace'.
然后我创建了一个 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")
}
}
这里的关键是让内容双面。
这对我来说太棒了!
我想弄清楚如何在屏幕上显示一个 SCNScylinder,其中只有一个边框/描边/边缘可见。我场景中的一切都工作正常,我正在考虑将清晰的颜色应用于 specular.contents
是否需要使用 SCNNode 委托/金属代码(我没有在我的场景中使用 opengl)
有什么指点吗?感谢帮助
WWDC 2014 演示文稿展示了只有线框的轨道立方体。该技术是使用具有绿色边缘但内部透明的图像作为 material。来自 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 实现类似的效果,您可能需要传递一个 material 数组,一些有边框,一些没有。
编辑
对于 High Sierra/iOS 11 及更高版本,@mnuages 的回答是 simpler/better 方法。
这需要一些努力,但您可以检查圆柱体的 geometryElements
和 geometrySources
来构建一个新的 SCNGeometry
primitiveType
为 SCNGeometryPrimitiveTypeLine
编辑
开始 iOS 11 SCNMaterial
公开 fillMode
属性 可用于将几何图形渲染为线框。
我很欣赏这是一个旧的 post,但我最近不得不实现类似这样的 ARKit 项目。
首先,我在 Adobe Illustrator 中创建了一个方形图像,它有绿色边缘,但中心是透明的。这叫做'outlinedFace'.
然后我创建了一个 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")
}
}
这里的关键是让内容双面。
这对我来说太棒了!