PlayTruckSims: Грузовые симуляторы, Дальнобойщики, Euro Truck Simulator 2, American Truck Simulator

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Декодинг PMA\PMG\PMC\PMD

Сообщений 61 страница 90 из 143

61

newgeneral
хм....интересно для меня, так как я строю карту и с prefab дружу(уже).Вот забрал перфаб из Haulin   :flirt:
https://s51.radikal.ru/i132/0905/f7/27a054c68ba2t.jpghttps://s46.radikal.ru/i111/0905/b9/cdbb0a80d9a8t.jpg
п.с я конечно не разгонялся со строительством но пока что соединил перекрёсток с дорогой.А так спс за инфу. :flag:

Отредактировано Alex (2009-05-16 13:11:27)

+1

62

olegbs написал(а):

Меня интересовал, насколько помню, блок Variant1, там прописаны ключи (key), по которым выбирается скин (по твоему определению).Для очень многих описаний грузов и используемых ими прицепов определены скины фиксированные, как то plain или plain2. Мне как дурню, понадобилось создать компанию (тот еще гемор по сравнению с предыдущими играми), которая использовала грузы под прицепы fuel_cistern и food_cistern, у которых при выборе груза именно в блоке Variant1 ищется по названию компании используемый скин, вариант с фиксированных скином не проходит.Поэтому в этом блоке расположены ключи с названиями EuroGoodies, ITCC и прочие. Причем написаны ключи (названия компаний) в зашифрованном виде.

Разобрался.

Там находится восьмибайтное число с контрольной суммой имени текстуры (не mat и не tobj!). Для городов и дорог они прописаны в def/world/overlay.sii.
Алгоритм подсчета прост.
Символы кодируются значениями от 01h до 25h
0 - 01h, 1 - 02h, 9 - 0Ah, A - 0Bh, Z-24h, _ - 25h

Регистр букв в строке переводится в заглавные.
Подсчет начинается с конца строки.
Если Ch - значение символа, то
Result = result*26h+ch

Вот функция на дельфях. Проверена, я к указателям городов добавил Минск https://foto.dreamhost.by/pic_s/09/08/11/09923fb358d60832cfb65ebad3bcdfaf.jpg

function TForm1.GetCRC(S: String): Int64;
var I,J: Integer;
begin
  Result:=0; S:=AnsiUpperCase(S);
  for I:=length(S) downto 1 do begin
    case S[i] of
      '0'..'9': J:= Ord(S[i])-Ord('0')+1;
      'A'..'Z': J:= Ord(S[i])-Ord('A')+11;
      '_': J:=25;
      else J:=0;
    end;
    Result:=Result*$26+J;
  end;
end;

Отредактировано avmark (2009-08-11 22:15:58)

+2

63

А как понимать вот это:

https://i004.radikal.ru/0908/d1/62c8f0d3a14ct.jpg

Как видно из скрина, размер тени не привязан к размеру куба коллизии. И что делать, как его изменить, я имею в виду размер тени ???

0

64

tomas-ind написал(а):

Как видно из скрина, размер тени не привязан к размеру куба коллизии. И что делать, как его изменить, я имею в виду размер тени ???

Надо просто переместить   коллизию на то места куда хочеш и все.

0

65

tomas-ind, что это у тебя за полосы такие o.O Может хаулиновским движком предусмотрено, чтобы "края тени" будем образно так говорить были расположены на определенном рассотоянии от краев коллизии? Попробуй коллизию еще подвинуть по иксу ближе к заду...

0

66

Как это ? Размеры тени - это и есть размеры коллизии!!! - заноза ессно не умеет правильные значения делать..поэтому правим центр ! и размеры кубов в хексе.тогда все будет ровно.

0

67

Lexan написал(а):

Как это ? Размеры тени - это и есть размеры коллизии!!! - заноза ессно не умеет правильные значения делать..поэтому правим центр ! и размеры кубов в хексе.тогда все будет ровно.

