Как настроить GLCamera, чтобы показать весь GLScene

У меня есть объект GLScene различного (но известного) размера. Он полностью окружен TGLDummyCube.

Я хочу расположить GLCamera (с CameraStyle: glPerspective), чтобы объект был полностью видимым на экране. Я запустил это в основном - объект виден, но расстояние иногда слишком велико, или объект больше экрана и обрезается.

Как я могу это сделать? Я полагаю, что это может быть сделано с помощью умного сочетания расстояния камеры и фокусного расстояния, но я пока не добился успеха.

Похоже, что в GLScene это отличается от OpenGL. Я использую GLScene и Delphi 2007.

4 голоса | спросил Andreas 25 J000000Saturday09 2009, 17:08:23

2 ответа


0

Хотя изменение расстояния до камеры и фокусного расстояния приведет к изменению визуального размера объекта, у него также есть недостаток, заключающийся в изменении перспективы, что приводит к несколько искаженному виду. Я предлагаю вместо этого использовать свойство SceneScale камеры.

Увы, у меня нет действительных шагов для вычисления правильного значения для этого. В моем случае я должен масштабироваться до куба с переменным размером, в то время как размер окна зрителя является постоянным. Таким образом, я поместил два фиктивных куба в позицию целевого куба, каждый из которых должен соответствовать ширине или высоте средства просмотра с соответствующими значениями SceneScale, расстояние до камеры и FocalLength. Во время выполнения я вычисляю новый SceneScale по отношению размера целевого куба к размеру фиктивного куба. Это хорошо работает в моем случае.

Изменить . Вот код, который я делаю для расчетов.

  • ZoomRefX и ZoomRefY - это DummyCubes
  • TargetDimX и TargetDimY дают размер текущий объект
  • DesignWidth и DesignHeight имеют размер ---- +: = 10 =: + ---- во время разработки
  • MyGLView - это DesignSceneScale камеры во время разработки

Код расчета:

SceneScale

DummyCubes ScaleX := (ZoomRefX.CubeSize*MyGLView.Width)/(DesignWidth*TargetDimX); ScaleY := (ZoomRefY.CubeSize*MyGLView.Height)/(DesignHeight*TargetDimY); NewSceneScale := Min(ScaleX, ScaleY)*DesignSceneScale; и ZoomRefX имеют такие размеры, чтобы иметь небольшой запас по левому, правому или верхнему нижнему краям окна просмотра. Оба расположены так, чтобы передние грани совпадали. Кроме того, целевой объект расположен так, чтобы его лицевая поверхность совпадала с передней частью этих DummyCubes.

Приведенные выше формулы позволяют размеру окна отличаться от времени разработки, но я на самом деле не тестировал эту функцию.

ответил Uwe Raabe 25 J000000Saturday09 2009, 20:24:22
0

@ Andreas, если вы играли со SceneScale (как вы упомянули в комментариях), это означает, что вы ищете правильный способ размещения объекта в поле зрения камеры, изменяя расстояние /фокусное расстояние камеры или изменяя размеры объекта. Если это так, самый простой способ изменить размер одного объекта по размеру экрана - использовать его свойство BoundingSphereRadius , например:

ResizeMultiplier := 2; //play with it, it depends on your camera params
GLFreeForm1.Scale.Scale(ResizeMultiplier / GLFreeForm1.BoundingSphereRadius);

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

ответил Kainax 9 J0000006Europe/Moscow 2015, 03:19:46

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132