Попытка создать вращающийся винт. Продолжает вращаться вокруг происхождения, а не себя - PullRequest
2 голосов
/ 29 октября 2010

Я пытаюсь создать пропеллер вращающегося самолета в Java 3D.На данный момент он вращается вокруг начала координат.Однако мне нужно, чтобы он вращался вокруг себя.Я не делал много 3D-графики в Java, поэтому я в значительной степени озадачен.PS: я пытался перевести его на источник до и после, но, похоже, он ничего не делал

Ответы [ 2 ]

2 голосов
/ 29 октября 2010

Не зная Java достаточно, чтобы дать полный ответ;правильное решение с точки зрения математики, как вы подозреваете: перевести центр объекта в начало координат, поверните, а затем переведите его обратно в исходное положение.

Однако вполне вероятно (то есть, я предполагаю), что когдаВы комбинируете преобразования, они умножаются после, чтобы дать эффект, который преобразования происходят в пространстве модели.То, что вы, вероятно, хотите, это предварительное умножение, чтобы дать эффект, что преобразования происходят в мировом пространстве.

Рассмотрим паруса ветряной мельницы.В коде вы хотели бы иметь возможность перевести на вершину ветряной мельницы, а затем вызвать процедуру, которая рисует паруса.Эта процедура может применить вращение, а затем нарисовать.Но с точки зрения трансформаций, вы на самом деле хотите вращать паруса, находясь в начале координат, чтобы они вращались вокруг своего центра, а затем перемещали их наружу.Таким образом, преобразования применяются в обратном порядке к порядку, в котором вы их запрашиваете.

Это означает, что вы хотите применить преобразования следующим образом:

  1. отойти отorigin
  2. rotate
  3. перейти к исходной точке

Например, если вы были в OpenGL (который также является пост-множителем, и достаточно легко следовать вэтот пример, даже если вы на самом деле этого не знаете) вы можете сделать:

glTranslatef(centreOfBody.x, centreOfBody.y, 0.0f);
glRotatef(angle, 0.0f, 0.0f, 1.0f);
glTranslatef(-centreOfBody.x, -centreOfBody.y, 0.0f);
1 голос
/ 30 октября 2010

Подход, предложенный @Tommy, верен.Как и GL, преобразования графического контекста Java являются concatenated «наиболее часто используемым способом», который я считаю last-in , first-out .Типичный paintComponent() метод показан ниже и в этом полном примере .

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.translate(this.getWidth() / 2, this.getHeight() / 2);
    g2d.rotate(theta);
    g2d.translate(-image.getWidth(null) / 2, -image.getHeight(null) / 2);
    g2d.drawImage(image, 0, 0, null);
}
...