kroonk
Такая задача в лоб не решается. Спроси у Нептуна(тема: Космический движок). Скажи, а заднюю плоскость отсечения ты тоже планируешь делать 100...00.0f?
-Eugene-
> Скажи, а заднюю плоскость отсечения ты тоже планируешь делать 100...00.0f?
Нет. Я только при отрисовке background`а(сфера размером 100...00.0f с нормалями внутрь и текстурой космоса) сделаю плоскость отсечения 100...00.0f а потом около 100000000.
-Eugene-
> Спроси у Нептуна(тема: Космический движок).
Я скачивал его программу SpaceEngine так у него нету там двигающихся объектов а у меня дёргаются только те объекты которые передвигаются с помощью векторов к примеру планета которая у меня в программе в космосе висит и пока что не двигается не дёргается, камера которая висит на хвосте космического корабля тоже спокойна, а вот сам космический корабль которым можно управлять очень сильно трясёт.
kroonk
> так у него нету там двигающихся объектов
У него там планеты по орбитам двигались...
Вообще, отношение плоскостей отсечения znear/zfar не должно превышать миллиона, могут баги вылезти.
> Я только при отрисовке background`а(сфера размером 100...00.0f с нормалями
> внутрь и текстурой космоса)
Что мешает сделать эту сферу радиусом 1.0?
-Eugene-
> У него там планеты по орбитам двигались...
Странно, не замечал...
-Eugene-
> Что мешает сделать эту сферу радиусом 1.0?
а как же объекты которые за ней.
kroonk
> а как же объекты которые за ней.
А ты рисуй игнорируя глубину.
-Eugene-
> А ты рисуй игнорируя глубину.
Понятно. А как от тряски объектов избавиться? Кстати обнаружил интересный факт я вешаю камеру на хвост объекту просто прибавляя к положению объекта вектор направления вперёд (для движения объекта я вычитаю вектор) по идее камера тоже должна трястись но почему-то этого не происходит, может быть дело в матрице перемещения?
kroonk
А у тебя как объект трясется? Целиком, или просто дергаются вершины?
Весь целиком, причём при отдалении от центра тряска увеличивается(где-то на 100000 начинается полный ужас: объект бросает из стороны в сторону временами он вообще пропадает с экрана).
kroonk
В любом случае с такими масштабами придется двигаться обходными путями. Например, использовать две системы отсчета - локальную(1.0 == метр) и глобальную (1.0 = 10 тысяч км). Короче, думать надо. И все таки, спроси у Нептуна, я помню, у него была проблема тряски на далеких галактиках...
Всё понятно, твоя проблема - потери точности float или double, не важно, когда ты рисуешь корабль. Подозреваю, что делаешь это так:
координата х камеры = 151061321014 (например)
координата х корабля = 151061321014.001
при рендере загружаешь матрицы и вычисляешь их DX функциями (которые float к тому же), в итоге получается вычитание этих чисел. По-идее должно получиться
151061321014.001 - 151061321014 = 0.001
но машинной точности не хватит, и получится ровно 0. А в следующем кадре получится ещё что-нибудь, и т.д. Отсюда тряска.
Выход - избавляться от вычитания близких по величине больших чисел. В своём движке я это сделал переходом в локальную систему координат. Т.е. для галактик и звёзд одна СК с единицей расстояния 1 парсек, для объектов в планетной системе - другая с единицей 1 километр. Получается что координаты планет в первой системе нельзя задать точно (не хватит точности double), но это и не важно - координаты звезды задаются в ней достаточно точно, а планеты рендерятся всегода относительно звезды, поэтому не прыгают.
В твоём случае с кораблём просто задавай координаты камеры относительно корабля, т.е. например
координата х корабля = 151061321014.001
координата х камеры (отн. корабля) = -0.001
рендерим корабль: х = -(-0.001) = 0.001
рендерим планету: x = (151061321014.001 - 0.001) + x_планеты (на самом деле и тут надо использовать аналогичный подход с локальными координатами)
Все вычисления матриц и т.д. делай на ЦПУ в формате double и избегай сложения/вычитания близких больших чисел.
Между прочим, никакого падения производительности от использования double не будет: процессор на аппаратном уровне даже не даблами, а 80-битными числами, которые мелкомягкие поленились реализовывать в своём компиляторе. Вот в видеокарту не стоит загонять double. Перед загрузкой матрицы переводи её из double во float.
Понятно, а как сделать новую систему координат где центр к примеру корабль и перейти туда?
kroonk
Все - матричная математика.
-Eugene-
> Все - матричная математика.
Я знаю, а как это реализовать?
kroonk
> Я знаю, а как это реализовать?
Кхм... А ты знаешь, что такое мировая матрица? С точки зрения математики?
Тема в архиве.