改变旋转点

时间:2012-03-27 15:59:19

标签: java math graphics trigonometry perspective

我的节目有问题;目前它围绕一个设定点旋转,并可以围绕它旋转模型。当然,这是一个问题,因为我希望它是第一人称视角,而且目前,它围绕观众前方的一个点旋转,而不是观察者的视角。这是三角函数计算:

protected void drawWireframe(Graphics g) {
            double theta = Math.PI * -azimuth / 180.0D;
            double phi = Math.PI * elevation / 180.0D;
            float cosT = (float) Math.cos(theta);
            float sinT = (float) Math.sin(theta);
            float cosP = (float) Math.cos(phi);
            float sinP = (float) Math.sin(phi);
            float cosTcosP = cosT * cosP;
            float cosTsinP = cosT * sinP;
            float sinTcosP = sinT * cosP;
            float sinTsinP = sinT * sinP;
            float near = 6.0F;
            g.setColor(Color.black);
            g.fillRect(0, 0, getWidth(), getHeight());
            for (int i = 0; i < tiles.size(); i++) {
                Point[] points = new Point[vertices.length];
                for (int j = 0; j < points.length; j++) {
                    float x0 = -(tiles.get(i).getX() + xmod + vertices[j]
                            .getX());
                    float y0 = (tiles.get(i).getY() + ymod + vertices[j].getY());
                    float z0 = -(tiles.get(i).getZ() + zmod + vertices[j]
                            .getZ());

                    float x1 = cosT * x0 + sinT * z0;
                    float y1 = -sinTsinP * x0 + cosP * y0 + cosTsinP * z0;
                    float z1 = cosTcosP * z0 - sinTcosP * x0 - sinP * y0;

                    if (z1 + near > 0) {
                        x1 = x1 * near / (z1 + near);
                        y1 = y1 * near / (z1 + near);
                        points[j] = new Point((int) (Math.max(getWidth(),
                                getHeight()) / 2 - (Math.max(getWidth(),
                                getHeight()) / near) * x1), (int) (Math.max(
                                getWidth(), getHeight()) / 2 - (Math.max(
                                getWidth(), getHeight()) / near) * y1));
                    }
                }
          }
    }

如何在不实际修改xmod,ymod和zmod的情况下移动旋转点(这些用于跳跃,行走,跑步,蹲伏等动作)

我知道如何弄清楚如何获得新的x,y和z位置,我只是不知道如何应用它们;如果我将它们添加到mods,它会创建一个奇怪的loop-d-loop。如果我将它们添加到x1,y1,z1,它不会覆盖从视角不旋转的z。

2 个答案:

答案 0 :(得分:1)

要更改旋转点,您实际上需要三个变换:

  1. 平移坐标系,使旋转点成为原点。
  2. 围绕原点执行旋转
  3. 再次翻译坐标系。
  4. 这可以通过多种方式考虑,但这是基本的原则:translate-&gt; rotate-&gt; translate。

答案 1 :(得分:1)

“移动对象的旋转点”的方式是翻译对象,使旋转点位于原点;轮换;然后将对象翻译回来。所有这些都是在内存中,在帧之间完成的 - 用户实际上从未看到移动到原点和后面的对象。


顺便说一句,如果你了解vectorsmatrix transformations,那么所有这些内容都会变得非常容易 - 就像你自己看到的那样,没有它们,代码就会失控。

使用矢量/矩阵,上面的所有代码都可以减少到几行。