3

我正在使用 SFML 实现分离轴定理碰撞,但我的顶点数组遇到了问题。它们正在被变换(包含顶点数组的类继承 sf::Transformable),但顶点坐标不接收变换(即旋转),因此如果对象不在其原始方向,则碰撞不起作用。在计算顶点数组的 SAT 碰撞之前,我尝试使用类似这样的方法创建一个新的顶点数组

    length = sqrt( shape1.getShape()[i].position.x*shape1.getShape()[i].position.x + shape1.getShape()[i].position.y*shape1.getShape()[i].position.y );
    newshape1[i].position.x = length*cos( shape1.getRotation()*(PI/180) );
    newshape1[i].position.y = length*sin( shape1.getRotation()*(PI/180) );

对于正在测试的两个形状。但是,这似乎不起作用。我的函数返回发生了碰撞,即使没有发生碰撞。我不确定数学是否有错误,但如果没有将 SFML 转换应用于对象,它可以完美运行。那么,我还应该做些什么,或者是否有另一种方法可以通过应用转换(几乎只是旋转)来收集 VertexArray 信息?

编辑:我在这里找到了一些信息:http: //sfml-dev.org/documentation/2.0/classsf_1_1Transform.php#details 但我在理解如何将其应用于我的 VertexArrays 时遇到了一些麻烦。看起来我应该getTransform()在我的班级内部做一些事情,并将其与班级的 VertexArray 结合起来。

编辑:使用上面的信息,我尝试在 SAT 计算之前在 VertexArray 的每个顶点上使用此方法:

    newshape1[i].position = shape1.getTransform().transformPoint( shape1.getShape()[i].position );

在计算点积时否定变换位置后,它产生与第一次尝试完全相同的结果。

4

1 回答 1

2

我意识到这是一个将近 3 年的问题,但是这个问题已经让我发疯了大约一个星期,我终于设法破解了它。这对我有用:

sf::Vector2f vertexPosition = getTransform().transformPoint( m_vertices[n].position );

...尽管看看对我有用的方法和您尝试的方法,但老实说,我不确定您的方法为什么不成功。我看到的唯一区别是(1)我从我的自定义形状中调用这个函数,这不应该有任何区别,以及(2)你正在使用 GetShape(),我猜这是一个函数你写返回本地顶点位置?

无论如何,我希望这对将来可能会遇到这个问题的人有所帮助。我上面写的代码片段返回来自任何自定义形状的顶点的绝对坐标,并应用了任何变换(平移、缩放和旋转)。

于 2016-05-24T23:35:04.717 回答