Lexan, я всё делал по твоему методу. И как ты и утверждал колизия изменилась, но тень осталась неизменной. Как видим из скрина куб коллизи на месте, т.е. отцентрован, но тень при этом имеет в два раза больший размер чем куб, по одной из сторон, т.е. по длине трейлера...  :dontknow:
Почему не понятно... :dontknow:

0

68

Кажись я понимаю...ты коллизию случайно не Скайлил ? инструментом скейл ?..или же двигал вершины ?...чтобы увеличить размер ?.
кстати ты можешь импортнуть грузовик и посмотреть что у тебя с коллизией..после изменения в хексе.

Отредактировано Lexan (2009-08-31 14:06:59)

0

69

Lexan написал(а):

Кажись я понимаю...ты коллизию случайно не Скайлил ? инструментом скейл ?..или же двигал вершины ?...чтобы увеличить размер ?.кстати ты можешь импортнуть грузовик и посмотреть что у тебя с коллизией..после изменения в хексе.

Нет... На сколько помню, т.к. было это где-то год назад, я изменял размеры куба вручную, задавая значения размеров в его свойствах. Ну я же у тягачей кубы изменял и всё работало, хотя у трака не один куб коллизии. У трейлеров тот-же метод изменения, только прописывать потом параметры хексом нужно, на сколько я понимаю это и все отличия...
Конечно я пробовал импортить, колизия как на скрине. Т.е. она изменяется, как мне нужно, но тень при этом остаётся неизменной. Ещё меня удивило то, что в этом трейлере, при импорте дефолтной модели, почему то оказалось несколько кубов коллизии. Я пробовал переставлять местами кубы, т.к. в траках от места в иерархии зависит и свойство куба, в конце концов на сколько помню оставл только один куб, но результат ты сам видишь...
Ладно, трудно давать советы на растоянии, буду сам разбираться, как найду причину сообщу.

0

70

ну вполне возможна проблема изза-колва вариантов (один вариант или несколько)

0

71

Частичный разбор PDD-файла на примере "road2_x_road2_sidewalk_all.pdd"
Спасибо newgeneral, за первоначальный декодинг.
Вот что получилось...
Линии разобраны на 90%.
Я старый паскалист, поэтому все типы, как для дельфей.
INT64 - 8 байтное целое число со знаком;
Integer -  4 байтное целое число со знаком.
Single - 4 байтное дробное число со знаком (float).

Структура "точки" координат.
PDD_Point = packed record
    X,Y,Z: Single;
  end;

Количество линий находится по смещению 8h от начала файла(Integer). По адресу 28h от начала файла находится значение смещения от начала файла на массив линий (Integer).

Сами линии описываются следующей структурой (размер - 116 байт).

PDD_line = packed record
  NameCRC: Int64;
  Unknown1: Integer;
  ToNode: Integer;
  Unknown2: Integer;
  Positions: Array[1..2] of PDD_point;
  Angle: Array[1..2] of PDD_Point;
  Unknown3: Integer;
  LinkTo,
  LinkFrom: Array[1..4] of Integer;
  CountLinkTo,
  CountLinkFrom: Integer;
  Unknown4: Integer;
end;

Описание
NameCrc - контрольная сумма имени линии. Вычисляется аналогично, как я писал ранее, для PMD. Может принимать различные значения вида "PREFABLOC", "PREFLOC21", "PRELOC25" и пр. Не уникально даже внутри одного файла. Имена в открытом виде нигде не встречаются. Кто дружит с Занозой, может быть более разберется, для чего они и как формируюутся.
Unknown1 - Разрешение проезда? Принимает 4 значения.
  0 - чаще всего.
  8 - городские перекрестки, поворот, малый радиус (синяя линия на рисунке) (легковые?).
76(4ch) - городские перекрестки, поворот, большой радиус (зеленая линия)(Грузовики?).
64(40h) - только Т-развязки автострад, малый радиус, проезд под мостом и пр. (красная линия).

