I have an SKVideoNode as a child of an SKEffectNode which enables me to skew the video using a 1 row x 1 column SKWarpGeometryGrid.

As you drag your finger in each quadrant, new corner coordinates are calculated in touchMoved(toPoint fingerPos: CGPoint) and the SKWarpGeometryGrid is then updated in updateGrid()

I also have a blue square centred on the SKView (and therefore on the video’s initial centre). I would like the blue square to follow the videoNode’s centre as the effectNode warps.
I do not want the square added as a child to the effectNode as the square would get warped as well.

I’ve tried various parameter permutations of convert(*:to:) & convert(*:from:) 

e.g.

```
blueSquare?.position = self.convert(effectNode!.position, to: self)

```

… but the blue square never moves. Any thoughts?

[![](https://i.stack.imgur.com/9eUIL.gif)](https://i.stack.imgur.com/9eUIL.gif)

code: (replace myFriend.mp4 with a video file to test)

```
import SpriteKit
import GameplayKit

class GameScene: SKScene {

let warpGeometryGrid1Col = SKWarpGeometryGrid(columns: 1,rows: 1)

var warpGridPositions: [float2] = [
float2(0.0, 0.0),  float2(1.0, 0.0),
float2(0.0, 1.0),  float2(1.0, 1.0)]
var adjust: Float = 0.005
var previousPosX: CGFloat = 0
var previousPosY: CGFloat = 0
var topLeftX:Float = 0.0
var topLeftY:Float = 1.0
var topRightX:Float = 1.0
var topRightY:Float = 1.0
var bottomLeftX:Float = 0.0
var bottomLeftY:Float = 0.0
var bottomRightX:Float = 1.0
var bottomRightY:Float = 0.0

var blueSquare:SKSpriteNode?
var effectNode: SKEffectNode?

override func didMove(to view: SKView) {

// **** add a video file to the project
  let videoNode = SKVideoNode.init(fileNamed: "myFriend.mp4")
videoNode.size.width = self.frame.size.height/3*1.5
videoNode.size.height = self.frame.size.width/3*1.5
videoNode.play()

effectNode = SKEffectNode()
effectNode!.addChild(videoNode)
self.addChild(effectNode!)

blueSquare = SKSpriteNode.init(color: .blue, size: CGSize(width: 50, height: 50))
self.addChild(blueSquare!)
}

func updateGrid(){
warpGridPositions = [float2(bottomLeftX, bottomLeftY), float2(bottomRightX, bottomRightY),
                     float2(topLeftX, topLeftY), float2(topRightX, topRightY)]
effectNode!.warpGeometry = warpGeometryGrid1Col.replacingByDestinationPositions(positions: warpGridPositions)

//*********************************
//*********************************
// TRY TO ADJUST POSITION OF blueSquare AS EFFECT 
// NODE IS WARPED KEEPING IT CENTERED ON THE 
// EFFECT NODE'S CHILD VIDEO
blueSquare?.position = self.convert(effectNode!.position, to: self)
//*********************************
//*********************************
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for t in touches { self.touchMoved(toPoint: t.location(in: self)) }
}

func touchMoved(toPoint fingerPos : CGPoint) {
if fingerPos.y < 0{
  if fingerPos.x > 0{// bottom right
    if fingerPos.x > previousPosX {
      bottomRightX += adjust
    }
    if fingerPos.x < previousPosX {
      bottomRightX -= adjust
    }
    if fingerPos.y > previousPosY {
      bottomRightY += adjust
    }
    if fingerPos.y < previousPosY {
      bottomRightY -= adjust
    }
  }
  else{ // bottom left
    if fingerPos.x > previousPosX {
      bottomLeftX += adjust
    }
    if fingerPos.x < previousPosX {
      bottomLeftX -= adjust
    }
    if fingerPos.y > previousPosY {
      bottomLeftY += adjust
    }
    if fingerPos.y < previousPosY {
      bottomLeftY -= adjust
    }
  }
} else{
  // top right
  if fingerPos.x > 0{
    if fingerPos.x > previousPosX {
      topRightX += adjust
    }
    if fingerPos.x < previousPosX {
      topRightX -= adjust
    }
    if fingerPos.y > previousPosY {
      topRightY += adjust
    }
    if fingerPos.y < previousPosY {
      topRightY -= adjust
    }
  }
  else{ // top left
    if fingerPos.x > previousPosX {
      topLeftX += adjust
    }
    if fingerPos.x < previousPosX {
      topLeftX -= adjust
    }
    if fingerPos.y > previousPosY {
      topLeftY += adjust
    }
    if fingerPos.y < previousPosY {
      topLeftY -= adjust
    }
  }
}

updateGrid()
previousPosX = fingerPos.x
previousPosY = fingerPos.y
}

}

```