计算锚点的SKSpriteNode的质心

时间:2016-04-09 02:07:00

标签: swift sprite-kit skspritenode centroid anchorpoint

我有一个SKSpriteNode,它是一个等边三角形的图像,我想在三角形的质心上设置它的锚点,这样我就可以让它顺利旋转并保持在中心位置。我用下面的代码计算了质心但是这些位置是相对于场景的,所以我不确定如何将它转换为锚点的准确小数(在0和1之间)。

    let XA = triangle.position.x - (triangle.size.width / 2) // left point
    let XB = triangle.position.x // top point
    let XC = triangle.position.x + (triangle.size.width / 2) // right point

    let YA = triangle.position.y - (triangle.size.height / 2) // left point
    let YB = triangle.position.y + (triangle.size.height / 2) // top point
    let YC = triangle.position.y - (triangle.size.height / 2) // right point

    let triCenterX = (XA + XB + XC) / 3.0
    let triCenterY = (YA + YB + YC) / 3.0

    let centroid = CGPointMake(triCenterX, triCenterY) // 207.0, 412.65

    // triangle.anchorPoint = CGPoint(x: , y: )

我不确定我是否在正确的轨道上或从哪里出发,也许我需要以不同的方式做到这一点?非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,这就是你现在所看到的:

Rotating around default anchor point

黄点代表三角形边界框的质心。透明的白色矩形表示三角形的边界框。黑点是等边三角形的实际质心。那么,现在,三角形的纹理是围绕黄点旋转的?正确?

但你想要这样的东西:

Rotating around modified anchor point

你想将纹理向上移动一点,看起来这个三角形围绕着它的质心旋转了吗?

如果是这样,我通过计算三角形坐标空间中三角形的A,B和C点来做到这一点,如下所示:

let xa = -triangle.size.width / 2.0
let xb = triangle.size.width /  2.0
let xc = CGFloat(0.0)

let ya = -triangle.size.height / 2.0
let yb = -triangle.size.height / 2.0
let yc = triangle.size.height / 2.0

然后,根据计算等边三角形质心的公式,我计算了三角形的质心:

let centroidX = (xa + xb + xc ) / 3.0
let centroidY = (ya + yb + yc) / 3.0     
let centroid = CGPoint(x: centroidX, y: centroidY)

并根据质心位置计算新的锚点:

let anchorX =  centroidX / triangle.size.width
let anchorY = centroidY / triangle.size.height
let anchor = CGPoint(x: anchorX + triangle.anchorPoint.x, y: anchorY + triangle.anchorPoint.y)

这是我用过的图片:

Equilateral triangle