ToNode - В направлении какой ноды перекрестка движется транспорт по линии.
Ноды кодируются побитно, начиная с 2-х (2, 4, 8, 16). Если линия заканчивается на "развилке" (например, прямо и направо), прописывается сумма нод (2+4=6).

Unknown2 - Всегда 1. Количество линий? Разрешенная скорость?

Positions - Координаты начала и конца линии (X,Y,Z) относительно центра перекрестка.
Angle - угол поворота автомобиля в начале и конце линии (X,Y,Z). (см.рис).

LinkTo, LinkFrom - массивы из 4-х значений.
Все линии нумеруются по порядку, начиная с 0. В этих массивах содержатся номера линии, с которыми граничит текущая. Если значение "пустое", записывается "-1" (FF FF FF FF).
CountLinkTo и CountLinkFrom - соответственно, количество значений в массиве. 
Если линия не граничит с другими, все четыре значения будут "-1", а count - "0".
Пример, на рисунке.

Unknown4 - как-то связан с предыдущими данными. Принимает значения 0 (чаще), 2 или 4.

Остается непонятным Unknown3. Для каждой линии разное. Не целое число (слишком большое), не дробное, не crc.

Беглый взгляд на структуру ноды. Аналогично линиям, количество прописано по смещению 4h от начала файла, смещение на начало - 24h.

PDD_Node_Unknown = packed record
     Unknown3: Array[1..128] of Byte;   // 00 (нули)
     Unknown4: Array[1..32] of Single; // 00 00 20 40 = 2,5
     Unknown5: Array[1..384] of Byte; // 00
   end;

PDDNode = packed record         //1376 байт
     Unknown1: Integer;                 //Номер ноды?
     Unknown2: Integer;
     Coord1,                            //Координаты ноды?
     Coord2: PDD_Point;                 //Направление, угол (похож на angle в линии)?
     Unknown: Array[1..2] of PDD_Node_Unknown
     LineBegin,                        //номера линии, которые начинаются
     LineEnd: Array[1..8] of Integer;  // и заканчиваются на этой ноде. Либо, "-1" (FF FF FF FF).
   end;

Остальное позже...

Рисунки:
https://www.fotohost.by/pic_s/09/09/29/e080b823752803df8dd1575970ac73f7.jpg
https://www.fotohost.by/pic_s/09/09/29/42f25e1bd2abab4b7d8a71d25d65ed1b.jpg

+3

72

avmark, да... На вес золота такой труд, пригодится)

0

73

Продолжается разбор PDD.
В принципе, почти закончен. Что не разобрал, может коллективный разум  подскажет... :)
Во первых, я был неправ по поводу "угла поворота". Это, скорее, направление. Принимает значения от -1 до 1. Я не моделирую, поэтому не знаю терминов. Если называется не так, ногами не пинать.
В архиве содержится TXT файлы с таблицами блоков и отрисованные по ним JPG. Не всегда, корректно, но вроде понятно.

Непосредственно разбор:

Повторюсь, точка координат или направление
  PDDPoint = packed record
               X,Y,Z: Single;
             end;

Заголовок
  PDDTitle = packed record
                Title: Integer;        // всегда 15. "Магическое число"
                CountNodes: Integer;   // количество нод
                CountLines: Integer;   // количество линий
                CountSigns: Integer;   // количество знаков
                CountLights: Integer;   // количество светофоров
                CountServices: Integer; // количество точек сервиса и погрузок/разгрузок
                CountUnknown3: Integer; // неизвестно, но всегда 0
                CountLimits: Integer;   // "Ограничители" края перекрестка см.рис.
                CountVariants: Integer; // Скорее всего, варианты перекрестка. Всегда 1.
                OffsNodes: Integer;     // смещение на блок нод.
                OffsLines: Integer;     // линий
                OffsSigns: Integer;     // знаков
                OffsLights: Integer;    // светофоров
                OffsServices: Integer;  //"сервисов"
                OffsUnknown3: Integer;   //пусто
                OffsLimitsCoord: Integer; //координаты ограничителей
                OffsLimitsAngle: Integer; // направление ограничителей
                OffsVariants: Integer;    // блок вариантов.
             end;

