[ Обновленные темы · Новые сообщения · Участники · Поиск · RSS ]
W4AnimEditor or W3DAnimEditor... Создадим?
Unaited
Админы
Сообщений: 1463
Реп: 92 / Инв: 13
и может быть сделать встроенный нормальный импортер/экспортер моделей (особенно те, которые состоят из нескольких объектов) в 3дс, хотя бы только моделей, с текстурами проблем не будет

будет очень полезно при редактировании фона в главном меню

так можно графику в игре до основания поменять




Сообщение отредактировал Unaited_Ru - ПН, 17.01.2011, 11:56:58
 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
3DS формат плох тем что в нем нету нормалей, а писать генератор нормалей мне лень... Да и групп в 3DS нет, а без групп никак не организовать структуру Xom3D файла... Да и смысл пообъектно вставлять?

Могу лишь создать нормальный Xom3D формат с плагинами для всех известных 3D редакторов (если свои плагины там поддерживаются), если хотите =)


 
Некто
Проверенные
Сообщений: 1897
Реп: 21
давай!
 
[WEC]^Rik^
Проверенные
Сообщений: 564
Реп: 7 / Инв: 10
AlexBond, Да!!!


 
Unaited
Админы
Сообщений: 1463
Реп: 92 / Инв: 13
AlexBond, для всех не надо думаю только для 3DS Max, Blender, Maya, Wings 3D. не знаю какие редакторы ещё используют в моделировании Worms 4



Сообщение отредактировал Unaited_Ru - ПН, 17.01.2011, 21:15:38
 
Drun
Хранители порядка
Сообщений: 1099
Реп: 23 / Инв: 14
А мы все ближе и ближе... кстати... W4AnimEdit... Хех, Это название еще я предлагал. 2
 
Проверенные
Сообщений: 2848
Реп: 60 / Инв: 6
AlexBond, новый формат это круто! Стоит создать, потому что я как-то хотел одну модель в xom перенести, но не смог.



-------------------------------------------------------------
And when the sun is shining, there is justice for all...
And all the people will remember that funny "war".
War, which was so dark in the beginning and so shiny in the end.
But now it's over. Over for all.
-------------------------------------------------------------
Я сюда захожу только из-за Game Project. И да, я больше не модер, поэтому не надо писать мне тонны лс с просьбами кого-либо забанить. И еще: черви меня не интересуют. Совсем. Поэтому, даже не напоминайте мне про них - вызовете большой БУГУРТ.
 
Unaited
Админы
Сообщений: 1463
Реп: 92 / Инв: 13
интересно сколько времени ждать этой проги если разделить на:
-обсуждение
-написание самой проги
-тесты


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
+ добавь время которое AlexBond будт сдавать сессию....
+ лень AlexBond'a

12

Только что тестировал Xom3D для объектов с костями в 3DSMAX

Пока лишь работает в одну сторону 2

Прикрепления: 5279406.png (75.0 Kb)


 
Проверенные
Сообщений: 2848
Реп: 60 / Инв: 6
Quote (AlexBond)
Пока лишь работает в одну сторону

в какую?

кстати, прикольный крокодил, можно вместо старушки поставить 7




-------------------------------------------------------------
And when the sun is shining, there is justice for all...
And all the people will remember that funny "war".
War, which was so dark in the beginning and so shiny in the end.
But now it's over. Over for all.
-------------------------------------------------------------
Я сюда захожу только из-за Game Project. И да, я больше не модер, поэтому не надо писать мне тонны лс с просьбами кого-либо забанить. И еще: черви меня не интересуют. Совсем. Поэтому, даже не напоминайте мне про них - вызовете большой БУГУРТ.
 
Unaited
Админы
Сообщений: 1463
Реп: 92 / Инв: 13
а если импортер/экспортер OBJ 6

 
Woitek
Проверенные
Сообщений: 523
Реп: 57 / Инв: 11
Laser =). Ho ho ho.
 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Quote (rocketvadim)
в какую?

В Экспорт...

Obj... Ну не знаю, мне Obj не нравится, там слишком мало функций, нету матриц трансформации, групп и относительного позиционирования...


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Прикрепляю файлик скрипта Xom3DLoader.ms (Недоработанного) импорта нового Xom3D, т.к. часто сижу на работе, то есть возможность поразмышлять.

Code

global Filename
global XMat = 1
global tpos = 258
global trot = 259
global tsca = 2308
global tvis = 4352
global p_x = 0
global p_y = 256
global p_z = 512

function WriteVector file p =
(
WriteFloat file p.x
WriteFloat file p.y
WriteFloat file p.z     
)

