user1181445
user1181445

Reputation:

Changing rotational point

I am having an issue with my program; currently it rotates around a set point, and can rotate models around it. Of course, this is a problem as I want it to be a first-person perspective, and currently, it rotates around a point in front of the viewer, instead of the perspective of the viewer. Here is the trigonometric calculations:

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));
                    }
                }
          }
    }

How would I go about moving the rotational point without actually modifying the xmod, ymod and zmod (these are used for movements like jumping, walking, running, crouching... etc)

I know how to figure out how to get the new x, y and z positions, I just don't know how to apply them; if I add them to the mods, it creates a weird loop-d-loop. If I add them to the x1, y1, z1's it doesn't cover the z not rotating from the perspective.

Upvotes: 0

Views: 151

Answers (2)

The way you "move the rotation point" of an object is by translating the object so that the rotation point is at the origin; do the rotation; then translate the object back. All of this is done in memory, between frames - the user never actually sees the object moving to the origin and back.


By the way, all this stuff is significantly easier if you understand vectors and matrix transformations - as you've seen yourself, without them the code can get out of hand.

Using vectors/matrices, all your code above could be reduced to only a few lines.

Upvotes: 1

Oliver Charlesworth
Oliver Charlesworth

Reputation: 272467

To change the rotation point, you effectively need three transforms:

  1. Translate the coordinate system so that the rotation point becomes the origin.
  2. Perform a rotation around the origin
  3. Translate the coordinate system back again.

This can be factored a number of ways, but that's the basic priniciple: translate->rotate->translate.

Upvotes: 1

Related Questions