Como definir ViewingPlatform e atualização TransformGroup?
Pergunta
Eu tenho um dentro da cena de um TransformGroup que permite que o mouse para zoom / rotação / PAN.
Eu preciso definir a posição da câmera para trás distante o suficiente para que eu possa ver toda a cena, o que eu faço com o seguinte código:
// Position the position from which the user is viewing the scene
ViewingPlatform viewPlatform = universe.getViewingPlatform();
TransformGroup viewTransform = viewPlatform.getViewPlatformTransform();
Transform3D t3d = new Transform3D();
viewTransform.getTransform(t3d);
t3d.lookAt(new Point3d(0,0,50), new Point3d(0,0,0), new Vector3d(0,1,0));
t3d.invert();
viewTransform.setTransform(t3d);
Executar o código acima funciona em que eu possa manipular a cena com o mouse. No entanto, se eu trocar esta linha:
t3d.lookAt(new Point3d(0,0,50), new Point3d(0,0,0), new Vector3d(0,1,0));
com:
// Change value from 50 to 90 to push the camera back further
t3d.lookAt(new Point3d(0,0,90), new Point3d(0,0,0), new Vector3d(0,1,0));
eu perder a capacidade de manipular a tela com o mouse.
Como posso manter a capacidade de transformar com o mouse enquanto empurra a câmera de volta ainda mais para que eu possa ver a tela inteira?
Muito obrigado antecipadamente!
Solução
GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas3d = new Canvas3D(config);
// Manually create the viewing platform so that we can customize it
ViewingPlatform viewingPlatform = new ViewingPlatform();
// **** This is the part I was missing: Activation radius
viewingPlatform.getViewPlatform().setActivationRadius(300f);
// Set the view position back far enough so that we can see things
TransformGroup viewTransform = viewingPlatform.getViewPlatformTransform();
Transform3D t3d = new Transform3D();
// Note: Now the large value works
t3d.lookAt(new Point3d(0,0,150), new Point3d(0,0,0), new Vector3d(0,1,0));
t3d.invert();
viewTransform.setTransform(t3d);
// Set back clip distance so things don't disappear
Viewer viewer = new Viewer(canvas3d);
View view = viewer.getView();
view.setBackClipDistance(300);
SimpleUniverse universe = new SimpleUniverse(viewingPlatform, viewer);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow