我对SKNode
方法convertPoint:fromNode:
和convertPoint:ToNode:
的工作方式感到有些困惑,我看过文档,但不是那么明显。例如,这个(见下图)是我使用convertPoint:fromNode:
进行的一项小测试。黑色区域是SKScene
背景,蓝色区域是SKSpriteNode
作为SKScene
的父级,红色区域是蓝色精灵的另一个SKSpriteNode
。两个精灵的锚点由小绿点表示。我想要做的是获取红色精灵的场景位置,我使用以下代码完成:
CGPoint positionInScene = [self convertPoint:[self position]
fromNode:[self redSprite]];
结果是
positionInScene = [105, 205]
这是我所期望的,因为那将是场景空间中红色方块的起源。我很困惑的是争论。根据我的猜测:
[SKNode_A convertPoint: CGPoint_B toNode: SKScene_C]
我最初的尝试是[self convertPoint:[redSprite position] fromNode:redSprite]
,因为我想将红色精灵原点转换为场景。如果有人能投出一点光线,那么看起来有点笨拙。这个和它的朋友convertPoint:toNode:
的逻辑非常值得赞赏。
答案 0 :(得分:49)
这基本上是这样说:将在另一个节点的坐标系中表示的点转换为调用者的( self )坐标系。关键是必须在节点的坐标系中表达该点才能使其工作。如果您使用精灵的位置作为点,则需要将精灵的父节点作为最后一个参数传递。
示例:要获取场景坐标系中红色方块的位置:
CGPoint positionInScene = [self convertPoint:[redSprite position]
fromNode:[self blueSprite]];
blueSprite坐标系中的[5,5] - >场景坐标系中的 [105,205]
您的示例:
CGPoint positionInScene = [self convertPoint:[self position]
fromNode:[self redSprite]];
redSprite坐标系中的[0,0] - >场景坐标系中的 [105,205]
你最终得到了代码中的相同结果,只是因为[self position]是[0,0]并且你使用了redSprite的坐标系。你的初始尝试很接近,你只需要提供redSprite的位置表示的坐标系,这是父精灵的坐标系;在这种情况下,那是blueSprite。
这种方法与第一种方法完全相反。它会将调用者坐标系中的 point 转换为另一个节点的坐标系。这种方法的关键是给定的点必须在调用者的坐标系中表示。
示例:假设您的场景在 [125,225] 处接触过,并且您想要在该位置添加一个新的精灵,该精灵恰好在redSprite的边界框。因此,要添加一个新的精灵作为redSprite的子项,您需要在redSprite的坐标系中获取触摸的位置。为此:
CGPoint positionInRedSprite = [self convertPoint:touchLocation
toNode:[self redSprite]];
场景坐标系中的[125,225] - > redSprite坐标系中的 [20,20]
答案 1 :(得分:0)
为简单起见: 比较节点B到节点A的位置(试图找出彼此之间的距离)
var BInSameCoordinateSys = NodeA.parent!.convertPoint(NodeB.position, fromNode: NodeB.parent!)
通过在位置添加精灵进行故障排除,如果不能帮助可视化位置:
let childToSeeLocation = SKShapeNode(CircleWithRadius:50)
childToSeeLocation.fillColor = UIColor.redColor
ParentofA.addChild(childToSeeLocation)
答案 2 :(得分:0)
我知道这是一个迟到的响应,但通常,我想使用节点的父节点作为节点位置的坐标系。所以,我发现这个扩展非常有用:
extension SCNNode {
func convertPosition(node:SCNNode) -> SCNVector3 {
return self.convertPosition(node.position, fromNode:node.parentNode)
}
}
例如,而不是调用它:
let position = scene.rootNode.convertPosition(node.position, fromNode: node.parentNode)
你打电话给这个:
let position = scene.rootNode.convertPosition(node)