Вращение платформы просмотра в Java3d - PullRequest
7 голосов
/ 19 августа 2010

Следующий код помещает куб в (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. Я также не совсем уверен, для чего вектор вверх. Есть идеи как это исправить?

1 Ответ

4 голосов
/ 19 августа 2010

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

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

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

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

Дайте мне знать, как вы поживаете.

...