Если блока нет (количество = 0), смещение прописывается на "следующий" существующий блок. Поэтому адреса повторяются.

Ноды: (темнозеленые точки на рисунке)

PDD_Node_Unknown = packed record
  Unknown3: Array[1..128] of Byte;   // 00 (нули)
  Unknown4: Array[1..32] of Single; // 00 00 20 40 = 2,5
  Unknown5: Array[1..384] of Byte; // 00
end;

PDDNode = packed record         
     Unknown1: Integer;                 
     Unknown2: Integer;
     Coord,                            //Координаты ноды
     Angle: PDDPoint;                 //Направление, угол
     Unknown: Array[1..2] of PDD_Node_Unknown; //у всех одинаково
     LineBegin,                        //номера линии, которые начинаются
     LineEnd: Array[1..8] of Integer;  // и заканчиваются на этой ноде. Либо, "-1" (FF FF FF FF).
   end;

Unknown1 и Unknown2 пока неясные числа. Unknown1 нулевой ноды всегда равен 0. Следующей - Unknown1+Unknown2 предыдущей. Как формируется Unknown2, пока не разобрался.

Линии:
Как в преыдущем посте. Ничего нового. Unknown3 остался невыясненным...

Светофоры: (красные точки)

  PDDLight = packed record
                Coord: PddPoint; // координаты светофора
                Angle: PddPoint; // направление
                Unknown1,        // всегда 0
                MainNode: Integer; //какую ноду регулирует.
             end;

Знаки: (Ярко-зеленые точки)

  PDDSign = packed record
    Unknown1,               //всегда 0
    Unknown2: Integer;      // аналогично
    Coord: PddPoint;        // координаты знака
    Angle: PddPoint;        // направление
    Unknown3: Integer;      // всегда 0
    NumSign: Integer;       // номер знака из def\world\sign.sii
    Unknown4: Integer;      // всегда 0
    Unknown5: Word;         // всегда 0
    Unknown99: Array[1..3] of Integer; // всегда -1 (FF FF FF FF)
    Unknown6: Word;         // всегда 0
  end;

Сервисы (желтые точки)

  PDDService = packed record
     Coord,                // координаты
     Angle: PddPoint;      // направление
     Unknown1,             // всегда 0
     NumService : Integer; // код сервиса. Откуда берется, пока не понял.
  end;

Ограничители (синие точки)
Либо границы перекрестка, либо ограничение проезда.
Разделены на два блока. Структура - PDDPoint (X,Y,Z). В первом блоке координаты точки, во втором - направление (на следующую?).
В текстовике объединены в одну таблицу, для удобства.

Варианты.

  PDDVariant = packed record
                  NameCRC: Int64;    // CRC имени варианта. Всегда "_default"
                  Unknown1: Integer; // всегда 0
               end;

Вроде все. Если кто заметит, что проскочило мимо моего внимания, буду благодарен.

+2

74

Пока последние изменения в разборе PDD.

Ноды.
Unknown1 и Unknown2 можно переименовать в SumLimits и CountLimits.
CountLimits - количество точек ограничений (limits) между текущей нодой и предыдущей (для нулевой - с последней). SumLimits - сумма точек, начиная с нулевой ноды (SumLimits[1]=SumLimits[0]+CountLimits[0]). Для последней ноды SumLimits+CountLimits=CountLimits заголовка PDD.

Знаки.
Теперь структура выглядит следующим образом

  PDDSign = packed record
    Unknown1,               //всегда 0
    Unknown2: Integer;      // аналогично
    Coord: PddPoint;        // координаты знака
    Angle1X,
    Angle2X,
    Angle1Z,
    Angle2Z: Single;
        // направление
    NumSign: Integer;       // номер знака из def\world\sign.sii
    Unknown4: Integer;      // всегда 0
    Unknown5: Word;         // всегда 0
    Unknown99: Array[1..3] of Integer; // всегда -1 (FF FF FF FF)
    Unknown6: Word;         // всегда 0
  end;

