Java 3d Программирование-невозможно получить доступ к измененному положению 3d объекта
Мы работаем над проектом дополненной реальности, в котором пользователь сможет виртуально размещать 3d-объекты мебели на камеру.
Мы можем поместить 3d-объект (obj-файл) на изображение захвата, java 3d позволяет мне динамически изменять или повторно позиционировать объект с помощью мыши и класса ViewingPlatform, но я не в состоянии определить новое положение объекта.
Можете ли вы рассказать мне о том, как обнаружить измененный угол или положение 3d-объекта?
public BranchGroup createSceneGraph(String file) {
objScale = new TransformGroup();
objTrans = new TransformGroup();
trans = new Transform3D();
BranchGroup objRoot = new BranchGroup();
Transform3D t3d = new Transform3D();
t3d.setScale(scaling);
trans.setTranslation(new Vector3f(xloc, yloc, 0.0f));
objScale.setTransform(trans);
objRoot.addChild(objScale);
objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
objTrans.setCapability(Group.ALLOW_CHILDREN_EXTEND);
objTrans.setCapability(Group.ALLOW_CHILDREN_WRITE);
objTrans.setCapability(Group.ALLOW_BOUNDS_WRITE);
objTrans.setCapability(Group.ALLOW_BOUNDS_READ);
objScale.addChild(objTrans);
int flags = ObjectFile.RESIZE;
flags |= ObjectFile.TRIANGULATE;
flags |= ObjectFile.STRIPIFY;
ObjectFile f = new ObjectFile(flags,
(float) (creaseAngle * Math.PI / 180.0));
System.out.println(60 * Math.PI / 180.0);
try {
loadscente = f.load(filename);
} catch (Exception e) {
System.err.println(e);
}
objTrans.addChild(loadscente.getSceneGroup());
bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 50.0);
System.out.println(bounds + "Bounds");
getBackgroundImage();
objRoot.addChild(bgNode);
addLightsToUniverse();
return objRoot;
}
public void addCompInPanel() {
GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
c = new Canvas3D(config);
jPanel2.add("Center", c);
c.addKeyListener(this);
c.addMouseListener(this);
// Create a simple scene and attach it to the virtual universe
BranchGroup scene = createSceneGraph(filename);
u = new SimpleUniverse(c);
// add mouse behaviors to the ViewingPlatform
ViewingPlatform viewingPlatform = u.getViewingPlatform();
PlatformGeometry pg = new PlatformGeometry();
// Set up the ambient light
Color3f ambientColor = new Color3f(Color.RED);
AmbientLight ambientLightNode = new AmbientLight(ambientColor);
ambientLightNode.setInfluencingBounds(bounds);
pg.addChild(ambientLightNode);
// Set up the directional lights
Color3f light1Color = new Color3f(Color.RED);
Vector3f light1Direction = new Vector3f(1.0f, 1.0f, 1.0f);
Color3f light2Color = new Color3f(1.0f, 1.0f, 1.0f);
Vector3f light2Direction = new Vector3f(-1.0f, -1.0f, -1.0f);
DirectionalLight light1 = new DirectionalLight(light1Color,
light1Direction);
light1.setInfluencingBounds(bounds);
pg.addChild(light1);
DirectionalLight light2 = new DirectionalLight(light2Color,
light2Direction);
light2.setInfluencingBounds(bounds);
pg.addChild(light2);
viewingPlatform.setPlatformGeometry(pg);
keyNavBeh = new KeyNavigatorBehavior(objTrans);
keyNavBeh.setSchedulingBounds(new BoundingSphere(new Point3d(),
1000.0));
System.out.println(keyNavBeh.getSchedulingBounds() + " keyNavBeh.getSchedulingBounds();");
objTrans.addChild(keyNavBeh);
// This will move the ViewPlatform back a bit so the
// objects in the scene can be viewed.
viewingPlatform.setNominalViewingTransform();
OrbitBehavior orbit = new OrbitBehavior(c, OrbitBehavior.REVERSE_ALL);
orbit.setSchedulingBounds(bounds);
viewingPlatform.setViewPlatformBehavior(orbit);
u.addBranchGraph(scene);
jSlider1StateChanged(null);
}
1 ответ:
Глядя на исходный код для
KeyNavigator
, код в методеintegrateTransformChanges()
обновляет группу преобразований:Обратите внимание, что это изменяет матрицу преобразования, примененную к группе, она не изменяет вершины объекта или происхождение объекта как такового - когда сцена while визуализируется, матрица преобразования применяется к каждому вектору.targetTG.setTransform(vpTrans);
Таким образом, простой
objTrans.getTransform()
сделает трюк.[EDIT] чтобы получить преобразования, выполняемые
OrbitBehavior
, ИспользуйтеviewingPlatform.getViewPlatformTransform().getTransform()
Связанные:
- исходный код: https://github.com/hharrison/java3d-utils/blob/master/src/classes/share/com/sun/j3d/utils/behaviors/keyboard/KeyNavigator.java
- http://sourcecodebrowser.com/java3d/1.5.2plus-pdfsg/classcom_1_1sun_1_1j3d_1_1utils_1_1behaviors_1_1keyboard_1_1_key_navigator.html#a4603d261e9c14bea71789f3f3753c15e