W4AnimEditor or W3DAnimEditor... Создадим?
|
|
Сообщений: 1463
|
Опубликовано: 17.01.2011, 11:22:50
и может быть сделать встроенный нормальный импортер/экспортер моделей (особенно те, которые состоят из нескольких объектов) в 3дс, хотя бы только моделей, с текстурами проблем не будет будет очень полезно при редактировании фона в главном меню так можно графику в игре до основания поменять
Сообщение отредактировал Unaited_Ru - ПН, 17.01.2011, 11:56:58
|
|
|
|
Сообщений: 1042
|
Опубликовано: 17.01.2011, 18:46:51
3DS формат плох тем что в нем нету нормалей, а писать генератор нормалей мне лень... Да и групп в 3DS нет, а без групп никак не организовать структуру Xom3D файла... Да и смысл пообъектно вставлять? Могу лишь создать нормальный Xom3D формат с плагинами для всех известных 3D редакторов (если свои плагины там поддерживаются), если хотите =)
|
|
|
|
Сообщений: 1897
|
Опубликовано: 17.01.2011, 18:54:41
давай!
|
|
|
|
Сообщений: 564
|
Опубликовано: 17.01.2011, 18:54:45
AlexBond, Да!!!
|
|
|
|
Сообщений: 1463
|
Опубликовано: 17.01.2011, 19:22:58
AlexBond, для всех не надо думаю только для 3DS Max, Blender, Maya, Wings 3D. не знаю какие редакторы ещё используют в моделировании Worms 4
Сообщение отредактировал Unaited_Ru - ПН, 17.01.2011, 21:15:38
|
|
|
|
Сообщений: 1099
|
Опубликовано: 17.01.2011, 19:41:10
А мы все ближе и ближе... кстати... W4AnimEdit... Хех, Это название еще я предлагал.
|
|
|
|
|
Сообщений: 1463
|
Опубликовано: 17.01.2011, 21:55:59
интересно сколько времени ждать этой проги если разделить на: -обсуждение -написание самой проги -тесты
|
|
|
|
Сообщений: 1042
|
Опубликовано: 17.01.2011, 23:12:33
+ добавь время которое AlexBond будт сдавать сессию.... + лень AlexBond'a Только что тестировал Xom3D для объектов с костями в 3DSMAX Пока лишь работает в одну сторону
|
|
|
|
Сообщений: 2848
|
Опубликовано: 17.01.2011, 23:16:15
Quote (AlexBond) Пока лишь работает в одну сторону в какую? кстати, прикольный крокодил, можно вместо старушки поставить
------------------------------------------------------------- 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. И да, я больше не модер, поэтому не надо писать мне тонны лс с просьбами кого-либо забанить. И еще: черви меня не интересуют. Совсем. Поэтому, даже не напоминайте мне про них - вызовете большой БУГУРТ.
|
|
|
|
Сообщений: 1463
|
Опубликовано: 17.01.2011, 23:37:44
а если импортер/экспортер OBJ
|
|
|
|
Сообщений: 523
|
Опубликовано: 18.01.2011, 00:17:20
Laser =). Ho ho ho.
|
|
|
|
Сообщений: 1042
|
Опубликовано: 18.01.2011, 00:56:34
Quote (rocketvadim) в какую? В Экспорт... Obj... Ну не знаю, мне Obj не нравится, там слишком мало функций, нету матриц трансформации, групп и относительного позиционирования...
|
|
|
|
Сообщений: 1042
|
Опубликовано: 19.01.2011, 02:10:55
Прикрепляю файлик скрипта 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 можно видеть на рисунке: Составные объекты теперь склеены воедино.
|
|
|
|
Сообщений: 1463
|
Опубликовано: 19.01.2011, 17:37:05
а сможешь для Wings 3D сделать плагин для импорта ХОМ3D
|
|
|
|
Сообщений: 1042
|
Опубликовано: 19.01.2011, 19:09:25
Я посмотрел исходники 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). Если разберусь что это и как это, может что и будет. Но скорого результата не ждите...
|
|
|
|
Сообщений: 1463
|
Опубликовано: 25.01.2011, 15:52:01
как успехи?
|
|
|
|
Сообщений: 1042
|
Опубликовано: 26.01.2011, 12:29:53
Один экзамен сдал, и один зачет Сегодня приеду домой возьмусь за прогу
|
|
|
|
Сообщений: 1042
|
Опубликовано: 26.01.2011, 22:20:47
Блин как же у меня все запущено... Игра загружает контейнеры - 1 декодер Строится дерево - 2 декодер Выделяется объект - 3 декодер Проигрывается анимация - 4 декодер... Надо как-то все переорганизовать. Нужен Герыч или другой Программер, кто подскажет верный путь... Задача такова: 1. Загружаются строки и контейнеры, но не их скелеты, все контейнеры делятся на блоки в памяти 2. Строиться дерево по всем загруженным контейнерам, декодируя блоки для получения ссылок ветвей 3. (когда выделяется запись)Строиться Дерево отображения, декодируются блоки в мою структуру TMesh для 3D объектов.... Проблема: Я три раза делаю одно и тоже, т.е. в памяти XomView не создает структуру объекта, а лишь отображает куски его.... Выход?
|
|
|
|
Сообщений: 1240
|
Опубликовано: 26.01.2011, 22:28:28
нечто вроде кэширования.
________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
|
|
|
|