Java3D: вращающийся объект в мировых координатах? - PullRequest
1 голос
/ 21 ноября 2010

Я искал весь вечер, но не могу найти информацию, которую ищу, или даже если это возможно, что весьма огорчает;)

Я использую Java3D и не могу понять, как вращать камеру в мировом пространстве.

Мои вращения влево / вправо и вверх / вниз происходят в локальном пространстве. Это значит, что если я буду двигаться влево и вправо, все будет хорошо. Однако, если я смотрю на 90 градусов вниз, то смотрю на 90 градусов вправо, кажется, что все на его стороне.

В настоящее время я делаю следующее. Это приведет к вышеуказанным эффектам:

TransformGroup cam = universe.getViewingPlatform().getViewPlatformTransform();
Transform3D trfcam = new Transform3D();
cam.getTransform(trfcam);

trfcam.mul(Camera.GetT3D()); //Gets a Transform3D containing how far to rotate left/right and how far to move left/right/forward/back

trfcam.mul(Camera.GetRot()); //Gets a t3d containing how far to rotate up/down

cam.setTransform(trfcam);

В качестве альтернативы я попробовал повернуть корень, но он вращается вокруг 0, поэтому, если я когда-нибудь отодвиню камеру от 0, все будет плохо. Есть ли что-то доступное в сети, что бы рассказать о том, как этого добиться? Я пробовал много разных вещей, но, похоже, совсем не могу понять, что это. Я знаком с концепцией, поскольку я достиг ее в Ogre3D, просто не знаком с законом страны в J3D.

Заранее спасибо за ответы:)

1 Ответ

1 голос
/ 14 апреля 2011

Сохраните объем, который вы вращали вокруг каждой оси (x и y), и, например, когда вы пытаетесь повернуть вокруг оси x, измените направление вращения вокруг y, поверните вокруг x, затем повторите вращение вокруг y .

Я не уверен, что правильно понял ваш второй вопрос. Поскольку трансформации просмотра и модели являются двойными, вы можете имитировать движения камеры, трансформируя сам мир. Если вы не хотите переводить оси x и y, вокруг которых вы вращаетесь, просто добавьте другую TransformGroup в основную группу Transform, которую вы используете, и выполните преобразования в новой.

Редактировать: первое решение довольно медленное, поэтому вы можете сделать Transform3D из трех преобразований, которые вам нужно сделать:

Скажем, вы повернули вокруг оси x (Translate3D xrot), и теперь вам нужно вращаться вокруг y:

Translate3D yrot = new Translate3D();  
yrot.rotY(angle); 

Translate3D temp = xot; 
xrot.mul(yrot);  // Dont forget the reverse order. xrot is the previous translate 
xrot.mul(yrot);  // xrot = xrot * yrot * xrot^-1
temp.transpose();  // Get the reverse transform of the old transform
xrot.mul(temp);

yrot = xrot;  // Store it for future rotation around x axis
cam.setTransform(yrot); 

Это работает аналогично для многих преобразований, которые вы делаете: отменить предыдущее, выполнить преобразование, переделать старое. Надеюсь, это поможет.

...