Как сделать плоские затененные полигоны/геометрию в SceneKit, т.е. не гладкую

Я пытаюсь сделать свою геометрию плоской, а не гладкой в ​​SceneKit. Как вы можете видеть на изображениях, зеленая сфера имеет плавное затенение по умолчанию в SceneKit. То, что я хочу, это плоский «вид» на другом изображении, где написано «плоский».

SCNSphere SmoothVSFlat Я не вижу в SceneKit никаких вариантов, как отключить эту функцию? Это код с моей игровой площадки:

import Cocoa
import SceneKit
import QuartzCore
import XCPlayground

var sceneView = SCNView(frame:CGRect(x:0, y:0, width:300, height:300))
var scene = SCNScene()
sceneView.backgroundColor = NSColor.darkGrayColor()
sceneView.scene = scene
sceneView.autoenablesDefaultLighting = true
XCPlaygroundPage.currentPage.liveView = sceneView

let g = SCNSphere(radius:1)
g.firstMaterial?.diffuse.contents = NSColor.greenColor()
g.firstMaterial?.litPerPixel = false
g.segmentCount = 5
let node = SCNNode(geometry:g)
node.position = SCNVector3(x:0, y:0, z:0)
scene.rootNode.addChildNode(node)

var spin = CABasicAnimation(keyPath:"rotation")
spin.toValue = NSValue(SCNVector4:SCNVector4(x:1, y:1, z:0, w:CGFloat(2.0*M_PI)))
spin.duration = 3
spin.repeatCount = HUGE
node.addAnimation(spin, forKey:"spin")

person StackUnderflow    schedule 11.01.2016    source источник
comment
Цвет интерполируется между векторами нормалей, заданными в вершинах. Согласно документации для SCNMaterial.lightingModelName, 3 варианта интерполируются, а 1 использует только окружающий свет. Я не думаю, что вы сможете получить квадратные грани из SCNSphere, которая использует триангулированную прямоугольную сетку (или геодезическую), поэтому вы также можете заняться SCNGeometrySource или бизнесом ввода-вывода модели. . Если вы пойдете по этому пути, вы можете продублировать вершины и указать нормали для каждой грани, а не для каждой вершины. Я надеюсь, что есть более простой способ, который я пропускаю.   -  person Hal Mueller    schedule 12.01.2016
comment
Ох! Это выглядит полезным, если вам нужно построить свою собственную геометрию: github.prideout.net/shapes   -  person Hal Mueller    schedule 12.01.2016
comment
В редакторе сцен есть параметр, который я иногда случайно нажимаю, который дает полигоны с резкими краями. Извините, я не помню, было ли это в материалах или как-то связано с объектом.   -  person Confused    schedule 14.01.2016
comment
На самом деле я решил это в 3D-приложении, настроив нормали, а затем экспортируя/импортируя в SceneKit.   -  person StackUnderflow    schedule 27.03.2018


Ответы (1)


Кажется, Apple применит для вас обычное сглаживание. Это более заметно, когда SceneKit сталкивается с плоской сеткой. Удалите сглаженные нормали из сетки, чтобы она выглядела низкополигональной.

Если вы используете ModelI/O для загрузки 3D-актива. (Для теста я создаю MDLMesh форму SCNGeometry)

SCNGeometry* flatGeoUsingModelIO(SCNGeometry *geo){
    MDLMesh *mesh = [MDLMesh meshWithSCNGeometry:geo];
    MDLMesh *newMesh = [MDLMesh newSubdividedMesh:mesh submeshIndex:0 subdivisionLevels:0];
    [newMesh removeAttributeNamed:@"normals"];
    //Replace current vertex normals with a non-smooth one. Same result with above line
    //[newMesh addNormalsWithAttributeNamed:@"normals" creaseThreshold:1];
    SCNGeometry *flatGeo = [SCNGeometry geometryWithMDLMesh:newMesh];
    return flatGeo;
}

Или вы более знакомы со SceneKit.

SCNGeometry* flatGeoUsingScnKit(SCNGeometry *geo){
    NSArray<SCNGeometrySource*> *SourceArr = geo.geometrySources;
    NSMutableArray<SCNGeometrySource*> *newSourceArr = [NSMutableArray new];
    for (SCNGeometrySource *source in SourceArr) {
        if (source.semantic != SCNGeometrySourceSemanticNormal) {
            [newSourceArr addObject:source];
        }
    }
    SCNGeometry *flatGeo = [SCNGeometry geometryWithSources:newSourceArr elements:geo.geometryElements];
    return flatGeo;
}

Это низкий полигон SCNSphere, созданный из правого.

введите здесь описание изображения

person ooOlly    schedule 27.03.2018
comment
Выполняет ли MDLmesh автоматическую триангуляцию? Документов на него не нашел. Что у нас в вершинном буфере, треугольник или полигон? - person iaomw; 10.08.2020