Я не знаком с 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, но не для других, то это, вероятно, проблема с отсечкой.
Дайте мне знать, как вы поживаете.