在SFML中获取绝对顶点坐标?

时间:2013-07-02 03:09:07

标签: c++ sfml

我正在努力实现与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 );

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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