Размер юниверса Java3D слишком мал для размещения объекта

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


person Savva Mikhalevski    schedule 26.01.2012    source источник


Ответы (1)


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

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

введите здесь описание изображения

Источник:

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

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);
    }
}

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

person John    schedule 13.07.2012