SKShapeNode растягивание по размеру, а не обрезка при использовании fillTexture - PullRequest
0 голосов
/ 07 мая 2020

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

class ViewController: UIViewController, SkSceneDelegate {

    var scnView: SCNView!
    var scnScene: SCNScene!
    var sphere: SCNSphere!
    var mainskScene: SKScene!

    override func viewDidLoad() {
        super.viewDidLoad()

        setUpInitialScene()
    }


    func setUpInitialScene() {

        scnScene = SCNScene()

        sphere = SCNSphere(radius: 1)
        sphere.geometry!.firstmaterial!.diffuse.contents = UIImage(named: "blankImage")

        scnScene.rootNode.addChildNode(sphere)
        sphere.geometry!.firstmaterial!.lightingModel = SCNMaterial.LightingModel.constant
        let currentImage = sphere.geometry!.firstmaterial!.diffuse.contents as! UIImage
        mainskScene = SKScene(size: currentImage.size)
        sphere.geometry!.firstMaterial!.diffuse.contents = mainskScene
        sphere.geometry!.firstMaterial!.diffuse.contentsTransform = SCNMatrix4Translate(SCNMatrix4MakeScale(1, -1, 1), 0, 1, 0)


         let background = SKSpriteNode(texture: SKTexture(image: currentImage))
         background.position = CGPoint(x: mainskScene.frame.midX, y: mainskScene.frame.midY)
         mainskScene.addChild(background)

         scnView = self.view as? SCNView
         scnView.scene = scnScene


         let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapped))
         tapGesture.delegate = self
         tapGesture.numberOfTapsRequired = 1
         self.scnView.addGestureRecognizer(tapGesture)
     }

    @objc func tapped(tap: UITapGestureRecognizer) {

        let results = scnView.hitTest(tap.location(in: scnView), options: [SCNHitTestOption.firstFoundOnly: true]) as [SCNHitTestResult]

        if let result = results.first {
            if result.node === sphere {
                let channel = sphere.geometry!.firstMaterial!.diffuse.mappingChannel
                let texcoord = result.textureCoordinates(withMappingChannel: channel)

                let path = UIBezierPath() //Path is not the problem so  I felt like didn't need to include points
                let shapesprite = SKShapeNode(path: path.cgPath)
                let image = UIImage(imageNamed: "steve")
                shapesprite.fillTexture = SKTexture(image: image!)
                shapesprite.strokeColor = UIColor.green
                shapesprite.lineWidth = 1
                shapesprite.fillColor = SKColor.white
                shapesprite.position.x = texcoord.x
                shapesprite.position.y = texcoord.y
                mainskScene.addChild(shapesprite)
            }
        }
    }
...