Я пишу приложение для исследования космоса. Я решил, что световые годы являются единицами измерения, и точно смоделировал расстояния между звездами. После возни и много тяжелой работы (в основном, изучения веревок) я заставил камеру работать правильно с точки зрения космического корабля, пересекающего космос.
Изначально я не обращал внимания на параметр zNear функции gluPerspective(), пока не начал работать с планетарными объектами. Поскольку моя шкала измеряется в световых годах, я вскоре понял, что из-за того, что zNear равен 1,0f, я не смогу видеть такие объекты. После экспериментов я пришел к таким цифрам:
#define POV 45
#define zNear 0.0000001f
#define zFar 100000000.0f
gluPerspective (POV, WinWidth/WinHeight, zNear ,zFar);
Это работает исключительно хорошо, поскольку я смог совершить круиз по своей солнечной системе (позиция 0,0,0) и приблизиться к планетам, которые выглядят великолепно освещенными и текстурированными. Однако через другие системы (не в позиции 0,0,0) пройти было намного сложнее, потому что объекты удалялись от камеры необычным образом.
Однако я заметил, что во время путешествия по вселенной начали происходить странные визуальные сбои. Объекты позади меня будут «заворачиваться» и показываться впереди, если я повернусь на 180 градусов в направлении Y, они также появятся на своем первоначальном месте. Таким образом, при искривлении пространства большинство звезд правильно параллаксируют, но некоторые появляются и движутся в противоположном направлении (что, мягко говоря, настораживает).
Изменение zNear на 0.1f немедленно исправляет ВСЕ эти глюки (но также не разрешает объекты Солнечной системы). Так что я застрял. Я также пробовал работать с glFrustum, и он дает точно такие же результаты.
Я использую следующее для просмотра мира:
glTranslatef(pos_x, pos_y, pos_z);
С соответствующим кодом камеры для ориентации по мере необходимости. Даже отключение функционала камеры ничего не меняет. Я даже пробовал gluLookAt(), и снова он дает те же результаты.
Есть ли у gluPerspective() ограничения при использовании экстремальных значений zNear/zFar? Я пытался уменьшить диапазон, но безрезультатно. Я даже изменил свои мировые единицы со световых лет на километры, увеличив масштаб и используя большее значение zNear — ничего. ПОМОЩЬ!
float
может отображать огромные расстояния, у него очень мало разрешения. Это двоичная версия экспоненциальной записи с фиксированным количеством значащих цифр. Если у вас есть звезда на расстоянии 4,0 LY и планета на расстоянии 1,5e-5 LY, местоположение планеты будет на расстоянии 4,0-1,5e-5 = 4,0 LY, упс. - person Ben Jackson   schedule 11.09.2011