LOD (Levels Of Detail - уровни детализации) - способ увеличения производительности просчёта сцены путём изменения полигональности мешей, находящихся на разном расстоянии. Это изменение полигональности вообще может быть автоматическим (если вы выкрутили на минимум настройки графики), но, как правило, результат неудовлетворителен - то крыша у тепловоза пропадает, то вагон раздаливается как после падения в него бомбы...
Вывод - надо заранее сделать дополнительные малополигональные меши, и указать компьютеру, когда какую использовать. Пример - на расстоянии 600 м воздухораспределитель вагона занимает максимум 2 пикселя экрана, а все 500 полигон, из которых он состоит, должны просчитываться графическим процессором. Это же нерационально - 2 пикселя можно вообще убрать, либо (если охота придраться) поставить вместо воздухораспределителя вертикальную плоскость из 2 полигон (если 2-сторонняя, то 4 полигона).
В trainz алгоритм выбора такой меши из списка доступных связан с вычислением некого числа, характеризующего видимость данной меши (т.е. площадью, занимаемой ею на экране) и одним из 3 дополнительных алгоритмов (наиболее часто используется "расстояние до центра экрана"). Учтите, что для рассчёта этого числа треуется время, необходимое для 100-200 полигон, поэтому лодированные меши с самой детализированной моделью <300 полигон трейнз не обрабатывает
и делать ЛОДы на меши менее 1000 полигон вообще необязательно (прироста практически не будет). А вот для 2000 и более - желательно .
Меши прописываются в специальном файле, имеющем расширение .lm.txt , в специальном порядке (а в конфиге, в mesh-table идёт ссылка на этот файл, но "***.lm" (.txt тут не прописывается))
Итак, начинать надо с создания малодетализированных вариантов своей модели. Сделать вы их можете сколько угодно, то учтите, что для каждой требуется место в оперативной памяти .
Если меши имеют одинаковую текстуру, то имена этой текстуры во всех мешах должны совпадать. Кроме того, для наименее детализированных мешей можете создать ещё 1 текстуру, как минимум в 16 раз раз меньше основной (т.е. для основной 1024х1024 можно сделать ЛОДовую 256х256).
Далее, о точках привязки. Они во всех мешах должны совпадать с точностью до миллиметра и иметь одни и те же имена во всех мешах.
Сделать это можно так
1) берётся сцена с моделью и установленными точками привязки
2) модель удаляется, точки привязки оставляем, и сцену перезаписываем с новым именем
3) открываем сцену менее детализированной модели, и File->merege-> указываем нашу сцену с точками привязки -> в открывшемся списке выделяем все точки привязки и нажимаем кнопку merege
4) проделываем то же самое с остальными сценами малополигональных моделей
(тут следует отметить, что если мы хотим сделать отцепление аттачентов, необхоимо в 3d max к названиям точек дописать ":Cull". Например, точку привязки тележки можно назвать "a.bog0:Cull", а сцепки - "a.front_couple:Cull")
обращаю внимание, что точки привязки должны иметь одни и те же имена во всех мешах. Т.Е. и в самом детализированном ЛОДе точка привязки тележки тоже должна называться "a.bog0:Cull", если вы хотите чтобы тележка отцеплялась.
Меши конверите. Далее идёт настройка " .lm.txt" - файла. Лучше его скопировать из какой-либо существующей модели с ЛОДами, чтобы не разбираться с кодировками.
Приимер - часть ЛОДа полувагона Volk'а
version 1.0
offset = 0.00;
calcPoint = center;
multiplier = 1.0;
animationCutOff = 0.00;
renderCutOff = 0.00;
attachmentCutOff = 0.15;
mesh("0.15")
{
name="poluvagon 12-119 lod6.IM";
}
mesh("0.25")
{
name="poluvagon 12-119 lod5.IM";
}
mesh("0.70")
{
name="poluvagon 12-119 lod2.IM";
}
mesh("1.0")
{
name="poluvagon 12-119.IM";
}
Итак, первый тег version определяет только весию - т.е. никак не влияет. Но обязателен.
Второй тег, offset. Определяет задержку на переход к следущему ЛОДу (необходим, если ваша мешь начинает мигать, перехотя от одного лода к другому и назад).
calcPoint - определяет, какой дополнительный алгоритм использовать при рассчёте ЛОДового числа (на самом деле такого термина нету - по другому можно называть "численное значение степени детализации", но его долго писать )
center - считать расстояние до центра экрана (чем ближе к центру, тем более детализированный выбирать)
near - считать от ближней зоны
far - считать от дальней зоны
Чем больше ЛОДовое число, тем более она виднее.
multiplier - коэффициент для ЛОДового числа
animationCutOff - ЛОДовое число, начиная с которого прекращается анимация меши (я честно не знаю, как делать ЛОДированную анимированную мешь, но вообще это можно)
renderCutOff - ЛОДовое число, начиная с которого мешь полностью пропадает (хотя её рассчёт всё ещё ведётся).
Пример применения этих 2 тегов. Я сделал отдельную анимированную мешь люков полувагонах Volk'a,
но вышла она на 2000 полигон. В результате при при 2 составах, стоящих рядом, она давала fps 12 (комп слабый, трс 2006).
Затем я сделал на эту мешь отдельный ЛОД, в котором указал renderCutOff (чтобы на большом расстоянии прорисовывались люки ЛОДов основной модели, а не анимированные высокодетализированные),
и чуть больший renderCutOff (всё равно за дымами высыпающегося груза никто закрытых люков не увидит ). Результат - fps 25.
attachmentCutOff - ЛОДовое число, отцепляющее все меши на токах привязки с окончанием ":Cull" , от данной.
Внимание! Если вы сделали отцепку от точек привязки тележек и тормозных рукавов, то отцепка тормозных рукавов РАНЬШЕ или ПОЗЖЕ тележек произойти не сможет! Только ОДНОВРЕМЕННО! Даже если вы не прописали ":Cull" в точке привязки в одном из ЛОДов, или ещё что-то с этими точками мутили.
Далее идёт список ваших мешей. Причём mesh("0.15") означает, что прорисовка будет вестись этой мешью от горизонта до ЛОДового числа в 0.15.
Если вы схранили multiplier = 1.0; то максимальное значение ЛОДового числа 1.0
В списке ЛОДовые числа должны убывать.
Если Вы не допустили никаких ошибок (контент мененджер их обязан показать), то должны заметить изменение своей модели при удалении от неё