根据下面的图片(我为圆形和平坦的表面使用了不同的颜色,因此可以看到它们,但最终颜色将是相同的),使用Swift和Spritekit,我试图创建一个圆形对象进入的效果浓稠的物质(不一定是粘稠的)并与浓稠的物质分离。基本上,当圆形物体分离时,当它形成一个圆形时,它将从平面上拉开。
我想使用图像动画帧,但是由于对象是带有物理主体的SKSpriteNodes,因此很难确定对象与动画的碰撞时间。另一种方法是使用CAAnimation,但我不知道如何将其与具有物理物体的SKSpriteNodes结合使用。如何使用上述任何一种方法或其他方法来产生这种分离效果?

swift - 如何产生圆形物体进入浓稠物质并与之分离的效果-LMLPHP

更新

下图显示了圆形物体进入厚物质直至被淹没时,厚物质表面的变化。

swift - 如何产生圆形物体进入浓稠物质并与之分离的效果-LMLPHP

最佳答案

您正在寻找流体模拟器

使用现代硬件确实可以做到这一点。
让我们看看我们将在这里构建什么。

swift - 如何产生圆形物体进入浓稠物质并与之分离的效果-LMLPHP

组件

为了实现这一点,我们需要

  • 创建具有物理主体和模糊图像的几个分子
  • 使用着色器为alpha> 0的每个像素应用通用颜色

  • 分子

    这是分子类(class)
    import SpriteKit
    
    class Molecule: SKSpriteNode {
    
        init() {
            let texture = SKTexture(imageNamed: "molecule")
            super.init(texture: texture, color: .clear, size: texture.size())
    
            let physicsBody = SKPhysicsBody(circleOfRadius: 8)
            physicsBody.restitution = 0.2
            physicsBody.affectedByGravity = true
            physicsBody.friction = 0
            physicsBody.linearDamping = 0.01
            physicsBody.angularDamping = 0.01
            physicsBody.density = 0.13
            self.physicsBody = physicsBody
    
        }
    
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    }
    

    着色器

    接下来,我们需要一个片段着色器,让我们创建一个名称为Water.fsh的文件
    void main() {
    
        vec4 current_color = texture2D(u_texture, v_tex_coord);
    
        if (current_color.a > 0) {
            current_color.r = 0.0;
            current_color.g = 0.57;
            current_color.b = 0.95;
            current_color.a = 1.0;
        } else {
            current_color.a = 0.0;
        }
    
        gl_FragColor = current_color;
    }
    

    现场

    最后我们可以定义场景
    import SpriteKit
    
    class GameScene: SKScene {
    
        lazy var label: SKLabelNode = {
            return childNode(withName: "label") as! SKLabelNode
        }()
    
        let effectNode = SKEffectNode()
    
        override func didMove(to view: SKView) {
            physicsBody = SKPhysicsBody(edgeLoopFrom: frame)
            effectNode.shouldEnableEffects = true
            effectNode.shader = SKShader(fileNamed: "Water")
            addChild(effectNode)
        }
    
        var touchLocation: CGPoint?
    
        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            guard let touch = touches.first else { return }
            let touchLocation = touch.location(in: self)
            if label.contains(touchLocation) {
                addRedCircle(location: touchLocation)
            } else {
                self.touchLocation = touchLocation
            }
        }
    
        override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
            touchLocation = nil
        }
    
    
        override func update(_ currentTime: TimeInterval) {
            if let touchLocation = touchLocation {
                let randomizeX = CGFloat(arc4random_uniform(20)) - 10
                let randomizedLocation = CGPoint(x: touchLocation.x + randomizeX, y: touchLocation.y)
                addMolecule(location: randomizedLocation)
            }
        }
    
        private func addMolecule(location: CGPoint) {
            let molecule = Molecule()
            molecule.position = location
            effectNode.addChild(molecule)
        }
    
        private func addRedCircle(location: CGPoint) {
            let texture = SKTexture(imageNamed: "circle")
            let sprite = SKSpriteNode(texture: texture)
            let physicsBody = SKPhysicsBody(circleOfRadius: texture.size().width / 2)
            physicsBody.restitution = 0.2
            physicsBody.affectedByGravity = true
            physicsBody.friction = 0.1
            physicsBody.linearDamping = 0.1
            physicsBody.angularDamping = 0.1
            physicsBody.density = 1
            sprite.physicsBody = physicsBody
            sprite.position = location
            addChild(sprite)
        }
    
    }
    

    关于swift - 如何产生圆形物体进入浓稠物质并与之分离的效果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35405372/

    10-12 05:57