计算SKSpriteNode以锚点为中心的质心

3

我有一个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个回答

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接