ПрограммированиеФорумГрафика

Тряска объектов. (3 стр)

Страницы: 1 2 3 4 5 6 7 Следующая »
#30
14:38, 26 июня 2011

kroonk
Такая задача в лоб не решается. Спроси у Нептуна(тема: Космический движок). Скажи, а заднюю плоскость отсечения ты тоже планируешь делать 100...00.0f?

#31
15:49, 26 июня 2011

-Eugene-
> Скажи, а заднюю плоскость отсечения ты тоже планируешь делать 100...00.0f?
Нет. Я только при отрисовке background`а(сфера размером 100...00.0f с нормалями внутрь и текстурой космоса) сделаю плоскость отсечения 100...00.0f а потом около 100000000.

#32
16:06, 26 июня 2011

-Eugene-
> Спроси у Нептуна(тема: Космический движок).
Я скачивал его программу SpaceEngine так у него нету там двигающихся объектов а у меня дёргаются только те объекты которые передвигаются с помощью векторов к примеру планета которая у меня в программе в космосе висит и пока что не двигается не дёргается, камера которая висит на хвосте космического корабля тоже спокойна, а вот сам космический корабль которым можно управлять очень сильно трясёт.

#33
17:57, 26 июня 2011

kroonk
> так у него нету там двигающихся объектов
У него там планеты по орбитам двигались...

Вообще, отношение плоскостей отсечения znear/zfar не должно превышать миллиона, могут баги вылезти.


> Я только при отрисовке background`а(сфера размером 100...00.0f с нормалями
> внутрь и текстурой космоса)
Что мешает сделать эту сферу радиусом 1.0?

#34
21:29, 26 июня 2011

-Eugene-
> У него там планеты по орбитам двигались...
Странно, не замечал...
-Eugene-
> Что мешает сделать эту сферу радиусом 1.0?
а как же объекты которые за ней.

#35
6:25, 27 июня 2011

kroonk
> а как же объекты которые за ней.
А ты рисуй игнорируя глубину.

#36
6:45, 27 июня 2011

-Eugene-
> А ты рисуй игнорируя глубину.
Понятно. А как от тряски объектов избавиться? Кстати обнаружил интересный факт я вешаю камеру на хвост объекту просто прибавляя к положению объекта вектор направления вперёд (для движения объекта я вычитаю вектор) по идее камера тоже должна трястись но почему-то этого не происходит, может быть дело в матрице перемещения?

#37
6:59, 27 июня 2011

kroonk
А у тебя как объект трясется? Целиком, или просто дергаются вершины?

#38
7:15, 27 июня 2011

Весь целиком, причём при отдалении от центра тряска увеличивается(где-то на 100000 начинается полный ужас: объект бросает из стороны в сторону временами он вообще пропадает с экрана).

#39
8:45, 27 июня 2011

kroonk
В любом случае с такими масштабами придется двигаться обходными путями. Например, использовать две системы отсчета - локальную(1.0 == метр) и глобальную (1.0 = 10 тысяч км). Короче, думать надо. И все таки, спроси у Нептуна, я помню, у него была проблема тряски на далеких галактиках...

#40
14:01, 27 июня 2011

Всё понятно, твоя проблема - потери точности 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.

#41
14:26, 27 июня 2011

Понятно, а как сделать новую систему координат где центр к примеру корабль и перейти туда?

#42
14:52, 27 июня 2011

kroonk
Все - матричная математика.

#43
7:51, 28 июня 2011

-Eugene-
> Все - матричная математика.
Я знаю, а как это реализовать?

#44
7:58, 28 июня 2011

kroonk
> Я знаю, а как это реализовать?
Кхм... А ты знаешь, что такое мировая матрица? С точки зрения математики?

Страницы: 1 2 3 4 5 6 7 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.