[WARNING: this tutorial is just a quick mockup, and isn't 100% complete]
Hello everybody!
I'm mariokart64n, I've been doing texture and model hacks\mods for the past 5 years.
admitlying I wasn't good at using paintshop or 3dsmax, until 2 years ago.. it took 3 years! just to get the hang of it. so that being said, this topic is a guide geared towards the elite modders, you should already have a good grasp of how to navigate and use 3dsmax, and any sort of 2D editor, such as Adobe's Photoshop.
if you are new to 3dsmax, and never used a 3D editor in the past, or have no concept of what HEX is.. then this is the wrong guide for you. please refer to KC-MM's video on vert hacking, to get an idea oh what we are doing here.
#Invalid YouTube Link#
Otherwise, lets get this show on the road!...
Overview:
Basically we'll be taking the basic technique of the above video and improving apon the procedure to give us more control over how we edit.
by using the aid of 2 other apps, we can now create full body edits, like never before!
Below are the basic steps of what you'll be doing. please read them before watching the 2hour Video Tutorial.
Outline:
1. import the DAE from AIS
2. Edit whatever you want
2B under the conditions I stated before
..dont add delete.. change to poly
3. once you are ready to export back, you need to create a patch
4 create a patch by starting a new scene in max
5 import the DAE again
6 highlight the mesh you were working on before and click "create patch" on my script it'll prompt you to open the vertset
export the vert set as usually as per the old DDVB tut
so it'll be named vertex.ddf
a patch will be made ( this is a difference file ) to help roughly push most of the verts where they need to be
7 then just open you edited max scene, highlight your edit mesh, click patch on my maxscript to apply the patch
8 model should now cluster back into a raw
but it wont be 100% right
follow the end part of the DDVB tut
you'll need to use some trial and error to fix the not working spots
if you want, here is a theory video, talking about only the basic steps, which are stated above
#Invalid YouTube Link#
Frequently Asked Questions:
[-UnderConstruction-]
Video Guide:
Please be aware half way through the video I lost all my data. I tried to finish the end of it, but it was 1AM in the morning. after rewatching it, my speech is really splurd lol anyway I apologize and if you need further clarification, I'll be glad to help.
YOU CAN FIND THE FILES AND DOWNLOADS AT THE END OF THIS POST
Vishkugeta Did a very excellent written guide on the process you might want to read it over, its sure to be more comprehensive then my videos.
Alternatively Miacis Kusanagi has also created a text based guide. check that out if you still need guidance.
http://forums.kc-mm.com/index.php?topic=13061.msg209472#msg209472
Video Tutorials
#Invalid YouTube Link#
#Invalid YouTube Link#
#Invalid YouTube Link#
#Invalid YouTube Link#
#Invalid YouTube Link#
#Invalid YouTube Link#
#Invalid YouTube Link#
#Invalid YouTube Link#
#Invalid YouTube Link#
#Invalid YouTube Link#
#Invalid YouTube Link#
#Invalid YouTube Link#
#Invalid YouTube Link#
... alright, have fun with that..
History(Optional Read)
Ok, AIS is the only other "functional" brawl converter. you can use this instead of that whack DDVB method of going through animator to get your 3ds file
AIS however was built on free collada, now no longer in exsistance.. although google for MaxCollada, it's probably still floating around. but unlikely for max2011 or 2010, or 2009 .. Personally I'm running max8
once you import the DAE "Collada" into 3dsmax, the names should match up to the names in brawlbox. so say you dumped polygon2's Vertset from brawlbox.. it'll be the exact same vert set used by the imported model from AIS. essentially brawl box and AIS are just reading the same data, therefore this data is interchnagable. by that i mean the verts, faces, and uvs.. etc etc.. I could if I wanted replace ta models skin weights, texture corrdinates etc just by exporting the off the mesh imported from AIS.
the DDVB method is crappy, and outdated. though not as difficult to do, from a modders standpoint.
my method requires more knowledge!
sucks brawl box doesnt support export import.. shame on krystal..
once you've gotten the AIS mesh is, edit it to your hearts content.. just don't delete or add anything to the model.. like faces, or vertices.. and remember. NEVER CONVERT TO EDITABLE POLY
The "real" problem is when your ready to place those new edits now back into brawl...
we just need to get that data back into a raw form, so we can re-inject using DDVB
understand that the verts that are stored in the PAC/BRRES/MDL0 are effected by positioning data, and the bone matrix that form the fully assembled mesh. its extremely hard to compensate for that, without reversing the entire model format. and besides some really hard to follow source code.. there is no format spec on the MDL0 format
anyway.. I attempted to create a maxscript to generate a polyedit modifier, that you can use in 3dsmax. and sort of roughly patch back the positioning corrdinates of the RAW vertset.
unfortunately, without reading the bones and their weight values, I cannot compensate for the matrix that would be effecting the verts.. so there is alot of trial and error that must take place in order for it to work again in brawl/ brawlbox
Conclusion:
basically my method has its pros and cons, just as the old DDVB method does
but the advantage of full figure editing is something I'm willing to wager will put me above the rest
although you could stick with the old DDVB method, only take my method and apply faces
that way you dont work with full figure, and dont have out of alignment verts
I'm basically remodeling from scratch in 3dsmax
then moving verts dozens of times until it works properly in brawlbox lol
sadly my maxscript isn't complete, and is more or less a BETA.. a very early beta.. it lacks the main function I was meaning to get to, which is direct injection. no more brawl box, or DosDonkeyVertexBox
DOWNLOADS FILES AND LINKS YOU NEED!!
http://www.megaupload.com/?d=SRO22PV1
http://cid-c59ea3c98a300f31.skydrive.live.com/self.aspx/.Public/Programs/ais0.1.3.zip
http://cid-c59ea3c98a300f31.skydrive.live.com/self.aspx/.Public/Programs/DasDonkey%20Box%20v1.0.zip
http://www.scriptspot.com/3ds-max/scripts/meshmorpher
http://www.scriptspot.com/3ds-max/scripts/conform-wrap-ms
http://update.multiverse.net/wiki/index.php/Installing_the_3ds_Max_COLLADA_Plugin
http://sourceforge.net/projects/colladamaya/files/COLLADAMax%201.4.1%20plug-ins/ColladaMax_FREE_3.05C.exe/ColladaMax_FREE_3.05C.exe/download
The Script
#Invalid YouTube Link#Code:
fn readBEshort fstream = (
short = readshort fstream #unsigned
short = bit.swapBytes short 1 2
return short
)
fn readBElong fstream = (
long = readlong fstream
long = bit.swapBytes long 1 4
long = bit.swapBytes long 2 3
return long
)
fn ReadBEfloat fstream = (
fpt=readfloat fstream
itger = bit.floatAsInt fpt
hih = bit.intashex itger
while hih.count < 8 do hih = "0" + hih
shn = (substring hih 7 2) + \
(substring hih 5 2) + \
(substring hih 3 2) + \
(substring hih 1 2)
bit.intAsFloat (bit.hexasint shn)
)
fn WriteBEFloat fnum = (
intgr = bit.floatAsInt fnum
honey = bit.intashex intgr
while honey.count < 8
do honey = "0" + honey
sign = (substring honey 7 2) + \
(substring honey 5 2) + \
(substring honey 3 2) + \
(substring honey 1 2)
xintgr=bit.intAsFloat (bit.hexasint sign)
return xintgr
)
rollout DDV "Brawl VertexHacker Tool" width:311 height:257
(
button btn1 "Import Verts" pos:[9,10] width:144 height:40
label lbl0 "-Mario_Kart64n, (Aug 11, 2010)" pos:[153,238] width:156 height:23
button btn2 "Export Verts" pos:[8,56] width:144 height:40
checkbox chk1 "Checkbox" pos:[165,59] width:14 height:13 enabled:false checked:false
label lbl1 "Save as 3DS File" pos:[182,58] width:119 height:15 enabled:false
checkbox chk2 "Checkbox" pos:[165,76] width:14 height:13 enabled:false checked:false
label lbl2 "Save As Seperate Files" pos:[182,75] width:119 height:15 enabled:false
checkbox chk3 "Checkbox" pos:[165,94] width:14 height:13 enabled:true checked:true
label lbl3 "Save Changes to MDL0" pos:[180,93] width:119 height:15
checkbox chk4 "Checkbox" pos:[165,112] width:14 height:13 enabled:true checked:true
label lbl4 "Read Offset from File" pos:[180,111] width:119 height:15
editText edt1 " MDL0 Offset:" pos:[162,129] width:130 height:16
groupBox grp1 "Export Options" pos:[157,7] width:143 height:147
radioButtons rdo1 "" pos:[165,21] width:147 height:32 labels:#("Vertices", "Texture Corrdinates") default:1 columns:1
button btn3 "Create" pos:[15,138] width:60 height:30
button btn4 "Patch" pos:[81,138] width:60 height:30
label lbl8 "Don't Use EditPoly" pos:[31,119] width:119 height:15 enabled:false
groupBox grp3 "Patching Options" pos:[7,101] width:143 height:76
checkbox chk8 "Checkbox" pos:[15,120] width:14 height:13 enabled:false checked:false
button btn5 "Fix AiS Import" pos:[165,205] width:128 height:25
groupBox grp2 "AiS Fixing Options" pos:[155,154] width:143 height:79
checkbox chk5 "Checkbox" pos:[166,173] width:14 height:13 enabled:true checked:false
label lbl5 "Selected Only" pos:[182,172] width:111 height:15 enabled:true
checkbox chk6 "Checkbox" pos:[167,189] width:14 height:13 checked:true
label lbl6 "Scale" pos:[183,188] width:44 height:15
checkbox chk7 "Checkbox" pos:[222,189] width:14 height:13 enabled:false checked:true
label lbl7 "Rotate" pos:[239,188] width:44 height:15
button btn6 "Import" pos:[14,198] width:60 height:30 enabled:false
button btn7 "Export" pos:[80,198] width:60 height:30 enabled:false
groupBox grp4 "VertexWeighting" pos:[6,180] width:143 height:72 enabled:false
label lbl9 "Dump to LogFile" pos:[38,232] width:105 height:15 enabled:false
checkbox chk9 "Checkbox" pos:[22,233] width:14 height:13 enabled:false checked:false
local typedOffset=""
on edt1 entered txt do(
if txt != "" do(
typedOffset=txt as float
if typedOffset==undefined do(
typedOffset=0
messageBox "Error: User Input \n Value Cannot be Identified \n as either a dec or hex number"
)
if typedOffset<=0 do(
typedOffset=typedOffset*-1
)
local typedOffset
)
)
on btn1 pressed do(
fsource = GetOpenFileName \
caption:"Brawl Vert Import" types: \
"All files (*.*)|*.*|"
if fsource!=undefined do(
f= fopen fsource "rb"
fpath= getFilenamePath fsource
fname = getFilenameFile fsource
vertArray=#()
uvwArray=#()
faceArray=#()
fSize=readBElong f
mdlOffset=readBElong f
dataOffset=readBElong f
strOffset=readBElong f
vertID=readBElong f
vUkn1=readBElong f --flag? is XYZ?
dataType=readBElong f
entryStride=readBEshort f
numVertices=readBEshort f
eMinX=readBEfloat f
eMinY=readBEfloat f
eMinZ=readBEfloat f
eMaxX=readBEfloat f
eMaxY=readBEfloat f
eMaxZ=readBEfloat f
pad=readBElong f
pad=readBElong f
if entryStride==12 then(
for x = 1 to numVertices do(
vX=readBEfloat f
vY=readBEfloat f
vZ=readBEfloat f
append vertArray[vX,vY,vZ]
append uvwArray[0,0,0]
)
)
else(
for x = 1 to numVertices do(
vX=readBEfloat f
vY=readBEfloat f
vZ=0
append vertArray[vX,vY,vZ]
append uvwArray[0,0,0]
)
)
msh = mesh vertices:vertArray faces:faceArray --build mesh
msh.numTVerts = vertArray.count
msh.name=fname
buildTVfaces msh
select msh
messageBox "Done !"
gc()
fclose f
)
)
on btn2 pressed do(
doVerts=chk8.checked
doUVs=rdo1.state
do3DS=chk1.checked
doDUMP=chk2.checked
doMDL=chk3.checked
doOffset=chk4.checked
if doUVs==1 do(
obj=getCurrentSelection()
obj.pos = [0,0,0]
obj.rotation = quat 0 0 0 0
local mdlSize=""
local mdlOffset=""
local numEntrtices=""
--
if doOffset==true then(
fsource = GetOpenFileName \
caption:"Select UVSet to Replace" types: \
"All files (*.*)|*.*|"
if fsource!=undefined do(
f=fopen fsource "rb"
mdlSize=readBElong f-64
mdlOffset=(readBElong f*-1)+64
dataOffset=readBElong f
strOffset=readBElong f
vertID=readBElong f
vUkn1=readBElong f --flag? is XYZ?
dataType=readBElong f
entryStride=readBEshort f
numEntrtices=readBEshort f
fclose f
)
)
else(
for g = 1 to obj.count do(
tmesh = snapshotAsMesh obj[g]
num_verts = tmesh.numverts
num_uvws = tmesh.numtverts
num_faces = tmesh.numfaces
mdlSize=(num_verts*12)+64
mdlOffset= typedOffset+64
numEntrtices=num_verts
delete tmesh
)
)
--
fsource = GetOpenFileName \
caption:"Select the MDL0 to inject to" types: \
"MDL0(*mdl0)|*.mdl0|All files (*.*)|*.*|"
if fsource!=undefined do(
fext= getFilenameType fsource
fsize= getFileSize fsource
fpath= getFilenamePath fsource
fname= getFilenameFile fsource
fclose f
--
deleteFile (fpath+fname+"_backup"+fext)
copyFile fsource (fpath+fname+"_backup"+fext)
f=fopen (fpath+fname+"_backup"+fext) "rb"
s = fopen fsource "wb"
print "ffff"
print mdlOffset
for wr = 1 to mdlOffset do(
read=readbyte f
write=writebyte s read
)
fseek f -34 #seek_cur
lenCheck=readBEshort f
fseek f 32 #seek_cur
if numEntrtices==lenCheck then(
for g = 1 to obj.count do(
tmesh = snapshotAsMesh obj[g]
num_verts = tmesh.numverts
num_uvws = tmesh.numtverts
num_faces = tmesh.numfaces
padding=((mdlSize/8)-numEntrtices)
for t = 1 to numEntrtices do(
tv=getVert tmesh t
nSwap=writeBEfloat tv[1]
write=writelong s (bit.floatasint nSwap)
nSwap=writeBEfloat tv[2]
write=writelong s (bit.floatasint nSwap)
nSwap=writeBEfloat tv[3]
write=writelong s (bit.floatasint nSwap)
)
-- for p = 1 to padding do(
-- write=writelong s 0
-- write=writelong s 0
-- )
delete tmesh
)
fseek f (mdlOffset+(numEntrtices*12)) #seek_set
for wr = 1 to (fsize-(mdlOffset+(numEntrtices*12))) do(
read=readbyte f #unsigned
write=writebyte s read
)
messageBox "DONE!"
)
else(
gc()
fclose f
fclose s
deleteFile (fpath+fname+fext)
renameFile (fpath+fname+"_backup"+fext) (fpath+fname+fext)
messageBox "ERROR! Wrong Offset?"
)
)
)
if doUVs==2 do(
obj=getCurrentSelection()
obj.pos = [0,0,0]
obj.rotation = quat 0 0 0 0
--
if doOffset==true then(
fsource = GetOpenFileName \
caption:"Select UVSet to Replace" types: \
"All files (*.*)|*.*|"
if fsource!=undefined do(
f=fopen fsource "rb"
mdlSize=readBElong f-64
mdlOffset=(readBElong f*-1)+64
dataOffset=readBElong f
strOffset=readBElong f
vertID=readBElong f
vUkn1=readBElong f --flag? is XYZ?
dataType=readBElong f
entryStride=readBEshort f
numEntrtices=readBEshort f
fclose f
)
)
else(
for g = 1 to obj.count do(
tmesh = snapshotAsMesh obj[g]
num_verts = tmesh.numverts
num_uvws = tmesh.numtverts
num_faces = tmesh.numfaces
padding=((mdlSize/8)-numEntrtices)
mdlSize=num_verts*8
mdlOffset= typedOffset+64
numEntrtices=num_verts
delete tmesh
)
)
--
fsource = GetOpenFileName \
caption:"Select the MDL0 to inject to" types: \
"MDL0(*mdl0)|*.mdl0|All files (*.*)|*.*|"
if fsource!=undefined do(
fext= getFilenameType fsource
fsize= getFileSize fsource
fpath= getFilenamePath fsource
fname= getFilenameFile fsource
fclose f
--
deleteFile (fpath+fname+"_backup"+fext)
copyFile fsource (fpath+fname+"_backup"+fext)
f=fopen (fpath+fname+"_backup"+fext) "rb"
s = fopen fsource "wb"
print "ffff"
print mdlOffset
for wr = 1 to mdlOffset do(
read=readbyte f
write=writebyte s read
)
for g = 1 to obj.count do(
tmesh = snapshotAsMesh obj[g]
num_verts = tmesh.numverts
num_uvws = tmesh.numtverts
num_faces = tmesh.numfaces
padding=((mdlSize/8)-numEntrtices)
if num_uvws!=0 then(
for t = 1 to numEntrtices do(
tv=getTVert tmesh t
nSwap=writeBEfloat tv[1]
write=writelong s (bit.floatasint nSwap)
nSwap=writeBEfloat tv[2]
write=writelong s (bit.floatasint nSwap)
)
)
else(
for t = 1 to numEntrtices do(
tv=getVert tmesh t
nSwap=writeBEfloat tv[1]
write=writelong s (bit.floatasint nSwap)
nSwap=writeBEfloat tv[2]
write=writelong s (bit.floatasint nSwap)
)
)
-- for p = 1 to padding do(
-- write=writelong s 0
-- write=writelong s 0
-- )
delete tmesh
)
fseek f (mdlOffset+(numEntrtices*8)) #seek_set
for wr = 1 to (fsize-(mdlOffset+(numEntrtices*8))) do(
read=readbyte f #unsigned
write=writebyte s read
)
)
)
gc()
fclose f
fclose s
)
on btn3 pressed do(
fsource = GetOpenFileName \
caption:"Brawl Vert Import" types: \
"All files (*.*)|*.*|"
if fsource!=undefined do(
f= fopen fsource "rb"
fpath= getFilenamePath fsource
fname = getFilenameFile fsource
vertArray=#()
uvwArray=#()
faceArray=#()
fSize=readBElong f
mdlOffset=readBElong f
dataOffset=readBElong f
strOffset=readBElong f
vertID=readBElong f
vUkn1=readBElong f --flag? is XYZ?
dataType=readBElong f
entryStride=readBEshort f
numVertices=readBEshort f
eMinX=readBEfloat f
eMinY=readBEfloat f
eMinZ=readBEfloat f
eMaxX=readBEfloat f
eMaxY=readBEfloat f
eMaxZ=readBEfloat f
pad=readBElong f
pad=readBElong f
for x = 1 to numVertices do(
vX=readBEfloat f
vY=readBEfloat f
vZ=readBEfloat f
append vertArray[vX,vY,vZ]
append uvwArray[0,0,0]
)
obj=getCurrentSelection()
obj.pos = [0,0,0]
obj.rotation = quat 0 0 0 0
max modify mode
addModifier obj (edit_poly())
subobjectLevel = 1
-- modPanel.setCurrentObject obj.modifiers[#Edit_Poly]
diffArray=#()
directionArray=#()
for x = 1 to numVertices do(
$.modifiers[#Edit_Poly].SetSelection #Vertex #{}
$.modifiers[#Edit_Poly].Select #Vertex #{x}
vert=$.modifiers[#Edit_Poly].GetVertex x
-- $.modifiers[#Edit_Poly].SetOperation #Transform
mX=(vertArray[x][1])-(vert[1])
mY=(vertArray[x][2])-(vert[2])
mZ=(vertArray[x][3])-(vert[3])
append diffArray[mX,mY,mZ]
)
deleteModifier obj 1
createFile (fpath+fname+"_patch.pta")
s = fopen (fpath+fname+"_patch.pta") "ab"
vcount=writelong s numVertices
for x = 1 to numVertices do(
write=writefloat s (diffArray[x][1])
write=writefloat s (diffArray[x][2])
write=writefloat s (diffArray[x][3])
write=writelong s 0x0
)
messageBox ("Patch Created !" +"\n"+
"\n"+
"File Saved To:" +"\n"+
(fpath+fname+"_patch.pta")
)
gc()
fclose s
fclose f
)
)
on btn4 pressed do(
fsource = GetOpenFileName \
caption:"Brawl Vert Patcher" types: \
"Patch(*pta)|*.pta|All files (*.*)|*.*|"
if fsource!=undefined do(
f= fopen fsource "rb"
fpath= getFilenamePath fsource
vertArray=#()
vcount=readlong f #unsigned
for x = 1 to vcount do(
vX=readfloat f
vY=readfloat f
vZ=readfloat f
dmy=readshort f #unsigned
side=readshort f #unsigned
append vertArray[vX,vY,vZ,side]
)
obj=getCurrentSelection()
obj.pos = [0,0,0]
obj.rotation = quat 0 0 0 0
max modify mode
addModifier obj (edit_poly())
subobjectLevel = 1
--modPanel.setCurrentObject obj.modifiers[#Edit_Poly]
for x = 1 to vcount do(
$.modifiers[#Edit_Poly].SetSelection #Vertex #{}
$.modifiers[#Edit_Poly].Select #Vertex #{x}
vert=$.modifiers[#Edit_Poly].GetVertex x
$.modifiers[#Edit_Poly].SetOperation #Transform
mX=(vertArray[x][1])
mY=(vertArray[x][2])
mZ=(vertArray[x][3])
$.modifiers[#Edit_Poly].MoveSelection [mX,mY,mZ]
$.modifiers[#Edit_Poly].Commit ()
$.modifiers[#Edit_Poly].SetSelection #Vertex #{}
)
subobjectLevel = 0
--modPanel.setCurrentObject obj.modifiers[#Edit_Poly]
messageBox "Patched !"
gc()
fclose f
)
)
on btn5 pressed do(
disableSceneRedraw()
st = timestamp() --get start time in milliseconds
undo off(
delete $helpers
if chk7.checked==true then(
geo=getCurrentSelection()
delete $helpers
stuff=#()
if geo.count!=0 do(
for x = 1 to geo.count do(
addModifier geo[x] (Normalmodifier ())
geo[x].modifiers[#Normal].flip = on
addModifier geo[x] (smooth ())
geo[x].modifiers[#Smooth].smoothingBits = 1
collapseStack geo[x]
if chk6.checked==true do(
--rotate geo[x] (quat -1 0 0 0)
geo[x].scale = [2.54,2.54,2.54]
)
-- aBox = Box length:0.2 width:0.2 height:0.2 name:"dummy"
aBox = Box()
aBox.rotation = quat 0.707107 0 0 0.707107
aBox.name = (geo[x].name) as string
convertTo aBox TriMeshGeometry
-- convertTo geo[x] TriMeshGeometry
attach aBox geo[x]
-- update aBox geometry:true
delete aBox.verts[#{1..8}]
addModifier aBox (Morpher ())
append stuff aBox
)
addModifier stuff (Edit_Mesh ())
)
)
else(
geo=$polygon*
for x = 1 to geo.count do(
addModifier geo[x] (Normalmodifier ())
geo[x].modifiers[#Normal].flip = on
addModifier geo[x] (smooth ())
geo[x].modifiers[#Smooth].smoothingBits = 1
collapseStack geo[x]
if chk6.checked==true do(
--rotate geo[x] (quat -1 0 0 0)
geo[x].scale = [2.54,2.54,2.54]
)
)
delete $helpers
for x = 1 to geo.count do(
-- aBox = Box length:0.2 width:0.2 height:0.2 name:"dummy"
aBox = Box()
aBox.rotation = quat 0.707107 0 0 0.707107
convertTo aBox TriMeshGeometry
)
dmy=$Box*
myBoxes=#()
myMeshes=#()
for x = 1 to geo.count do(
objA= dmy[x]
objB= geo[x]
append myBoxes objA
append myMeshes objB
)
for x = 1 to geo.count do(
myBoxes[x].name = myMeshes[x].name
attach myBoxes[x] myMeshes[x]
)
for x = 1 to geo.count do(
for i = 1 to 8 do(
delete geo[x].verts[#{1}]
)
addModifier geo[x] (Morpher ())
)
addModifier $Polygon* (Edit_Mesh ())
)
)
et = timestamp() --get end time in milliseconds
enableSceneRedraw()
gc()
print ("Operation Completed In: "+(((et-st)/60)as string)+" Seconds") --print time to finish
)
)
createDialog DDV
EDIT
Quote
[OLD POST, NOT REVIEWED OR EDITED YET....]
after that failure, I turned to vertex hacking.. which seems like a sound method.
however I found that the current method only just modifies the raw dump of the vertices.. so everything clumped in the middle GAWD! O.O insane...
So I used Pharrox's AIS converter to import the model parts.. but the models are repositioned and fully built.
the good part is that I can now morph the fully assembled mesh into the vert cloud. making it easier to work with.. but not so great for a full character edits
I'm was thinking that it be ok to make edits to the full assembled mesh. then reform it back into the vert cloud. so I scripted a tool to move the assembled mesh into the raw vert cloud. this creates a patch, which when supplied should offset the coordinates back into a cloud position... its simple math.
A - B = C (therefore) A + C = B (and) B + C = A
C is my patch, which would make the necessary offsets to reform my assembled mesh back into a cloud position..
WELL... my theory was totally wrong.. when the practice is put into motion, I get a problem... the entire left side of the model enlarges O_O!! but only on the mesh parts that rotated.. hard to explain.. but a offsetting trick only works effective against shifted verts.. rotated ones seem to be a special case.. I'm uncertain how to compensate for that :\
any ideas on tricks to fix this ? or even what I did wrong with my initial MDL0 Swap
mdl also included in RS link
Please Help Me...
-Mario_Kart64n
spent all day trying to get this right. its' not perfect, but the base for Aya is complete. now for the skinning, and the head and hair are a new day of problems :\
after that failure, I turned to vertex hacking.. which seems like a sound method.
however I found that the current method only just modifies the raw dump of the vertices.. so everything clumped in the middle GAWD! O.O insane...
So I used Pharrox's AIS converter to import the model parts.. but the models are repositioned and fully built.
the good part is that I can now morph the fully assembled mesh into the vert cloud. making it easier to work with.. but not so great for a full character edits
I'm was thinking that it be ok to make edits to the full assembled mesh. then reform it back into the vert cloud. so I scripted a tool to move the assembled mesh into the raw vert cloud. this creates a patch, which when supplied should offset the coordinates back into a cloud position... its simple math.
A - B = C (therefore) A + C = B (and) B + C = A
C is my patch, which would make the necessary offsets to reform my assembled mesh back into a cloud position..
WELL... my theory was totally wrong.. when the practice is put into motion, I get a problem... the entire left side of the model enlarges O_O!! but only on the mesh parts that rotated.. hard to explain.. but a offsetting trick only works effective against shifted verts.. rotated ones seem to be a special case.. I'm uncertain how to compensate for that :\
any ideas on tricks to fix this ? or even what I did wrong with my initial MDL0 Swap
mdl also included in RS link
Please Help Me...
-Mario_Kart64n
spent all day trying to get this right. its' not perfect, but the base for Aya is complete. now for the skinning, and the head and hair are a new day of problems :\