2016-03-07 2 views
4

Я пытаюсь выяснить, как иметь SCNScylinder на sceen с видимыми границами/штрихом/краем. Все в моей сцене работает отлично, и я думал, просто применяя ясный цвет, чтобы specular.contentsSCNGeometry/SCNCylinder визуализировать только края/границы (сохранить цвет, очистить содержимое)

является использование SCNNode делегат/Metal код, необходимый (я не использую OpenGL на моей сцене)

Любые указатели? help

ответ

3

Презентация 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 ​​является более простым/лучшим подходом.

+0

Спасибо Хэл, кажется, именно то, что мне нужно –

4

это требует некоторых усилий, но вы могли бы осмотреть ваш цилиндра geometryElements и geometrySources построить новый SCNGeometry с primitiveType из SCNGeometryPrimitiveTypeLine

Edit

Начиная IOS 11 SCNMaterial выставляет fillMode свойство, которое может быть использовано для создания геометрии в виде каркаса.

+0

Как мне это сделать? Искал достаточно, но не получил никакого ресурса. :( – iPeter

+0

Теперь вы можете использовать свойство 'fillMode'' SCNMaterial'. – mnuages

+0

Поскольку я совершенно не знаком с этим полем, вы можете помочь мне с небольшим количеством кода? – iPeter

0

Я ценю, что это старый пост, но мне недавно пришлось реализовать что-то подобное проекту 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") 
    } 

} 

Ключ здесь делает содержание удвоенную односторонними.

Это прекрасно работает для меня!

Смежные вопросы