W4AnimEditor or W3DAnimEditor... Создадим? - Страница 3 - Форум
W4Tweaks
Меню сайта
Последние файлы
Последние темы


Вход



Мини-чат
 
500

Статистика
Онлайн:

Сегодня заходили: firsacho, Joker, KaMiKaZe, 4erveR, Unaited, TheKing97, Renny, ivan210303mitenkov


Друзья сайта

Если вы хотите увидеть в этом спиcке свой сайт загляните сюда

Наш баннер:



· Регистрация · Вход
[ Новые сообщения · Участники · Подписки · Поиск · RSS ]
Страница 3 из 14«123451314»
Форум » Worms 4 Mayhem » 4.3. Ваши идеи по моделированию » W4AnimEditor or W3DAnimEditor... Создадим? (Собираю всю информацию по анимации, для создания программы..)
W4AnimEditor or W3DAnimEditor... Создадим?
Unaited
Дата: ПН, 17.01.2011, 23:37:44 | Сообщение # 31
Unaited
Be Evil
Группа: Админы
Сообщений: 1342
Репутация: 91
Статус: Online
а если импортер/экспортер OBJ 6

 
Woitek
Дата: ВТ, 18.01.2011, 00:17:20 | Сообщение # 32
Woitek
Его узнают в чате
Группа: Проверенные
Сообщений: 521
Репутация: 56
Статус: Offline
Laser =). Ho ho ho.
 
AlexBond
Дата: ВТ, 18.01.2011, 00:56:34 | Сообщение # 33
AlexBond
Легендарный червь
Группа: Админы
Сообщений: 1029
Репутация: 105
Статус: Offline
Quote (rocketvadim)
в какую?

В Экспорт...

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


 
AlexBond
Дата: СР, 19.01.2011, 02:10:55 | Сообщение # 34
AlexBond
Легендарный червь
Группа: Админы
Сообщений: 1029
Репутация: 105
Статус: Offline
Прикрепляю файлик скрипта 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(6Kb)


 
Unaited
Дата: СР, 19.01.2011, 17:37:05 | Сообщение # 35
Unaited
Be Evil
Группа: Админы
Сообщений: 1342
Репутация: 91
Статус: Online
а сможешь для Wings 3D сделать плагин для импорта ХОМ3D

 
AlexBond
Дата: СР, 19.01.2011, 19:09:25 | Сообщение # 36
AlexBond
Легендарный червь
Группа: Админы
Сообщений: 1029
Репутация: 105
Статус: Offline
Я посмотрел исходники 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
Дата: ВТ, 25.01.2011, 15:52:01 | Сообщение # 37
Unaited
Be Evil
Группа: Админы
Сообщений: 1342
Репутация: 91
Статус: Online
как успехи?

 
AlexBond
Дата: СР, 26.01.2011, 12:29:53 | Сообщение # 38
AlexBond
Легендарный червь
Группа: Админы
Сообщений: 1029
Репутация: 105
Статус: Offline
Один экзамен сдал, и один зачет 6
Сегодня приеду домой возьмусь за прогу 10


 
AlexBond
Дата: СР, 26.01.2011, 22:20:47 | Сообщение # 39
AlexBond
Легендарный червь
Группа: Админы
Сообщений: 1029
Репутация: 105
Статус: Offline
Блин как же у меня все запущено...

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

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

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

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

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


 
Герыч
Дата: СР, 26.01.2011, 22:28:28 | Сообщение # 40
Герыч
Админ
Группа: Админы
Сообщений: 1240
Репутация: 60
Статус: Offline
нечто вроде кэширования.

________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Дата: СР, 26.01.2011, 22:52:22 | Сообщение # 41
AlexBond
Легендарный червь
Группа: Админы
Сообщений: 1029
Репутация: 105
Статус: Offline
Но что хранить в кэше?

Может создать что-то типа Xom объекта с кучей типов... но проблема в том что не все типы декодированы...
Когда я делал W3DMapEditor я создавал класс Xom объекта, и к нему лишь добавлял свойства для отображения, сохранения и т.п.

У меня и так кэш памяти как бы. Но нужно чтобы был Кэш раскодированной памяти. Которую нужно лишь обработать и вывести.


 
AlexBond
Дата: СР, 26.01.2011, 23:28:58 | Сообщение # 42
AlexBond
Легендарный червь
Группа: Админы
Сообщений: 1029
Репутация: 105
Статус: Offline
Желательно создать класс Xom, который будет иметь кучу подклассов, и одну функцию сохранения, учитывающую индекс всех строк, это позволит менять названия объектов, и таблицу строк, при условии что все индексы раскодированы.

 
Герыч
Дата: СР, 26.01.2011, 23:46:31 | Сообщение # 43
Герыч
Админ
Группа: Админы
Сообщений: 1240
Репутация: 60
Статус: Offline
Ты очень плохо формулируешь, что хочешь узнать =)

________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Дата: СР, 26.01.2011, 23:51:49 | Сообщение # 44
AlexBond
Легендарный червь
Группа: Админы
Сообщений: 1029
Репутация: 105
Статус: Offline
Хочу узнать как организовать данные, которые считываются с Xom формата, чтобы удобно было ими пользоваться?

 
Герыч
Дата: ЧТ, 27.01.2011, 00:02:06 | Сообщение # 45
Герыч
Админ
Группа: Админы
Сообщений: 1240
Репутация: 60
Статус: Offline
Можно выстроить при считывании xom файла дерево из объектов, но данные оставлять в файле.
Каждый объект связывать со смещением в файле или ещё какой-нито инфой.
При изменении объекта в редакторе связь объекта дерева с точкой в файле рушится (то есть все данные подгружаются и ты начинаешь работать с ними в памяти). При добавлении нового объекта происходит создание отвязанного от файла объекта.


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
Форум » Worms 4 Mayhem » 4.3. Ваши идеи по моделированию » W4AnimEditor or W3DAnimEditor... Создадим? (Собираю всю информацию по анимации, для создания программы..)
Страница 3 из 14«123451314»
Поиск:

Copyright W4Tweaks™ 2008-2016 Хостинг от uCoz