Войти
АртФорумМоделирование

В каком формате обычно хранится 3d геометрия в PS2? (2 стр)

Страницы: 1 2
#15
3:11, 17 апр. 2011

Вообщем то 3d модель как раз и есть из игры Legend of Spyro(PS2), но при открытие других моделей получается что-то непонятное лишь формами напоминающее то что должно быть.
http://www.gamedev.ru/files/?id=66144
Можешь эти глянуть?


#16
14:10, 17 апр. 2011

EXP_LORER
> Можешь эти глянуть?
лучше уже не получится т.к. мне неизвестен алгоритм сортировки индексов. тот что сейчас работает от потолка.

> при открытие других моделей получается что-то непонятное лишь формами
> напоминающее то что должно быть.
может тебе модели лодов попались, попробуй другие.

#17
14:20, 17 апр. 2011

Модели окружения(ландшафта) грузятся нормально, а модели персонажей загружаются не правильно.
Но на сайте с описанием формата автор всетаки, как то конвертировал персонажей в .blend.
Хотел спросить, можно ли показать твой скрипт на одном зарубежном сайте?

#18
18:44, 17 апр. 2011

Изображение

ну я бы не рискнул охарактеризовать как нормально модель с перепутанными в случайном порядке нормалями к поверхности и лишними полигонами, но это несомненно лучше, чем совсем ничего.

-- .mdg import

chunk_id = 0x6c028000
chunk_end_id = 0x14000000
chunk_size = 0xcc

verts_count = 0;
ids_count = 0;

vertex_array = #()
face_array = #()

file_name = getOpenFileName \
  caption:"Blade Kitten Model File" \
  types:"Blade Kitten Model File(*.mdg)|*.mdg" \
  historyCategory:"Blade KittenObjectPresets"

if file_name != undefined then
  f = fopen file_name "rb"

if f != undefined then (
  fseek f 0 #seek_end
  size = ftell f
  fseek f 40 #seek_set
  while size > ftell f do (
    while ReadLong f #unsigned == chunk_id do (
      verts_count = ReadLong f #unsigned
      weight = ReadFloat f
      fseek f 32 #seek_cur
      for i = 1 to verts_count do (
        x = ReadFloat f
        y = ReadFloat f
        z = ReadFloat f
        append vertex_array [x, z, y]
      )
      ids_count = ids_count + verts_count
      
      while ReadLong f #unsigned != chunk_end_id do ()
    )
    
    if ids_count != 0 do (
      for i = 1 to ids_count - 2 do
        append face_array [ i , i + 1 , i  + 2 ]
      
      new_mesh = mesh vertices:vertex_array faces:face_array
      
      ids_count = 0;
      vertex_array = #()
      face_array = #()
    )
  )
  fclose f
)
#19
1:28, 18 апр. 2011

Спасибо! Хоть какой нибудь результат. Я хочу выложить эти два скрипта на одном зарубежном сайте, там уже пытались разобрать этот формат быть может помогут.

#20
10:34, 19 апр. 2011

Просмотрел с помощью нового скрипта 3d модель которую выкладывал первой, оказалось там какойто персонаж одна рука которого и была моделью выдернутая первым скриптом.

Скриншот Gmax'а | В каком формате обычно хранится 3d геометрия в PS2?
#21
0:39, 22 апр. 2011

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

#22
12:13, 22 апр. 2011

EXP_LORER
> Если я правильно понял, то несколько неточная загрузка моделей связана с тем
> что
> > не неизвестен алгоритм сортировки индексов.
да.

> во второй версии скрипта сортировка более удачная, но не совсем верная. Или
> нет?
нет. модель состоит из нескольких мешей, первый скрипт читал только первый меш, а остальные игнорировал. индексы вершин отсортированы в таком порядке: 1,2,3; 2,3,4; 3,4,5; ... n-2, n-1, n; в результате чего образуются лишние фейсы и у части фейсов нормали обращены в противоположную сторону.

#23
13:28, 22 апр. 2011

И, что нет возможности улучшить работу скрипта?

#24
14:22, 22 апр. 2011

можно наверное, только я не знаю как xD

з.ы. при желании модель правится ручками в максе: выбираешь меш, пкм->hide unselected, далее modify->edit mesh и далее выделяешь фейсы и либо удаляешь их, либо в свитке surface properties обращаешь нормаль. хлопотно конечно, но если нужна только одна модель, то вполне осуществимо.

Страницы: 1 2
АртФорумМоделирование

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