【问题标题】:Rotating Coordinates (Java and Geometry)旋转坐标(Java 和几何)
【发布时间】:2018-12-15 01:18:41
【问题描述】:

我正在开发一个使用 AWT 画布作为基础的 2D Java 游戏引擎。这个游戏引擎的一部分是它需要有碰撞的碰撞箱。不仅是内置矩形(已经尝试过该系统),而且我需要自己的 Hitbox 类,因为我需要更多功能。所以我做了一个,支持圆形和 4 边多边形的碰撞箱。 hitbox 类的设置方式是它使用四个坐标点作为连接形成矩形的 4 个角顶点。绘制连接点的线,这些线用于检测与其他命中框的交点。但我现在有一个问题:轮换。

box hitbox 有两种可能,它可以是四个坐标点,也可以是附加到游戏对象的 4 个坐标点。不同之处在于前者只是基于 0,0 作为序号的 4 个坐标,而附加到游戏对象的坐标中存储偏移量而不是原始位置数据,因此 (-100,-100) 例如表示主机的位置游戏对象,但向左 100 像素,向上 100 像素。

在网上我找到了一个关于原点旋转的公式。由于基于 Gameobject 的碰撞箱以特定点为中心,我认为这将是尝试它的最佳选择。此代码运行每个刻度以更新玩家角色的命中框

            //creates a rectangle hitbox around this gameobject 
        int width = getWidth();
        int height = getHeight();
        Coordinate[] verts = new Coordinate[4]; //corners of hitbox. topLeft, topRight, bottomLeft, bottomRight
        verts[0] = new Coordinate(-width / 2, -height / 2);
        verts[1] = new Coordinate(width / 2, -height / 2);
        verts[2] = new Coordinate(-width / 2, height / 2);
        verts[3] = new Coordinate(width / 2, height / 2);
        //now go through each coordinate and adjust it for rotation
        for(Coordinate c : verts){
            if(!name.startsWith("Player"))return; //this is here so only the player character is tested
            double theta = Math.toRadians(rotation);
            c.x = (int)(c.x*Math.cos(theta)-c.y*Math.sin(theta));
            c.y = (int)(c.x*Math.sin(theta)+c.y*Math.cos(theta));
        }
        getHitbox().vertices = verts;

我为糟糕的视频质量道歉,但这就是上面的结果:https://www.youtube.com/watch?v=dF5k-Yb4hvE

所有相关类都在这里:https://github.com/joey101937/2DTemplate/tree/master/src/Framework

edit:所需的效果是框轮廓跟随字符在一个圆圈中,同时保持纵横比,如下所示:https://www.youtube.com/watch?v=HlvXQrfazhA。当前系统使用上面的代码,其效果可以在之前的视频链接中看到。 我应该如何修改四个 2D 坐标以在围绕一个点旋转的整个过程中保持相对纵横比?

目前的轮换系统如下:

  • x = x*Cos(theta) - y *Sin(theta)
  • y = x*Sin(theta) + y *Cos(theta)

其中theta是raidians的旋转度数

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,edit 添加minimal reproducible exampleShort, Self Contained, Correct Example。 2) 你已经描述了一个需求或规范,但没有提出任何问题。你有什么问题?
  • 你会惊讶于你可以用内置的 API 做些什么,for example
  • @AndrewThompson 我的问题是如何修改坐标位置以在旋转期间保持角色周围的适当矩形@MadProgrammer 谢谢,我会调查一下
  • "hwo 修改坐标位置以在旋转期间保持字符周围的适当矩形" 所以敲一个 '?'在它的结尾和edit 它进入问题。您尝试的 MCVE 在哪里?顺便说一句 - 每条评论只能通知一个人,因此@MadProgrammer 不会收到该评论的通知。
  • @AndrewThompson 我已在问题正文中添加了说明。提前为视频质量差的问题道歉。

标签: java geometry awt trigonometry


【解决方案1】:

你犯了典型的错误:

    c.x = (int)(c.x*Math.cos(theta)-c.y*Math.sin(theta));
    c.y = (int)(c.x*Math.sin(theta)+c.y*Math.cos(theta));

在第二行中,您使用 modifiedc.x。只要记住tempx = c.x 在计算之前使用它。

    tempx = c.x;
    c.x = (int)(tempx*Math.cos(theta)-c.y*Math.sin(theta));
    c.y = (int)(tempx*Math.sin(theta)+c.y*Math.cos(theta));

另一个问题:每次旋转后舍入坐标会导致一些旋转后扭曲和缩小。将坐标存储在浮点数中并将它们四舍五入仅用于输出是明智的,或者记住起始值并通过累积角度对其应用旋转。

【讨论】:

    猜你喜欢
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    相关资源
    最近更新 更多