Изменение точки вращения - PullRequest
0 голосов
/ 27 марта 2012

У меня проблема с моей программой; в настоящее время он вращается вокруг заданной точки и может вращать модели вокруг него. Конечно, это проблема, поскольку я хочу, чтобы это была перспектива от первого лица, и в настоящее время она вращается вокруг точки перед зрителем, а не с точки зрения зрителя. Вот тригонометрические расчеты:

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, я просто не знаю, как их применять; если я добавлю их в моды, это создаст странную петлю-петлю. Если я добавлю их к x1, y1, z1, это не покроет z, не вращающийся с перспективы.

Ответы [ 2 ]

1 голос
/ 27 марта 2012

То, как вы "перемещаете точку вращения" объекта, - это перемещение объекта так, чтобы точка вращения находилась в начале координат; сделать вращение; затем переведите объект обратно. Все это делается в памяти, между кадрами - пользователь на самом деле не видит объект, движущийся к началу координат и обратно.


Кстати, все это значительно проще, если вы понимаете векторы и матричные преобразования - как вы сами видели, без них код может выйти из-под контроля.

Используя векторы / матрицы, весь приведенный выше код можно сократить до нескольких строк.

1 голос
/ 27 марта 2012

Чтобы изменить точку вращения, вам фактически необходимы три преобразования:

  1. Переведите систему координат так, чтобы точка вращения стала началом координат.
  2. Выполните поворот вокруг начала координат
  3. Переведите обратно систему координат обратно.

Это может быть учтено несколькими способами, но это основной принцип: translate-> rotate-> translate.

...