Четыре числа типа Single (float) вместо Angle и Unknown3.
Для больших английских развязок данные записываются в Angle2. (Angle1=0) Для остальных наоборот, Angle2=0, Angle1<>0.
Для некоторых перекрестков (например "парковки" (parking.pdd)), для двух фонарей все четыре числа ненулевые.

Как пример разбора, выложил два городских перекрестка, где светофоры расположены в начале и в конце префаба. Остановившись на левой полосе не надо головой крутить, чтобы светофор увидеть.
https://www.fotohost.by/pic_s/09/10/3/0abdf06dfa2bb04f7a02df8efd796586.jpg

Отредактировано avmark (2009-10-03 20:28:11)

+2

75

Эт конечно здорово..встречное предложение
доразбирать всетаки PMG - с анимацией, главное найтисвязь обьектов - с пма файлами, и геометрический массив.полностью.

0

76

Ребят, подскажите пожалуйста, как можно снизить освещение в кабине? После жизни в ETS и первого запуска GTS, даже на глаз заметно, что в GTS освещение в кабине гораздо меньше, чем в ETS. Предполагаю, что данные освещение хранятся в PMG-файлах.

Для сравнения, открыл model.pmg из ETS и из GTS:
https://s001.radikal.ru/i193/1001/7a/ad7bd38f9e81t.jpghttps://s004.radikal.ru/i208/1001/02/9d6f13cd68bbt.jpg
Как видно из скринов, в ETS салоне гораздо светлее, чем в GTS.

Есть ли у кого-нибудь мысли, как это можно исправить (кроме прямого копирование файлов из одной игры в другую)? Может байтик какой-то есть, отвечающий за уровень освещённости?

Отредактировано Knox_xss (2010-01-31 02:43:30)

0

77

Knox_xss только если красить вершины в занозе через команду surface/paint/color.

0

78

Knox_xss
А зачем копировать да и вообще менять? С помощью краски вершинок разрабы сделали хоть какие-то тени в салоне. В GTS салон выглядит более реалистично чем в ETS.

0

79

Джо написал(а):

А зачем копировать да и вообще менять? С помощью краски вершинок разрабы сделали хоть какие-то тени в салоне. В GTS салон выглядит более реалистично чем в ETS.

В том-то и дело, что хотелось бы, чтобы в ETS был такой же салон, как и в GTS. Поэтому предположил, что в GTS просто смещён источник света и немного уменьшена его яркость. Пробовал в ETS ставить салон из GTS - выглядит так же, как и в GTS, но есть две загвоздки:
- зеркала не работают (показывает только vehicle_reflection.tobj);
- FOV остался прежним.

Кстати о FOV (field of view). Предполагаю, что его значение напрямую прописано в game.exe. Хотелось бы и его изменить, так что пока ищем, ищем...  :glasses:

0

80

в етс возможно да

в гтс в описании камеры идет и FOV и анимация. трясяскии

0

81

Knox_xss написал(а):

Пробовал в ETS ставить салон из GTS - выглядит так же, как и в GTS, но есть две загвоздки:
- зеркала не работают

Ну так скажем чего-то ты не доработал или не до понял...
Салоны становятся реально и с зеркалами и с вариантами и классами....

0

82

ну. так в ЕТС..отдельной моделью зеркала идут. а в ГТС в моделе салона, хотя должны работать оба варианта. т.к. шейдеры есть и там и там.

0

83

