Результаты поиска
|
|
Сообщений: 1042
|
Опубликовано: 18.01.2011, 14:36:47
Нафига тебе модель трогать? Цвет червя это Ximage картинка!!! Текстура!
|
|
|
|
Сообщений: 1042
|
Опубликовано: 18.01.2011, 23:00:23
Все должны с чего-то начинать.
|
|
|
|
Сообщений: 1042
|
Опубликовано: 19.01.2011, 01:55:06
Ну вы ребят даёте... Сейчас я вам отвечу =) Quote (Unaited_Ru) хм... могут если червь отравлен или пришелец но ведь модели рук заменяются то должно заменятся и тело червя только как? Модели рук не заменяются, руки подлежат анимации, анимация это обязательно кости (XBone) с прописанными весомыми привязками по вершинам (Vertex). Т.е. если мы хотим заменить анимированую модель, мы должны заменяя модель, также заменить ее skin, определяемый XWeightSet, где для каждой точки (Vertex) модели имеется коэффициент привязки ко ВСЕМ костям!!! Красят червя в зеленый цвет простой сменой освещения. Изменить цвет червя можно так же при помощи XColor4ubSet в которой содержатся цвета для каждой точки (vertex) модели. Кстати так небо красится =) Quote (Unaited_Ru) Alex826, руки не содержат анимации, они заменяют стандартные и прикрепляются к скелету червя что содержит их анимацию Войтек руки изменял Как раз каждая модель в папке Character c именем Hand имеет полный скелет и skin с XWeightSet, поэтому заменить ее можно лишь соблюдая этот параметр. Quote (Unaited_Ru) а когда червяк отравлен то он становится зеленым, что воздействует на шкуру? -это графический ТГА, который натягивается на червя -это ХОМ файл содержащий анимацию перекраски в зеленый цвет -этот цвет прописан в твиках или скриптах что из этого правильнее? Это цвет освещения который прописан в скриптах. Где хранятся эти цвета и как их врубать динамически я не знаю, не копал.
|
|
|
|
Сообщений: 1042
|
Опубликовано: 19.01.2011, 02:04:23
Думаешь у меня небыло таких Умников на сайте? =) И какие они карты делали... ЖУТЬ ПРОСТО. Но в картах этих были ИДЕИ!!! И не плохие, я их все (почти) использовал при создании PNM правда пришлось доводить до ума все карты, т.е. делать Капитальный Ремейк =) Зато какие результаты!!!
|
|
|
|
Сообщений: 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 можно видеть на рисунке: Составные объекты теперь склеены воедино.
|
|
|
|
Сообщений: 1042
|
Опубликовано: 19.01.2011, 10:14:15
Сначала объясни что ты хочешь, и зачем тебе скин червя в одежду? Ты что вместо шапки тело червя вставишь? Если ты имеешь в виду создание своих Рук (Перчаток), то вообще реализуемо вместо них вставлять Полноценную одежду, которая будет не тупо висеть, а двигаться вместе с червём, изгибаясь вместе с ним. Можно сделать к примеру Рубашку, Костюм, Галстук, даже Доспехи =) Правда для всего этого нужен 3DSMAX и правильный импорт-экспорт 3D модели с костями, что тоже в будущем я сделаю. Итак замена одежды будет выглядить так: 1. это выбрать шаблонные руки. 2. экспортировать их в формат Xom3D 3. открыть в 3DSMAX полученный Xom3D 4. Вставить 3D Модель на скелет 5. Применить SKIN, т.е. привязку костей к 3D модели 6. Экспортировать полученное в Xom3D из 3DSMAX 7. Импортировать в XomView, заменив модель. А если у меня получиться создать все это =) То можно будет и Самого червя менять!!!, правда менять можно будет лишь на подходящую модель, которую можно связать со скелетом. Вообще в Идеале Можно заменить и сам Скелет Червя, НО надо при этом заменить ВСЮ Анимацию и ВСЕ руки и ВСЕ оружие на новый скелет, что никто делать не будет И это уже будут не черви
|
|
|
|
Сообщений: 1042
|
Опубликовано: 19.01.2011, 10:31:17
firsacho, а в этом плане, т.е. он к примеру хочет кожу менять для определенных червей? Ну это движком не поддерживается... Движок загружает лишь одну модель w4worm.xom. Поэтому это нереально. А то что ты предложил, вполне реально, но я в этом не помогу, у меня и так голова другим занята
|
|
|
|
Сообщений: 1042
|
Опубликовано: 19.01.2011, 10:34:47
Хотя.... Если делать описаным мной выше способом, то можно натянуть кожу поверх той что есть, сделав ее чуть больше, чтобы оригинальная кожа была под ней, НО!!! будут глюки, при анимации кожа будет гнуться и нижний слой в местах перегибах будет выступать... Поэтому идея отбрасывается.
|
|
|
|
Сообщений: 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). Если разберусь что это и как это, может что и будет. Но скорого результата не ждите...
|
|
|
|
Сообщений: 1042
|
Опубликовано: 21.01.2011, 09:26:29
Quote (Lex-Serest) Тут нам придется расшифровывать принцип работы GameSpy. GameSpy работает лишь с некоторыми не шифрованными данными остальные посылает пакетами. Я когда делал робота по сбору статистики gamespy то считывал с сервера Название игры, комнату, количество игроков, версию игры и IP адрес хостера. http://worms3d-portal.com/portal.php?topic_id=1014 По поводу как это работает можно прочесть тут: http://aluigi.altervista.org/papers.htm#gslist http://en.wikipedia.org/wiki/Gslist Но врятли для осуществления твоего плана нужна эта инфа.
|
|
|
|
Сообщений: 1042
|
Опубликовано: 23.01.2011, 15:35:40
Quote (rocketvadim) программистов у нас действительно мало. Главное что они есть
|
|
|
|
Сообщений: 1042
|
Опубликовано: 24.01.2011, 12:58:04
Кто займется написанием проги? =)
|
|
|
|
Сообщений: 1042
|
Опубликовано: 24.01.2011, 20:10:13
Quote (firsacho) "Add more free space in music because then easier did replay for music" -там написано. Дословно: добавьте больше свободного места в музыку, потому чтогда проще сделать переигрывание музыки. Я у него спросил, он разъяснил, получим перевод (который он имел в виду): "Добавляйте больше времени для музыки, чтобы получить паузу между реплеем"
|
|
|
|
Сообщений: 1042
|
Опубликовано: 24.01.2011, 20:30:05
Quote (firsacho) 4 - Время для звука от точки 1. Равное 06. (хз как понять =) прим. пер.) 5 - Время звучания в секундах [if point 1. is 02 and 6. is 00] Максимальное время звучания: 4:25 (FF в 16й СС = 255 в 10й, 255/60=4,25) Уточненный перевод: 4 - время для типа музыки, если тип 1 = 06 иначе не используется 5 - время для типа звуков, в секундах, если тип 1 = 02 иначе не используется. Максимальное время звучания 4:25 или 255 секунд.
|
|
|
|
Сообщений: 1042
|
Опубликовано: 26.01.2011, 12:29:53
Один экзамен сдал, и один зачет Сегодня приеду домой возьмусь за прогу
|
|
|
|
Сообщений: 1042
|
Опубликовано: 26.01.2011, 22:20:47
Блин как же у меня все запущено... Игра загружает контейнеры - 1 декодер Строится дерево - 2 декодер Выделяется объект - 3 декодер Проигрывается анимация - 4 декодер... Надо как-то все переорганизовать. Нужен Герыч или другой Программер, кто подскажет верный путь... Задача такова: 1. Загружаются строки и контейнеры, но не их скелеты, все контейнеры делятся на блоки в памяти 2. Строиться дерево по всем загруженным контейнерам, декодируя блоки для получения ссылок ветвей 3. (когда выделяется запись)Строиться Дерево отображения, декодируются блоки в мою структуру TMesh для 3D объектов.... Проблема: Я три раза делаю одно и тоже, т.е. в памяти XomView не создает структуру объекта, а лишь отображает куски его.... Выход?
|
|
|
|
Сообщений: 1042
|
Опубликовано: 26.01.2011, 22:52:22
Но что хранить в кэше? Может создать что-то типа Xom объекта с кучей типов... но проблема в том что не все типы декодированы... Когда я делал W3DMapEditor я создавал класс Xom объекта, и к нему лишь добавлял свойства для отображения, сохранения и т.п. У меня и так кэш памяти как бы. Но нужно чтобы был Кэш раскодированной памяти. Которую нужно лишь обработать и вывести.
|
|
|
|
Сообщений: 1042
|
Опубликовано: 26.01.2011, 23:28:58
Желательно создать класс Xom, который будет иметь кучу подклассов, и одну функцию сохранения, учитывающую индекс всех строк, это позволит менять названия объектов, и таблицу строк, при условии что все индексы раскодированы.
|
|
|
|
Сообщений: 1042
|
Опубликовано: 26.01.2011, 23:51:49
Хочу узнать как организовать данные, которые считываются с Xom формата, чтобы удобно было ими пользоваться?
|
|
|
|
Сообщений: 1042
|
Опубликовано: 27.01.2011, 00:17:00
У меня так и есть... я загружаю файл в память и даю на него ссылки.... Только это не решает проблем TConteiner = record point: Pointer; // ссылка на точку в памяти size: Integer; // размер контейнера Update: Boolean; // обновлен CTNR: Boolean; // имеет заголовок Xtype: XTypes; // тип контейнера end; XConteiners = array of TConteiner; Я создал классы: TMesh = class TAnimClip = class Но они у меня не постоянны, а создаются при выделении определенного контейнера, что неудобно, т.к. приходится каждый раз преобразовывать инфу. Да и запутаться можно в этих классах, когда одно "почти" дерево из XConteiners сплетается с деревом TMesh которое содержит в себе TAnimClip В общем надо порядок, и организация, но вот какая?
|
|
|
|