У меня есть приложение, в котором все объекты сцены загружаются из .obj
файлов (они экспортируются из Blender). И мне нужно повернуть один из этих объектов вокруг определенной точки. В настоящее время, у меня есть следующий код:Повернуть вокруг определенной точки в Java3D
public void rotateTo() {
// translate to origin, rotate, translate back
Vector3f origin = new Vector3f();
Vector3f pivot = new Vector3f(.0f, .5f, .0f);
this.getTransform(this.transform);
this.transform.get(origin);
double angle = -Math.PI/2;
double newX = origin.getX() + Math.cos(angle) * (pivot.getX() - origin.getX()) - Math.sin(angle) * (pivot.getY() - origin.getY());
double newY = origin.getY() + Math.sin(angle) * (pivot.getX() - origin.getX()) + Math.cos(angle) * (pivot.getY() - origin.getY());
this.transform.set(new Vector3f((float)newX, (float)newY, .0f), 0.15f);
this.setTransform(this.transform);
this.transform.set(origin, 0.15f);
this.setTransform(this.transform);
}
Где this
относится к TransformGroup
объекта, что мне нужно повернуть, и this.transform
относится к Transform3D
объекта.
Но этот метод не работает, как я ожидал. Я также пробовал решения this и this, но они также не работали для меня.
Думаю, может быть, попытайтесь выполнить эту манипуляцию с помощью GeometryArray
, но я не могу понять, как это сделать. Кроме того, я могу попытаться экспортировать объекты с разными исходными точками, но я думаю, что это не чистое решение, потому что тогда мне нужно будет переместить их на правильные позиции с кодом.
Вот мой объект:
Я пытаюсь повернуть его вокруг зеленой точки, но во всех случаях она вращается вокруг красной точки, или не вращается вообще, или переводит некоторые точка без вращения.
P.S. Я знаю, что Java3D является старой библиотекой и может использовать более мощные инструменты, но это требование моего университетского профессора, и я не могу отказаться от его использования.
Теперь все ясно, спасибо большое! Я пропустил, что методы 'set ...' переопределяют существующее преобразование. – vanelizarov