Новые данные по перекресткам, появившиеся во время конвертации "левосторонних" в "правосторонние".
Во всех типах название поля Angle можно заменить на Direction. Так будет более правильно. Direction означает направление объекта в требуемой точке. Вычисляется как проекция вектора по трем осям. Проще говоря, если угол Y=0, то X и Z равны соответственно -SIN и -COS от угла направления. Если Y<>0, то расчет несколько сложнее. Привет математикам, а я давно все забыл.
Линии:
Unknown1 заменяем на BitParams - битовые свойства линии. Со всеми пока не разбирался, но 4-й и 5-й биты означают включение у траффика соответственно правого и левого поворотника. 7-й, возможно, сброс скорости.
Unknown3 заменяем на LengthOfLine: Single; - длина линии. Вычисляется, скорее всего, по дуге, а не напрямую между точками. По крайней мере "прямые" значения не совсем совпадали с прописанными в PDD.
Остались невыясненными для линий Unknown2 (всегда равен 1), и Unknown4 - принимает значения 0 и 2. Замена одно на другое никаких видимых результатов не дала.

Структура линии на дельфях теперь выглядит так:

PDD_line = packed record
  NameCRC: Int64;
  BitParams: Integer;
  ToNode: Integer;
  Unknown2: Integer;
  Positions: Array[1..2] of PDD_point;
  Direction: Array[1..2] of PDD_Point;
  LengthOfLine: Single;
  LinkTo,
  LinkFrom: Array[1..4] of Integer;
  CountLinkTo,
  CountLinkFrom: Integer;
  Unknown4: Integer;
end;

Отредактировано avmark (2010-03-25 20:16:33)

+2

84

conte7 написал(а):

Ну так скажем чего-то ты не доработал или не до понял...
Салоны становятся реально и с зеркалами и с вариантами и классами....

Ну так может ты подскажешь, какие параметры изменить, чтобы зеркала заработали?
И салоны, и варианты, и классы - всё становится отлично. Кроме зеркал.

https://s59.radikal.ru/i166/1004/8b/083f14f1eda0t.jpg

ETS, по крайней мере версии 1.2, следующие параметры из GTS-ного renault_magnum_interior_excl.sii вообще не принимает:
# active_mirrors_part: a_mirrors
# passive_mirrors_part: p_mirrors
Пришлось закомментить и оставить родные.

Ни одни из следующих не работают.
mirrors_part: p_mirrors
mirrors_part: a_mirrors
mirrors_part: mirrors
mirrors_part: mirrors_s
mirrors_part: mirrors_e

0

85

Knox_xss

Я конвертнул Ман и Даф в ЕТС вместе с салонами...
Скачай на моём сайте и посмотри что да как.....
Военного там ничего нет.... кроме бортового компа....

0

86

Lexan написал(а):

Lexan

у меня к те просьба ты не мог бы дать сваю не заблокированую модель мод камаз  то хо4у редактировать а не полу4ается ((

Отредактировано mexnik (2010-04-22 13:01:41)

0

87

AI-машины, стоящие на префабах (заправках, стоянках, сервисах и т.п.)... нигде не нашёл информации, где они прописаны.
Теоретически, должна храниться следующая инфа:
- координаты относительно центра префаба (float X, Y, Z);
- направления (float X, Y, Z);
- тип транспортного средства (никакой/легковой/грузовой/грузовой с прицепом);
- либо прицеп (допустим, 0 - если без прицепа);
...
Ну что-то типа того.
Никто из вас не сталкивался с этим?

0

88

открой саму модель префаба, там думмисы под паркованный транспорт имеются...

+1

89

https://s001.radikal.ru/i193/1001/7a/ad7bd38f9e81t.jpg
(Прошу сильно не пинать, с занозой не дружу.)
Кто знает, камера в кабине привязана к синему кубу или она имеет свои координаты? Или синий куб и есть камера?
Хочется в хексе поиграться с позицией камеры по трём осям, но из приведенного выше описания структуры PMG не очень понятно, где искать координаты камеры.
В дефинишинах камеры параметр uplift отвечает за движение камеры по оси Y, следовательно где-то запрятаны оси X и Z. Может кто сталкивался с этим?

0

90

ребята , подскажите как редактировать пмд для салона ??? заранее благодарю !
извените если не туда написал !

Отредактировано Dron3 (2010-07-05 19:08:18)

0