function WriteMatrix file trmatrix =
(
WriteVector file trmatrix.row1
WriteVector file trmatrix.row2
WriteVector file trmatrix.row3
WriteVector file trmatrix.row4
)

function WriteColor file clr =
(
WriteByte file (clr.r as Integer)
WriteByte file (clr.g as Integer)
WriteByte file (clr.b as Integer)
)

function WriteColor2 file clr =
(
WriteByte file (clr.x*255 as Integer)
WriteByte file (clr.y*255 as Integer)
WriteByte file (clr.z*255 as Integer)
)

function ReadColor file =     
(
return color (ReadByte file #unsigned)(ReadByte file #unsigned)(ReadByte file #unsigned)      
)

function ReadBool file = (ReadByte file)>0

function LoadXAnim file =
(
      animname = ReadString file     
      print animname     
--  deleteKeys     
      maxkey = 0
      num = ReadShort file     
      for a = 1 to num do
       (
       objname = ReadString file
       PRSType = ReadShort file
       XYZType = ReadShort file
       s = "$"+ objname
          obj = execute (s)
       print obj
       print XYZType
       controller = bezier_float()       
          
       case PRSType of
       (
       tpos :     
       (
       obj.pos.controller = Position_XYZ()
        case XYZType of
        (
        p_x: obj.pos.controller.x_position.controller = controller                
        p_y: obj.pos.controller.y_position.controller = controller        
        p_z: obj.pos.controller.z_position.controller = controller        
        )     
       )
       trot :     
       (
       obj.rotation.controller = Euler_XYZ()
        case XYZType of
        (
        p_x: obj.rotation.controller.x_rotation.controller = controller                
        p_y: obj.rotation.controller.y_rotation.controller = controller        
        p_z: obj.rotation.controller.z_rotation.controller = controller        
        )     
       )       
       tsca :
       (
       obj.scale.controller = ScaleXYZ()
        case XYZType of
        (
        p_x: obj.scale.controller.x_scale.controller = controller                
        p_y: obj.scale.controller.y_scale.controller = controller        
        p_z: obj.scale.controller.z_scale.controller = controller        
        )     
       )       
       tvis : obj.material.opacity = controller                
      )     

       keys = ReadShort file
       for b = 1 to keys do
       (
       key = addNewKey controller 1000f
           
      --    key.inTangentType = #custom
      --    key.outTangentType = #custom
       inTangent = ReadFloat file
       inTangentLength = ReadFloat file
       outTangent = ReadFloat file
       outTangentLength = ReadFloat file
       ktime =  ReadFloat file
       value =  ReadFloat file
           
       format "[%; %; %; %; %; %]" inTangent inTangentLength outTangent outTangentLength ktime value     
       tmul = 100
      --    key.inTangent = inTangent -- / tmul     
      --    key.inTangentLength =  inTangentLength     
      --    key.outTangent = outTangent -- / tmul     
      --    key.outTangentLength =  outTangentLength
       key.time = ktime * tmul
       if maxkey<key.time then maxkey = key.time     
      case PRSType  of (
      tpos: key.value = value     
      trot: key.value = value/pi*180
      tsca: key.value = value*100     
          )       
       print key
         -- format "[%; %; %; %]\n" key.inTangent key.inTangentLength key.outTangent key.outTangentLength      

       )     
       )
      animationRange = interval 0 maxkey
)

function ReadXNode file =     
(  -- begin node
      local xtype = ReadString file     
      print xtype
          
      if (xtype=="XN") then (
        local XGroup = dummy name:"XNone" boxsize: [1,1,1]      
           return XGroup       
      )
          
      local xomname = ReadString file     
      print xomname

      matrixtype = ReadByte file
      case matrixtype of
      (
      1:(
      local trmatix = matrix3 [ReadFloat file, ReadFloat file, ReadFloat file] \
      [ReadFloat file, ReadFloat file, ReadFloat file] \
      [ReadFloat file, ReadFloat file, ReadFloat file] \
      [ReadFloat file, ReadFloat file, ReadFloat file]
      )
      2:(
      local pos = point3 (ReadFloat file) (ReadFloat file) (ReadFloat file)     
      local rot = eulerToQuat (eulerAngles (radToDeg(ReadFloat file)) (radToDeg(ReadFloat file)) (radToDeg(ReadFloat file)))     
      local size = point3 (ReadFloat file) (ReadFloat file) (ReadFloat file)     
      trmatix = (rotate (scaleMatrix size) rot) * (transMatrix pos)
      )
      )
      local a
          
      if (xtype=="GO") do (
       --    ObjectX = mesh name:xomname vertices:#() faces:#()     
        local childs = ReadShort file
         
        -- child #1
        xomnameSH = ReadString file     
        xtypeSH = ReadString file     
        ismatrixSH = ReadBool file
       ---    numfaceSH = ReadShort file      
        childsSH = ReadShort file
            
        ObjectX = (ReadXNode file)
        ObjectX.name = xomname     
            
           for a = 2 to childsSH do attach ObjectX (ReadXNode file)
            
        ObjectX.material.name = xomname + "_shader"     
        meditMaterials[XMat] = ObjectX.material
        XMat += 1     
           for a = 2 to childs do (ReadXNode file).parent = ObjectX     
            
        ObjectX.transform = trmatix     
           return ObjectX     
         )
             
         if (xtype=="BG") do (
         local childs = ReadShort file
         local XBone = bone name:xomname     
         -- child #1 BO
         for a = 2 to childs do in XBone (ReadXNode file)

         if matrixtype>0 do
           XBone.transform = trmatix      
         return XBone       
      )
          
     --    "GS"(
     --    )
         if (xtype=="SS") or (xtype=="SH") do     
      ( -- obj
      local numface = ReadShort file  -- faces
      print numface        
       local vert_array = #()
       local face_array = #()     
           
       for a = 1 to numface do     
           append face_array [(ReadShort file)+1,(ReadShort file)+1,(ReadShort file)+1]     
          
      local num = ReadShort file  -- vertex
       for a = 1 to num do     
          append vert_array [ReadFloat file, ReadFloat file, ReadFloat file]     
         
       local m = mesh name:xomname vertices:vert_array faces:face_array     
          
       isnormal = ReadBool file
       if isnormal do
       (
        for a = 1 to num do     
         (
            nvect = point3 (ReadFloat file) (ReadFloat file) (ReadFloat file)
         setNormal m a nvect         
         )
       )
            
      iscolor = ReadBool file
      if iscolor do (
            for a = 1 to num do     
        (
        clr = ReadColor file
         meshop.setVertColor m 0 a clr
       --    format "%. %\n" a clr
        )     
       --    m.showVertexColors true
        )

      istextcoord = ReadBool file
      if istextcoord do      
      (
       --set UV
       setNumTVerts m num
       for i = 1 to num do (setTVert m i [(ReadFloat file),(ReadFloat file),0])
       buildTVFaces m false
       for i = 1 to numface do (setTVFace m i face_array [i])     
      )      
      ismat = ReadBool file
      if ismat then
       (
       newmat = Standardmaterial name: (ReadString file)
       newmat.adTextureLock = off
       newmat.ambient = ReadColor file
       newmat.diffuse = ReadColor file
       newmat.specular = ReadColor file
       newmat.specularLevel = 100
       newmat.useSelfIllumColor = on
       newmat.selfIllumColor = ReadColor file
       -- twoSided                    
       )
      else
       (
       newmat = Standardmaterial prefix:"XMaterial"     
       newmat.diffuse = color 255 255 255
       )
          
      newmat.diffuseMap = RGB_Multiply ()
          
      istexture = ReadBool file     
      if istexture do
       (
       textname = (getFilenamePath FileName) + ReadString file     
         --  textname = ReadString file     
       newmat.diffuseMap.map1 = Bitmaptexture fileName:textname
       if newmat.diffuseMap.map1.alphasource == 0 do     
        (
        newmat.opacityMap = Bitmaptexture fileName:textname
        newmat.opacityMap.monoOutput = 1
        newmat.twoSided = on
        )
       )
           
      if iscolor do (     
       newmat.diffuseMap.map2 = Vertex_Color ()
       if (getVertColor m 1) == black do     
         newmat.diffuseMap.map2Enabled = off
       )
           
      showTextureMap newmat on     
      m.material = newmat
          
      if (xtype == "SS") do (
          
       theSkin = Skin()
       Max Modify Mode
       modPanel.setCurrentObject m
       addModifier m theSkin
           
       local k = ReadShort file  -- bones
       for a = 1 to k do (
             boneobj = getNodeByName (ReadString file)
         print boneobj
         skinOps.addbone theSkin boneobj 1
         )
       completeRedraw ()
       for a = 1 to num do      
         for b = 1 to k do     
          skinOps.SetVertexWeights theSkin a b (ReadFloat file)

       )
           
       return m
      )      
      if (xtype == "SK") do       
      ( -- skin
         local childs = ReadShort file
         local XGroup = dummy name:xomname boxsize: [1,1,1]      
         XBone = bone name:"XBones"
         in XBone (ReadXNode file)
         XBone.parent = XGroup
         for a = 2 to childs do     
        (ReadXNode file).parent = XGroup     
         if matrixtype>0  do
           XGroup.transform = trmatix      
         return XGroup       
      )             
      ( -- group
         local childs = ReadShort file
         local XGroup = dummy name:xomname boxsize: [1,1,1]      

       if childs >0 do
         for a = 1 to childs do     
           (
        obj = ReadXNode file
        --if (classOf obj) != bone do     
        obj.parent = XGroup     
        )
         if matrixtype>0  do
           XGroup.transform = trmatix      
         return XGroup     
      )     
         
          
)    -- end node

function WriteXNode file node =     
(  -- begin node

      WriteString file node.name
      print node.name
      WriteMatrix file (node.transform * ( inverse node.parent.transform ))

      local a
      local numface -- faces
      if  ((classOf node) == Editable_Mesh) then     
       (
        numface = node.numfaces
        local mesh = node
       )
       else
       (
        numface = 0
       )
           
      WriteShort file numface     
      print numface
      if numface>0 then
      ( -- obj

       for a = 1 to numface do
            (
               f = (GetFace mesh a) - [1, 1, 1]
               WriteShort file (f.x as Integer)
               WriteShort file (f.y as Integer)
               WriteShort file (f.z as Integer)
            )
          
      local num = mesh.numverts
        WriteShort file num -- vertex
            
      worldTM = mesh.transform
      InvWorldTM = inverse worldTM
          
       for a = 1 to num do
          (
          vert = (GetVert mesh a)*InvWorldTM
          WriteVector file vert         
          )
         
      --    isnormal = ReadBool file ??
      WriteByte file 1
     --    if isnormal do
       for a = 1 to num do
        (
        vert = (GetNormal mesh a) --*InvWorldTM
           WriteVector file vert     
        )
            
      iscolor = (mesh.material.diffuseMap.map2 != undefined)
          
      if iscolor then (
       WriteByte file 1
       for a = 1 to num do     
        (
        clr = getVertColor mesh a     
         WriteColor file clr
       --    format "%. %\n" a clr
        )     
                
        --WriteColor2 file (meshop.getVDataValue mesh 0 a)     
        --WriteColor2 file (meshop.getMapVert mesh 0 a)     
      ) else WriteByte file 0

       istextcoord = (mesh.material.diffuseMap.map1 != undefined)
         
      if istextcoord then     
      (
       WriteByte file 1
      for a = 1 to num do (
       t = (GetTVert mesh a)       
                WriteFloat file t.x
                WriteFloat file t.y  --(1 - t.y)   -- отображаем координату по Y
       )
      ) else WriteByte file 0
          
      ismat = (mesh.material != undefined)
      if ismat then
       (
       WriteByte file 1     
       WriteString file mesh.material.name
       WriteColor file mesh.material.ambient
       WriteColor file mesh.material.diffuse
       WriteColor file mesh.material.specular
       WriteColor file mesh.material.selfIllumColor
       )
       else
       (
       WriteByte file 0     
       )
          
      istexture = (mesh.material.diffuseMap.map1 != undefined)

      if istexture then
       (
       WriteByte file 1     
       textname = mesh.material.diffuseMap.map1.fileName
       WriteString file (filenameFromPath textname)     
       ) else WriteByte file 0     
           
      )     
      else
      ( -- group
            
       local childs = node.children.count     
       WriteShort file childs
           
       if childs >0 do
       for a = 1 to childs do
        WriteXNode file node.children[a]

      )       
          
)    -- end node

rollout XomRollout "Xom 3D Model Loader" width:179 height:224
(
     button btn2 "Open *.xom3d" pos:[38,50] width:88 height:36
     label lbl1 "Xom 3D Model Loader v.1.2" pos:[16,10] width:138 height:17
     label lbl2 "AlexBond (c) 2009" pos:[33,26] width:88 height:16
     button btn5 "X" pos:[125,26] width:19 height:15
     button btn3 "Save *.xom3d" pos:[37,93] width:88 height:36
     label lbl3 "Xom Animate Loader v.1.0" pos:[24,155] width:128 height:17
     button btn4 "Open *.xac" pos:[37,175] width:88 height:36
     on btn2 pressed do
     (
      FileName = GetOpenFileName types:"Xom 3DModel (*.xom3d)|*.xom3D"
      if (FileName != undefined) do
      (
      file = fopen FileName "rb"     

      FileType = ReadString file
      if FileType == "X3D" then
       (
       XMat = 1
       XGroup = dummy name:"Xom3DModel" boxsize: [1,1,1]         
       trmatix = matrix3 [1, 0, 0] [0, 0, 1] [0, 1, 0] [0, 0, 0]       
       (ReadXNode file).parent = XGroup     
       XGroup.transform = trmatix
       select XGroup     
       )     
       else
       (
       messageBox "Bad Xom3DModel format!!!"     
       )
           
      max tool zoomextents all
      fclose file
      )
     )
     on btn5 pressed do
      removeRollout XomRollout
     on btn3 pressed do
     (
      if ((classOf $)== Dummy)and($.name == "Xom3DModel") then (
       FileName = GetSaveFileName types:"Xom 3DModel (*.xom3d)|*.xom3D"
       if (FileName != undefined) do
       (
        file = fopen FileName "wb"     
           WriteXNode file $.children[1]
        fclose file
       )
      )     
      else
      (
       messageBox "You should select Xom3DModel for save!!!"     
      )
     )
     on btn4 pressed do
     (
      FileName = GetOpenFileName types:"Xom Anim Clip (*.xac)|*.xac"
      if (FileName != undefined) do
      (
      file = fopen FileName "rb"     
         LoadXAnim file
      fclose file
      )
     )
)addRollout XomRollout

Принципиальные отличия форматов Xom3D v1.2 и Xom3D v1.1 можно видеть на рисунке:

Составные объекты теперь склеены воедино.

Прикрепления: 5804656.png (5.7 Kb)


 
Unaited
Админы
Сообщений: 1463
Реп: 92 / Инв: 13
а сможешь для Wings 3D сделать плагин для импорта ХОМ3D

 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Я посмотрел исходники Wings3D так и не разобрался... это надо сначала выучить язык программирования Erlang

Вот кое что нашел тут http://chronosphere.home.comcast.net/~chronosphere/tut-wings-shell.htm

Code
f(),
ObjExport = fun (Verts, Faces, FileName) ->
     case (FileName==none) of
         true -> IoDevice = standard_io;
         false -> {ok, IoDevice} = file:open(FileName, write)
     end,
     PrintVert = fun(Vertex) ->
         {X,Y,Z} = Vertex,
         io:fwrite(IoDevice, "v ~9f ~9f ~9f\n", [X,Y,Z]) end,
     PrintIdx = fun(Index) ->
         io:fwrite(IoDevice, " ~w", [Index+1]) end,
     PrintFace = fun(Face) ->
         io:put_chars(IoDevice, "f"),
         lists:foreach(PrintIdx, Face),
         io:put_chars(IoDevice, "\n") end,
     io:fwrite(IoDevice, "# NumVerts: ~p\n", [length(Verts)]),
     io:fwrite(IoDevice, "# NumFaces: ~p\n", [length(Faces)]),
     io:fwrite(IoDevice, "g Mesh\n", []),
     lists:foreach(PrintVert, Verts),
     lists:foreach(PrintFace, Faces),
     file:close(IoDevice)
     end,
rr(wings),
St = wpa:get_state(),
#st{shapes=Shapes} = St,
We = gb_trees:get(1, St#st.shapes),
Vs = array:sparse_to_list(We#we.vp),
Fs = gb_trees:keys(We#we.fs),
Raw = [wings_face:vertex_positions(Face, We) || Face <- Fs],
{Vs2, Fs2} = e3d_util:raw_to_indexed(Raw),
ObjExport(Vs2, Fs2, none).

Если разберусь что это и как это, может что и будет. Но скорого результата не ждите...


 
Unaited
Админы
Сообщений: 1463
Реп: 92 / Инв: 13
как успехи?

 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Один экзамен сдал, и один зачет 6
Сегодня приеду домой возьмусь за прогу 10


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Блин как же у меня все запущено...

Игра загружает контейнеры - 1 декодер
Строится дерево - 2 декодер
Выделяется объект - 3 декодер
Проигрывается анимация - 4 декодер...

Надо как-то все переорганизовать.

Нужен Герыч или другой Программер, кто подскажет верный путь...

Задача такова:
1. Загружаются строки и контейнеры, но не их скелеты, все контейнеры делятся на блоки в памяти
2. Строиться дерево по всем загруженным контейнерам, декодируя блоки для получения ссылок ветвей
3. (когда выделяется запись)Строиться Дерево отображения, декодируются блоки в мою структуру TMesh для 3D объектов....

Проблема:
Я три раза делаю одно и тоже, т.е. в памяти XomView не создает структуру объекта, а лишь отображает куски его....
Выход?


 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
нечто вроде кэширования.

________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
Поиск: