Modifying existing animations to create new ones.

REFERENCE LINKS TO SIMILAR THREADS:

http://www.titanquest.net/tq-forum/threads/28337-Using-the-Viewer-to-Attach-Meshes
http://www.grimdawn.com/forums/showthread.php?t=38003

I’ve not made any custom meshes or animations so far but from what I’ve read we can’t use custom meshes or animations yet, or no one figured out how to yet. I read you can’t save them


I’m trying to make the BreathFrost animation effect from the Yeti to display
with the BreathFire model animation from anm_malepc and ‘female’ animations by adding the BreathFrost to every Animation Sets.

When I add the BreathFrost animation to anm_malepc, I get only the effect and no animation because it’s not attach to the player model.

I figured out the best approach would be to use the effect (a breath of frost ice)
and change it for the breath of fire in the animation called BreathFire and save it as a new one.

I loaded all the tools from Grim Dawn folder and was able to load the animations in the tool called simply “Viewer”.
Viewer is a good name for this tool for me, because the only thing I was able to do is View animation :smiley: Hehe!

Clearly, you can do a lot more with it!

Let me explain you what I did so you can guide me and maybe understand me more clearly.

I loaded/added the mesh from the creatures/enemies/yeti folder and then I also loaded the anm called yeti_attackbreatha01 inside creatures/enemies/yeti/anm .
I have no idea what I’m doing so I just press Play.

The Yeti moves and we can see him performing a breath animation.
So i’m thinking "hmmm, but where is the effect of this breath? how am I gonna import it to the other animation if I can’t even see it :confused: "

Then I realize there’s an option to display Attachment points.
From there I see floating attachments, I click one and it’s called “[Attach Point] FXForward” so logically FX = effects. BINGO! :slight_smile: :rolleyes: :slight_smile:

Now, here come the part where I need you guys to help me understand how I can use the effect from this animation and replace the BreathFire effect with this one. If this is possible it would save me a lot of time because BreathFire animation already exist for the player character but display a breath of fire and I want to replace it with frost.

Thank you.
(Not Native English speaker, so I’m sorry in advance for the confusion in the text sometimes.
I’ll add clarification if needed, don’t be shy to ask :slight_smile: )

You need to save and access the mif file in the viewer, then edit the effect attached to whatever is emitting the fire to your frost effect.

Can’t give more info atm because i haven’t done it yet, and I have no idea if we have any means to edit mif files yet. This is how we did it in TQ though. (as simplistic as possible because you could write pages and pages on how to do it. see more info on the TQ forums, munderbunny wrote a tutorial on it, editing attachments in viewer)

Yes I was reading his thread and a few posts of yours but I can’t get this part working.

I’ll highlight it from his post, underlined text is info I added and colored text is highlight of instruction i don’t understand :

"So, here’s my crappy version that I’ll hopefully be able to fix up more in the coming weeks:

First thing is you’ll need p0a’s mesh compiler.
Where can I find this tool?

Very simply, you can open a mesh with the viewer and see it’s attachment info. The attachment points will be red squares as there’s no underlying info about them available for the viewer. If you try to use the command “save mif data” command you’ll get an error message. If you create a folder structure in your working/source directory that matches the path it’s looking for, it’ll save a file.mif (a blank text file).

The mif data, it turns out, is all that attachment info at the end of a mesh from the first Attachment to the final bracket (don’t ask me how long it took me to figure this out, it’s ridiculous).
So, cut and paste that info into that blank mif file. It’ll look like this:
Is he referring to the code he pasted or what?
Do I need the above tool to get the code I need to copy inside the MIF?

Code:


AttachPoint
{
    name   = "SpecialHit01"
    parent = "Bone_Head"
    origin = (0.112440, 0.118757, 0.000000)
    xAxis  = (0.999947, -0.000008, 0.000000)
    yAxis  = (-0.000008, 1.000058, 0.000000)
    zAxis  = (0.000000, 0.000000, 1.000000)
}
AttachPoint
{
    name   = "Upper Body"
    origin = (0.000000, 0.000000, 0.000000)
    xAxis  = (1.000000, 0.000000, 0.000000)
    yAxis  = (0.000000, 1.000000, 0.000000)
    zAxis  = (0.000000, 0.000000, 1.000000)
}
AttachPoint
{
    name   = "BossAura"
    origin = (0.000000, -0.388673, -0.243117)
    xAxis  = (1.000000, 0.000000, 0.000000)
    yAxis  = (0.000000, 1.000000, 0.000000)
    zAxis  = (0.000000, 0.000000, 1.000000)
}
AttachPoint
{
    name   = "HeadEffect"
    parent = "Bone_Head"
    origin = (0.086339, -0.029890, 0.000000)
    xAxis  = (-0.327140, -0.944975, 0.000000)
    yAxis  = (0.944962, -0.327140, 0.000000)
    zAxis  = (0.000000, 0.000000, 1.000000)
}
AttachPoint
{
    name   = "Target"
    parent = "Bone_Spine02"
    origin = (0.171945, 0.119670, -0.008975)
    xAxis  = (1.000017, -0.000096, 0.000000)
    yAxis  = (-0.000096, 0.999972, 0.000000)
    zAxis  = (0.000000, 0.000000, 1.000000)
}
AttachPoint
{
    name   = "Head"
    origin = (0.000000, 0.000000, 0.000000)
    xAxis  = (1.000000, 0.000000, 0.000000)
    yAxis  = (0.000000, 1.000000, 0.000000)
    zAxis  = (0.000000, 0.000000, 1.000000)
}
AttachPoint
{
    name   = "R Hand"
    parent = "Bone_R_Weapon"
    origin = (0.000000, 0.000000, 0.000000)
    xAxis  = (1.000000, 0.000000, 0.000000)
    yAxis  = (0.000000, -1.000000, 0.000000)
    zAxis  = (0.000000, 0.000000, 1.000000)
}
AttachPoint
{
    name   = "L Hand"
    parent = "Bone_L_Weapon"
    origin = (0.000000, 0.000000, 0.000000)
    xAxis  = (1.000000, 0.000000, 0.000000)
    yAxis  = (0.000000, 1.000000, 0.000000)
    zAxis  = (0.000000, 0.000000, 1.000000)
}
AttachPoint
{
    name   = "Prey_Effect"
    parent = "MoveAXIS"
    origin = (0.000000, 0.000000, 2.745634)
    xAxis  = (1.000000, 0.000000, 0.000000)
    yAxis  = (0.000000, 0.020470, 0.999790)
    zAxis  = (0.000000, -0.999790, 0.020470)
}
RigidBodyDescription
{
    parentName = "Bone_Root"
    childName = "Bone_Thorax"
    parentOrigin = (0.001674, 0.054337, 0.000000)
    parentXAxis  = (1.000000, 0.000000, 0.000000)
    parentYAxis  = (0.000000, 1.000000, 0.000000)
    parentZAxis  = (0.000000, 0.000000, 1.000000)
    childOrigin = (-0.001674, -0.054337, 0.000000)
    childXAxis  = (-0.889415, -0.457101, -0.000002)
    childYAxis  = (0.457101, -0.889415, 0.000001)
    childZAxis  = (-0.000002, 0.000000, 1.000000)
    extents = (0.290000, 0.410000, 0.150000)
    collides = "true"
    density = "400.000000"
    playFallSound = "false"
    FusedBone
    {
        name = "Bone_Tail01"
        origin = (0.140669, 0.484891, 0.000000)
        xAxis  = (0.062473, 0.998047, 0.000000)
        yAxis  = (-0.998047, 0.062473, 0.000000)
        zAxis  = (0.000000, 0.000000, 1.000000)
    }
    FusedBone
    {
        name = "Bone_Waist"
        origin = (0.042616, 0.054337, 0.000000)
        xAxis  = (1.000000, 0.000000, 0.000000)
        yAxis  = (0.000000, 1.000000, 0.000000)
        zAxis  = (0.000000, 0.000000, 1.000000)
    }
}
RigidBodyDescription
{
    parentName = "Bone_Thorax"
    childName = "Bone_Spine01"
    parentOrigin = (-0.196905, 0.000000, 0.000000)
    parentXAxis  = (1.000000, 0.000000, 0.000000)
    parentYAxis  = (0.000000, 1.000000, 0.000000)
    parentZAxis  = (0.000000, 0.000000, 1.000000)
    childOrigin = (0.196906, 0.000000, 0.000000)
    childXAxis  = (0.807413, -0.589986, 0.000000)
    childYAxis  = (0.589986, 0.807413, 0.000001)
    childZAxis  = (0.000000, -0.000001, 1.000000)
    extents = (0.280000, 0.250000, 0.230000)
    collides = "true"
    density = "200.000000"
    playFallSound = "false"
    FusedBone
    {
        name = "Bone_R_AttkArm01"
        origin = (-0.064599, 0.206980, -0.178254)
        xAxis  = (0.538874, 0.842386, 0.000003)
        yAxis  = (-0.842386, 0.538874, -0.000002)
        zAxis  = (0.000003, 0.000001, -1.000000)
    }
    FusedBone
    {
        name = "Bone_L_AttkArm01"
        origin = (-0.064600, 0.206980, 0.178254)
        xAxis  = (0.538885, 0.842380, 0.000003)
        yAxis  = (-0.842379, 0.538885, -0.000002)
        zAxis  = (-0.000003, -0.000001, 1.000000)
    }
}
RigidBodyDescription
{
    parentName = "Bone_Tail01"
    childName = "Bone_Tail02"
    parentOrigin = (-0.284125, 0.000000, 0.000000)
    parentXAxis  = (1.000000, 0.000000, 0.000000)
    parentYAxis  = (0.000000, 1.000000, 0.000000)
    parentZAxis  = (0.000000, 0.000000, 1.000000)
    childOrigin = (0.284126, 0.000000, 0.000000)
    childXAxis  = (0.999597, -0.028377, 0.000000)
    childYAxis  = (0.028377, 0.999597, 0.000000)
    childZAxis  = (0.000000, 0.000000, 1.000000)
    extents = (0.280000, 0.150000, 0.150000)
    collides = "true"
    density = "100.000000"
    playFallSound = "false"
}
RigidBodyDescription
{
    parentName = "Bone_Waist"
    childName = "Bone_R_FrLeg01"
    parentOrigin = (-0.116505, 0.137518, 0.101988)
    parentXAxis  = (1.000000, 0.000000, 0.000000)
    parentYAxis  = (0.000000, 1.000000, 0.000000)
    parentZAxis  = (0.000000, 0.000000, 1.000000)
    childOrigin = (0.116505, -0.137518, -0.101988)
    childXAxis  = (-0.081125, 0.003603, -0.996697)
    childYAxis  = (-0.995714, 0.044255, 0.081205)
    childZAxis  = (-0.044401, -0.999014, 0.000003)
    extents = (0.220000, 0.420000, 0.360000)
    collides = "false"
    density = "200.000000"
    playFallSound = "true"
    FusedBone
    {
        name = "Bone_R_MidLeg01"
        origin = (0.138289, 0.125735, -0.114398)
        xAxis  = (-0.068103, 0.003024, -0.997674)
        yAxis  = (-0.996690, 0.044297, 0.068170)
        zAxis  = (-0.044400, -0.999014, 0.000003)
    }
    FusedBone
    {
        name = "Bone_R_BkLeg01"
        origin = (0.141162, 0.417270, -0.101988)
        xAxis  = (-0.078055, 0.003466, -0.996943)
        yAxis  = (-0.995960, 0.044267, 0.078132)
        zAxis  = (-0.044403, -0.999014, 0.000003)
    }
    FusedBone
    {
        name = "Bone_L_MidLeg01"
        origin = (0.138289, 0.125735, 0.318373)
        xAxis  = (-0.062999, 0.002803, 0.998010)
        yAxis  = (-0.997025, 0.044316, -0.063061)
        zAxis  = (-0.044404, -0.999014, 0.000003)
    }
    FusedBone
    {
        name = "Bone_L_BkLeg01"
        origin = (0.141162, 0.417270, 0.305963)
        xAxis  = (-0.089651, 0.003987, 0.995965)
        yAxis  = (-0.994983, 0.044224, -0.089740)
        zAxis  = (-0.044403, -0.999014, 0.000003)
    }
    FusedBone
    {
        name = "Bone_L_FrLeg01"
        origin = (0.116505, -0.137518, 0.305963)
        xAxis  = (-0.089632, 0.003986, 0.995967)
        yAxis  = (-0.994985, 0.044224, -0.089720)
        zAxis  = (-0.044403, -0.999014, 0.000003)
    }
}
RigidBodyDescription
{
    parentName = "Bone_R_AttkArm01"
    childName = "Bone_R_AttkArm02"
    parentOrigin = (-0.386109, 0.000000, 0.000000)
    parentXAxis  = (1.000000, 0.000000, 0.000000)
    parentYAxis  = (0.000000, -1.000000, 0.000000)
    parentZAxis  = (0.000000, 0.000000, 1.000000)
    childOrigin = (0.386109, 0.000000, 0.000000)
    childXAxis  = (0.995552, -0.094215, 0.000000)
    childYAxis  = (-0.094215, -0.995552, 0.000000)
    childZAxis  = (0.000000, 0.000000, 1.000000)
    extents = (0.380000, 0.100000, 0.100000)
    collides = "true"
    density = "100.000000"
    playFallSound = "false"
}
RigidBodyDescription
{
    parentName = "Bone_L_AttkArm01"
    childName = "Bone_L_AttkArm02"
    parentOrigin = (-0.386109, 0.000000, 0.000000)
    parentXAxis  = (1.000000, 0.000000, 0.000000)
    parentYAxis  = (0.000000, 1.000000, 0.000000)
    parentZAxis  = (0.000000, 0.000000, 1.000000)
    childOrigin = (0.386109, 0.000000, 0.000000)
    childXAxis  = (0.995549, 0.094246, 0.000000)
    childYAxis  = (-0.094245, 0.995549, 0.000000)
    childZAxis  = (0.000000, 0.000000, 1.000000)
    extents = (0.380000, 0.100000, 0.100000)
    collides = "true"
    density = "100.000000"
    playFallSound = "false"
}
RigidBodyDescription
{
    parentName = "Bone_Spine01"
    childName = "Bone_Spine02"
    parentOrigin = (-0.115123, 0.000000, 0.000000)
    parentXAxis  = (1.000000, 0.000000, 0.000000)
    parentYAxis  = (0.000000, 1.000000, 0.000000)
    parentZAxis  = (0.000000, 0.000000, 1.000000)
    childOrigin = (0.115123, 0.000000, 0.000000)
    childXAxis  = (0.999342, -0.036260, 0.000000)
    childYAxis  = (0.036259, 0.999342, 0.000000)
    childZAxis  = (0.000000, 0.000000, 1.000000)
    extents = (0.110000, 0.150000, 0.150000)
    collides = "true"
    density = "100.000000"
    playFallSound = "false"
}
RigidBodyDescription
{
    parentName = "Bone_R_MidLeg01"
    childName = "Bone_R_MidLeg02"
    parentOrigin = (-0.663023, 0.000000, 0.000000)
    parentXAxis  = (1.000000, 0.000000, 0.000000)
    parentYAxis  = (0.000000, -1.000000, 0.000000)
    parentZAxis  = (0.000000, 0.000000, 1.000000)
    childOrigin = (0.663023, 0.000000, 0.000000)
    childXAxis  = (0.998102, 0.061591, 0.000000)
    childYAxis  = (0.061590, -0.998101, 0.000000)
    childZAxis  = (0.000000, 0.000000, 1.000000)
    extents = (0.660000, 0.100000, 0.100000)
    collides = "true"
    density = "100.000000"
    playFallSound = "false"
}
RigidBodyDescription
{
    parentName = "Bone_R_FrLeg01"
    childName = "Bone_R_FrLeg02"
    parentOrigin = (-0.607801, 0.000000, 0.000000)
    parentXAxis  = (1.000000, 0.000000, 0.000000)
    parentYAxis  = (0.000000, -1.000000, 0.000000)
    parentZAxis  = (0.000000, 0.000000, 1.000000)
    childOrigin = (0.607801, 0.000000, 0.000000)
    childXAxis  = (0.998420, 0.056186, 0.000000)
    childYAxis  = (0.056186, -0.998420, 0.000000)
    childZAxis  = (0.000000, 0.000000, 1.000000)
    extents = (0.600000, 0.100000, 0.100000)
    collides = "true"
    density = "100.000000"
    playFallSound = "false"
}
JointDescription
{
    rigidBody0 = "1"
    rigidBody1 = "6"
    jointType = "universal"
    jointConnection = "1"
    jointAxis0 = "y"
    loStop0 = "0.000000"
    hiStop0 = "0.142414"
    jointAxis1 = "z"
    loStop1 = "-0.389540"
    hiStop1 = "0.352871"
    breakable = "false"
    breakChance = "0"
}
JointDescription
{
    rigidBody0 = "3"
    rigidBody1 = "7"
    jointType = "universal"
    jointConnection = "1"
    jointAxis0 = "y"
    loStop0 = "-2.480666"
    hiStop0 = "-0.985988"
    jointAxis1 = "z"
    loStop1 = "0.000000"
    hiStop1 = "2.643629"
    breakable = "false"
    breakChance = "0"
}
JointDescription
{
    rigidBody0 = "3"
    rigidBody1 = "8"
    jointType = "universal"
    jointConnection = "1"
    jointAxis0 = "y"
    loStop0 = "-2.201233"
    hiStop0 = "-1.120507"
    jointAxis1 = "z"
    loStop1 = "-2.876202"
    hiStop1 = "2.454523"
    breakable = "false"
    breakChance = "0"
}
JointDescription
{
    rigidBody0 = "3"
    rigidBody1 = "9"
    jointType = "universal"
    jointConnection = "1"
    jointAxis0 = "y"
    loStop0 = "-2.458254"
    hiStop0 = "-0.991860"
    jointAxis1 = "z"
    loStop1 = "-2.677324"
    hiStop1 = "2.694491"
    breakable = "false"
    breakChance = "0"
}
CreateEntity
{
    attach = "BossAura"
    entity = "Records\Effects\Boss Effects\Boss Aura.dbr"
}

Don’t use this actual info, as I’ve deleted a lot of it for space reasons.
Eh? :confused:

Now, once you save that info into the related mesh’s mif file,
What info? Where do I find it? :confused:
open the viewer again and open that mesh. You’ll notice the attachment points are now green, and if they call for any other meshes or particle effects, you’ll see them in the viewer. You can now use the attach point commands and move the attachments around. Also, you can create a new attachment. The bone you affix it to will be the bone it moves from.




I copied his code into the MIF even though I knew that was wrong (just to experiment since I don’t know what I’m doing) and I saw the attach points become green after relaunching the Viewer.
I’m on the right way but I need the code from the mesh and I don’t know where to find that…

Am i stupid or something? :rolleyes:

OMFG!
I found it :smiley:

After saving the mif file, I opened the mesh file of the Yeti with Notepad++.
I had already tried that last night but it display weird characters…

I DIDN’T THINK ABOUT SCROLLING DOWN!
OH GOD! :rolleyes:

Scrolled down the text and on row 4327 I found what I was looking for!
The code with all the attach points, bones and rigid bodies… etc etc…

Copied all the code into the mif file, reloaded the mesh file in the Viewer.
:slight_smile: Now I can edit the Attach Point! Yeah! :slight_smile:

If I open yeti_attackbreatha01.anm in Notepad++ and scroll down,
I found this entry:

CreateEntity
{
	frame = 16
	entity = "Records\FX\SkillsOther\Path\FrostBreathFX.dbr"
	attach = "Mouth"
}

and inside the files hero01_XXXX_skill_flamebreath_a01.anm,
I found this entry:

CreateEntity
{
	frame = 19
	entity = "Records\FX\SkillsOther\ItemSkills\FireBreathFX01.dbr"
	attach = "Mouth"
}

Now I’m wondering if I can just copy those files “hero01_XXXX_skill_flamebreath_a01.anm” and rename them to “hero01_XXXX_skill_frostbreath_a01.anm”, change the attached Entity to FrostBreathFX.dbr and link that into the anm_XXXXpc .

The problem I’m gonna encounter after that is where to put those files so I can build then in my mod?

Can someone guide me through the next step I need to take?

I have yet to whitness a working internally modified .anm however. I would be temporarily happy with being able to change bone referance names. :wink:

It is very possible you’re the first person to do this, or the modders that have done this are still hard at work and not reading the forums. If anyone does figure it out, hopefully someone will make a tutorial out of it. I wouldn’t mind making a tutorial after it is a solved problem (with credit to whoever figures it out).

I was afraid of that :slight_smile:

I think my best option is to wait for now, hehe!
I’m working on a few new skills right now, especially one that I’m gonna share the idea with you guys here.

A Ice Comet, drop-projectile exploding (1 Huge projectile) that shatters in fragements and spawn Ice Elementals.
This is by far, the most complicated skill I’ve made so far.

And building the effects from scratch, at least trying for the most part!
There’s still a few tricks I need to learn with the Particle/Effect Creator.

Thank you for the response rorschachrev and glad to see you again on GD Forum :slight_smile:

http://www.grimdawn.com/forums/showpost.php?p=383496&postcount=4

Thread:
http://www.grimdawn.com/forums/showthread.php?t=38254

Once you have the files built into an arc, you put the arc into your “build” directory of your mod, and you should be able to access them with assetmanager to put into your mod.

I have done this in TQ before, in GD it’s a little more complicated and I haven’t gotten around to it but I believe it can be done with the above.

I had a few days of work and doctors visits that kept me busy. I’m here for the long haul and thanks for noticing.

Before you worry too much about the FX you might want to make sure that you can do the chaining between skills that you’re looking for.
AoE -> Fragments (like the volcano probably) -> Spawn pets.

I suggest look at the template files for the volcano skill. I haven’t done so, but I think that’s the closest you’ll get to the first half of the skill ability. We may need a function call for onHit or something that can do the spawn, not sure without testing. Adding a particle effect onto this makes it cooler, but the dbr files make it work.

Hype post incoming!
:rolleyes::D:rolleyes:

Hehe, yeah I read that today.

I’m very happy the change they are making to Devotions too.

This patch gonna be great!