Размер юниверса Java3D слишком мал для размещения объекта - PullRequest
2 голосов
/ 26 января 2012

По умолчанию границы юниверса: x = [- 1 метр, 1 метр], y = [- 1,1] и z = [- 1,1].Когда объекты пересекают эти границы, они отображаются только частично.Как я могу установить другой размер вселенной?

1 Ответ

1 голос
/ 13 июля 2012

Ну, на самом деле Вселенная по умолчанию технически не ограничена, это ведь виртуальная вселенная.

Вот как работает вселенная Java3D:

enter image description here

Источник:

Так что вселенная не слишком мала, ваш объект просто слишком велик для того взгляда, который вы пытаетесь получить. Изображение, стоящее прямо рядом с массивным зданием, не позволяет увидеть все это сразу, но если вы отступите назад, вы сможете увидеть все это на расстоянии, и оно станет меньше. Итак, вам нужно либо переместить объект, либо переместить вид. Вот как бы вы переместили свой объект:

TransformGroup moveGroup = new TransformGroup();
Transform3D move = new Transform3D();
move.setTranslation(new Vector3f(0.0f, 0.0f, -10.0f));
//^^ set the Vector3f to where you want the object to be
moveGroup.setTransform(move);
moveGroup.addChild(YOUR_OBJECT);

Вы также можете изменить источник просмотра с вашей платформы просмотра. Вот как бы вы это сделали:

public class MoveEye extends Applet
{
    public MoveEye()
    {
        setLayout(new BorderLayout());
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas = new Canvas3D(config);
        add("Center", canvas);

        BranchGroup content = getScene();
        content.compile();

        SimpleUniverse universe = new SimpleUniverse(canvas);
        Transform3D move = lookTowardsOriginFrom(new Point3d(0, 0, -3));
        universe.getViewingPlatform().getViewPlatformTransform().setTransform(move);
        universe.addBranchGraph(content);
    }

    public BranchGroup getScene()
    {
        BranchGroup group = new BranchGroup();

        group.addChild(new ColorCube(.5));

        return group;
    }

    public Transform3D lookTowardsOriginFrom(Point3d point)
    {
        Transform3D move = new Transform3D();
        Vector3d up = new Vector3d(point.x, point.y + 1, point.z);
        move.lookAt(point, new Point3d(0.0d, 0.0d, 0.0d), up);

        return move;
    }

    public static void main(String args[])
    {
        Frame frame = new MainFrame(new MoveEye(), 256, 256);
    }
}

Вероятно, хорошей практикой будет просто перемещать представление вместо перемещения объекта, но в этом случае вы можете сделать либо, я полагаю, надеюсь, это помогло!

...