【问题标题】:Get absolute vertex coordinate in SFML?在 SFML 中获取绝对顶点坐标?
【发布时间】:2013-06-29 07:15:13
【问题描述】:

我正在使用 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 );

在计算点积时对变换位置求反后,得到的结果与第一次尝试完全相同。

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-01-27
      • 2021-06-13
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 2012-01-18
      • 1970-01-01
      相关资源
      最近更新 更多