Nano Hash - криптовалюты, майнинг, программирование

SCNNode clone () добавляет больше света в сцену по мере клонирования узлов

Я пытаюсь добавить несколько трехмерных объектов с тенями в свой код ARKit.

Я создаю такой узел

  func loadNodaA()
{

    isObjectCoordinatesAtCentre = false

    let scaleFactor = 0.005

    let dragonScene = SCNScene(named:"art.scnassets/Lowpoly_tree_sample.dae")!

    let queenNode = dragonScene.rootNode.childNode(withName: "Tree_lp_11", recursively: true)

    let geometry : SCNGeometry = (queenNode?.geometry)!

    geometry.materials = [self.CreateMaterialWithName("streakedmetal")];

    nodeA = dragonScene.rootNode
    nodeA.position = SCNVector3Zero
    nodeA.scale = SCNVector3(x: Float(scaleFactor), y: Float(scaleFactor), z: Float(scaleFactor))
    nodeA.position = SCNVector3Make(0,0,0)

}

И как только ARKIT обнаруживает самолет, я создаю такой самолет:

  func createPlaneNode(anchor: ARPlaneAnchor) -> SCNNode {

    let floatwidth = anchor.extent.x
    let floatlength = anchor.extent.z
    let floatPlaneHeight : Float = 0.001

    let planeGeometry = SCNBox(width: CGFloat(floatwidth), height: CGFloat(floatPlaneHeight), length: CGFloat(floatlength), chamferRadius:0)

    planesGeometries[anchor.identifier] = planeGeometry

    let planeNode = SCNNode(geometry: planeGeometry)

    let transparentMaterial : SCNMaterial = SCNMaterial()
    //transparentMaterial.diffuse.contents = UIImage.init(named: "art.scnassets/GridtextureGrayLines.png")

    transparentMaterial.diffuse.contents = UIImage.init(named: "art.scnassets/sunmica.png")

        //planeGeometry.materials = [transparentMaterial, transparentMaterial, transparentMaterial, transparentMaterial,self.CreateMaterialWithName("redbricks"), transparentMaterial];
    //planeGeometry.materials = [transparentMaterial]

    planeGeometry.firstMaterial = transparentMaterial

    transparentMaterial.diffuse.contentsTransform = SCNMatrix4MakeScale(2,2, 0)

    planeNode.geometry?.firstMaterial?.diffuse.wrapS = .repeat
    planeNode.geometry?.firstMaterial?.diffuse.wrapT = .repeat
    planeNode.position = SCNVector3Make(0, -(floatPlaneHeight/2), 0)

    planeNode.physicsBody = SCNPhysicsBody(type: .kinematic, shape: SCNPhysicsShape(geometry: planeGeometry, options: nil))

    //planeNode.castsShadow = true


    self.setTextureScale(plane: planeNode, planeGeometry: planeGeometry)

    return planeNode

}

И при касании плоскости я добавляю к ней объекты дерева с тенями. Но проблема в том, что когда я клонирую эти объекты снова и снова, плоскость под деревьями становится более яркой, я думаю, что добавляемый мной узел света продолжает добавлять для каждого узла, хотя я пытаюсь удалить его по имени.

func insertGeometry(_ anchor : ARHitTestResult ) {



    let h = CGFloat(selectedNode.boundingBox.max.y - selectedNode.boundingBox.min.y)



    var insertionYOffset: Float = Float(h)/2.0;

    if isObjectCoordinatesAtCentre == false
    {
        insertionYOffset = 0
    }



    let hitPointPosition = SCNVector3Make(
        anchor.worldTransform.columns.3.x,
        anchor.worldTransform.columns.3.y + insertionYOffset,
        anchor.worldTransform.columns.3.z
    );

    var nodeClone = SCNNode.init()

    if CurrentNodeChoise == 1
    {
        //This means draw tree
        nodeClone = nodeA.clone()
    }

    nodeClone.position = hitPointPosition
    sceneView.scene.rootNode.addChildNode(nodeClone)



    guard let spotlightNode : SCNNode = (sceneView.scene.rootNode.childNode(withName: "LightForShadows", recursively: true)) else {


        let spot = SCNLight()
        spot.type = .spot
        spot.castsShadow = true
        spot.color = UIColor.darkGray
        spot.shadowMode = .forward
        spot.intensity = 2000
        spot.shadowRadius = 5;
        spot.shadowSampleCount = 20;
        spot.shadowMapSize = CGSize(width: 4000, height: 4000)
        spot.orthographicScale=50;
        spot.zNear=1;
        spot.zFar=1000;
        spot.name = "myLight"
        let spotNode = SCNNode()
        spotNode.light = spot
        spotNode.position = SCNVector3(x:4, y: 6, z: 0)            
        let lookAt = SCNLookAtConstraint.init(target: nodeClone)
        constraintsArray.append(lookAt)
        spotNode.constraints = constraintsArray            
        spotNode.name = "LightForShadows"        
        sceneView.scene.rootNode.addChildNode(spotNode)

        return
    }

    let lookAt = SCNLookAtConstraint.init(target: nodeClone)

    constraintsArray.append(lookAt)

    spotlightNode.constraints = constraintsArray
}

Я также попытался добавить свет только к первому узлу, а затем к остальным узлам, просто обновив первый световой узел. Но это тоже не работает. Я хочу, чтобы деревья добавлялись тенями, а плоскость под ними оставалась такой же. Также тени не идеальны, есть ли способ их улучшить?

Смотрите скриншоты, как меняется плоскость под деревьями при добавлении деревьев по одному.

Первое изображение

Второе изображение

Третье изображение


Ответы:


1

К каждому добавляемому дереву вы добавляете свет, который, конечно же, делает ваш самолет ярче.

Придерживайтесь одного источника света, который вы создаете в настройке сцены, и просто обновите его ограничение, чтобы оно указывало на плоскость. Когда вы добавляете другие узлы, вам не нужно ничего делать с молнией. Когда в вашей сцене есть свет, создающий тени, это повлияет на каждый добавляемый вами узел.

Чтобы ваши тени «выглядели лучше» - что бы это ни значило - вам нужно поиграть с различными режимами освещения и параметрами освещения. Я бы рекомендовал создать сцену в редакторе Xcode и поэкспериментировать со свойствами.

21.07.2017
  • Большое вам спасибо, я добавил световой узел в свой плоский узел, и теперь он работает. 24.07.2017
  • Еще один вопрос: если я использую прозрачную сетку, состоящую только из линий, я не вижу теней. Как вы можете видеть на первом изображении с коричневой плоскостью, тени видны, но когда я переключаюсь с прозрачной сеткой, тени становятся невидимыми. 24.07.2017
  • Если вы сделаете плоскость практически невидимой, SceneKit не на чем сможет визуализировать тени. Ознакомьтесь с SceneKit: что нового на WWDC 17, чтобы узнать обходной путь. 24.07.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..