我正在努力实现与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 );
在计算点积时否定转换位置后,它会产生与第一次尝试完全相同的结果。
答案 0 :(得分:2)
我意识到这是一个将近3年的问题,但这个问题让我疯狂了大约一个星期,我终于设法破解了它。这对我有用:
sf::Vector2f vertexPosition = getTransform().transformPoint( m_vertices[n].position );
......虽然看看对我有用的东西以及你的尝试,但老实说我不确定为什么你的方法不成功。我看到的唯一区别是(1)我在我的自定义形状中调用此函数,这应该没有任何区别,并且(2)你正在使用GetShape(),我猜这是一个函数你写了什么来返回本地顶点位置?
无论如何,我希望这可以帮助将来可能会遇到这个问题的人。我上面写的代码片段返回任何自定义形状的顶点的绝对坐标,并应用了任何变换(平移,缩放和旋转)。