Вращение платформы просмотра в Java3d

Следующий код помещает куб в (0, 0, 0), а другой в (0, .5, .5 ), и каждый куб имеет размер (.5, .5, .5). Я пытаюсь повернуть представление, которое попадает на экран, в такое, как это good, но вместо этого я получаю это представление alt text. Кроме того, я понимаю, что перевернул цвета.

Так или иначе, пока это мой код:

import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;

public class Positioning {
    private Color3f lightBlue;
    private Color3f aquaGreen;
    private Color3f white;
    private Color3f teal;
    private BranchGroup group;
    private SimpleUniverse universe;

    public Positioning() {
        lightBlue = new Color3f(0.0f, 0.749019608f, 1.0f);
        aquaGreen = new Color3f(0.439215686f, 0.858823529f, 0.576470588f);
        white = new Color3f(1.0f, 1.0f, 1.0f);
        teal = new Color3f(0.196078431f, 0.6f, 0.8f);

        universe = new SimpleUniverse();
        group = new BranchGroup();

        addCube(0.5f, 0.5f, 0.5f, new Vector3f(0.0f, 0.0f, 0.0f), lightBlue);
        addCube(0.5f, 0.5f, 0.5f, new Vector3f(0.5f, 0.0f, 0.5f), aquaGreen);

        //add light
        DirectionalLight light1 = new DirectionalLight(white, new Vector3f(0.0f, 7.0f, -12.0f));
        light1.setInfluencingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0));
        group.addChild(light1);

        //look at the right spot
        Transform3D lookAt = new Transform3D();
        lookAt.lookAt(new Point3d(0.0, 0.0, 3.0), new Point3d(0.0, 0.0, 0.0), new Vector3d(1.0, 1.0, 0.0));
        lookAt.invert();
        universe.getViewingPlatform().getViewPlatformTransform().setTransform(lookAt);
        universe.addBranchGraph(group);
    }

    public void addCube(float x, float y, float z, Vector3f position, Color3f color) {
        TransformGroup tg = new TransformGroup();
        Transform3D trans = new Transform3D();

        Appearance app = new Appearance();
        Material mat = new Material();
        mat.setDiffuseColor(color);
        mat.setSpecularColor(color);
        app.setMaterial(mat);
        Box b = new Box(x, y, z, app);

        //move into position and add to the branch group
        trans.setTranslation(position);
        tg.setTransform(trans);
        tg.addChild(b);

        group.addChild(tg);
    }

    public static void main(String[] args) {
        new Positioning();
    }
}

Итак, сейчас холст черный, и я думаю, что это может быть мое расположение в функции lookAt. Я также не совсем уверен, для чего нужен вектор вверх. Есть идеи, как это исправить?

7
задан SummerCodin 30 August 2010 в 03:26
поделиться

1 ответ

Я не знаком с Java, но обычно вы можете настроить матрицу представления, используя какую-то функцию "lookAt". Беглый просмотр документации натолкнулся на это .

Кстати, setNominalViewingTransform транслируется только по оси Z, поэтому показанный вами снимок экрана - это то, что я ожидал увидеть. Вы правы, если попытаетесь настроить трансформацию вида самостоятельно.

Редактировать

Что касается направления вверх для функции lookAt , это всего лишь способ управления поворотом камеры.Другими словами, указав точку взгляда и центральную точку (точку, на которую смотрит камера), вы только определили направление. Камера все еще могла вращаться на 360 градусов по этой оси. Если вы хотите взглянуть на вещи правильно, просто укажите вектор в направлении «вверх» в вашей системе - если это y, то это будет (0,1,0). Если вы хотите взглянуть на вещи с ног на голову, то это будет (0, -1,0).

Обратите внимание, что вам не нужно следить за тем, чтобы вектор «вверх» был перпендикулярен направлению, определяемому глазом и центром. Пока он не параллелен этому направлению, метод должен автоматически просто использовать компонент предоставленного вами вектора «вверх», который перпендикулярен направлению.

Edit2:

Судя по вашим изменениям, похоже, что вы установили позицию для вектора «вверх», а не направления. Это должен быть просто вектор (0,1,0). Сказав, что это все равно не решит вашу проблему, поскольку неправильный вектор «вверх» просто означает, что камера может в конечном итоге перевернуться вокруг своей оси, так что она перевернется, набок и т. Д., Но она победила. t влияет на направление.

Следовательно, должно быть что-то не так с глазом и центральным положением, иначе матрица все еще не инвертирована. Ваше изменение для invert () выглядит неправильно, поскольку вы не вызывали его в своем lookAt Transform3D , но я предполагаю, что это всего лишь опечатка. когда вы обновили вопрос?

Я бы для начала попробовал выбрать более простой угол обзора.Просто попробуйте посмотреть вдоль оси z, используя что-то вроде

    Transform3D lookAt = new Transform3D();
    lookAt.lookAt( new  Point3d( 0.0, 0.0, 1.0 )
                 , new  Point3d( 0.0, 0.0, 0.0 )
                 , new Vector3d( 0.0, 1.0, 0.0) );
    lookAt.invert();

Что с этим происходит?

Если вы все еще получаете черный цвет, попробуйте изменить положение точки взгляда вдоль оси z, возможно, попробуйте 2.0, 3.0, а затем несколько отрицательные значения тоже.

Другая возможность заключается в том, что ваша камера смотрит в правильном направлении, но объекты отсекаются из-за усечения усеченной области. Возможно, вы захотите проверить документацию, чтобы узнать, какие плоскости отсечения установлены по умолчанию. Это может проявиться в приведенном выше примере, когда вы меняете положение глаз по оси z. Если вы видите свои объекты для некоторых значений z, но не видите другие, то, вероятно, это проблема с отсечением.

Дайте мне знать, как у вас дела.

4
ответ дан 7 December 2019 в 14:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: