Hello! This is a Work In Progress, as there is a lot to coverIf you want to make a Mario Kart 7 custom character, then this is the guide you're going to need! This guide will cover custom character creating in its entirety:
- The playable character itself in full (Sections 1 to 3)
- Bot character _lod model (Section 4)
- Changing the character's name ingame (WIP)
- Voice Clips (WIP)
- Kart recolour (WIP)
- Icons (WIP)
- Glider recolour (WIP)
Thanks to PabloMK7 for teaching me a big chunk of what I'll be showing in this guide!
Preparations:For the character alone, you will need:
- Hackpack.zip (Download can't be put here)
- Autodesk Maya 2015 the version matters! (<--- If it isn't there anymore then unfortunately you'll have to search the internet for it)
- Photoshop 2017 (Some other versions will be suitable, check the Hackpack for alternative plugin versions)
- To install CreativeStudio + Maya NW4C plugins: this YouTube video.
- Blender + this plugin
- Ohana3DS Rebirth (Helpful for viewing/exporting from bcmdl files)
Extra note: You will likely encounter lots of annoying (solvable) problems, but if you're still determined then continue, and good luck!
Section 1: Model and rig in MayaI assume you have installed the programs listed above before continuing.
To start off, you'll need to find/create your character model.
The shape of the character is very important if you don't want to have to create all individual 18 animations yourself. Why? Because reusing animations also means reusing the original character's skeleton. This means your character must have a similar body with arms and a head. Characters like Kirby are an example of a character that cannot reuse any of the original character's skeleton, so importing him would mean doing EVERY animation.
Try to have it under 600 polys, lets say a 700 poly maximum (poly count is the number next to "tris" in Maya). Open it in Maya 2015. Here, I have opened the penguin model from Wii CP Game Day. And it is only at around 300 polys, so that's great, I can use it.
IMPORTANT: Mario Kart 7 character files are made up of these things:
- 1 model
- 2 materials (body and eye)
- 1 texture for the body
- 7 eye textures (normal, half blink, full blink, looking left, looking right, sad, happy) but for now just focus on the 1st main texture.
- Around 17 animations (changes depending what character you replace). To make your character unique I recommend making your own Choice/jump_b/win/lose animations, but that's tough to do.
- A material animation that controls the eyes. We will get to this in Section 3.
Check your character's materials in Window > Rendering Editors > Hypershade.
Texture size: No bigger than 256x256 (base the size off the replaced character's texture size).
So now, lets decide which ingame character we're replacing. Choose carefully! If you choose a character too small it will end up as small as my Bowser Jr mod. I advise that you don't pick HQ or Wiggler. After looking through the character BCMDL files (which I extracted from MK7 using godmode9) viewing them in Ohana3DS, I've decided to replace Honey Queen. (<--- I wrote this before realising choosing HQ is a bad idea)
Decided yet? Just go ahead and export the .dae file to get the skeleton.
And import the .dae to maya. So now you may notice, some characters get pretty messed up after exporting them, and usually have a head and waist both rotated 180 degrees.
To fix that, click on the rotated joint and on the right of maya, flip that 180 degrees back to a 0 and hopefully the character's head/waist is the right way round now.
The step above is important because otherwise the animations will rotate your character's head and waist joints 180 again, and you might want to avoid rigging the model twice.
Do not use "move skinned joints" tool on the skeleton. The animations will put the joints back in the original positions and stretch your model in an odd way.
Select the original character which is currently binded to the skeleton, and detach the skin.
Now simply just delete the character, and lets get on with our custom one. Lets start by scaling our model to fit the skeleton, and make the feet stick forward as if they are sitting. Don't resize or edit the skeleton!
See how my penguin's flippers/arms fit the skeleton? Shouldn't have any problems here.
Now you may see that the head joint is on top of the head rather than at the neck like it should be.... If you plan on making the head move, this would be a problem. Make sure that the joint is at the root of whatever it moves.
For me, this is not a problem because I don't plan on making the penguin's head turn. It would look horrifying.
I'll say it again, don't edit, move, or scale the skeleton! Only the model!
Once you are happy with your model's scale and positioning, go ahead and select the model then shift + select the skeleton too, and hit the smooth bind button.
Unfortunately the auto rigging that this button does is not magic, and this next part may take a while.
Tip: If the model's shading looks weird, or the model looks super polygonal, then select the model and go to Normals > Average Normals.
So for this next step, select your binded model and start using paint weights tool. This is where you are going to need to use rigid skinning.
Underneath the list of joints, make sure you have set value to 1 and that you are using the biggest brush. Other brushes will paint grey vertexs, which leads to smooth skinning (not rigid) and that will cause problems.
Before you start painting anything, select the joint that you assume will use the biggest area of the model, and hit the flood button to cover it entirely in value 1 (white). This may sound strange but this is to make sure that there are absolutely no grey vertexs, and so that when you paint all your joints, you save time by having the joint with the most area pretty much already done for you.
Now click on a joint and paint on it using the brush (check the settings are the same as in the screenshot above). You can check the original character's rigging as an example. This is not a character rigging tutorial, so I won't explain too much but; whatever is painted white on a joint, will be moved by that joint. I'll say it again, paint using only value 1! (Not even with value 0, that will spread grey vertexs in other joints)
If you paint white where you don't want to, don't paint over it with black. Undo with ctrl+z.
Don't forget to constantly save the maya scene! Losing progress sucks.
Now at this point you have finished sorting out your working rig I hope, and not getting deformations as bad as this:
...Yeah not the prettiest. You'd have to fiddle around with the model and joint weights until you get a nice looking result.
Open Outliner and Hypergraph Hierarchy (both found in the Window tab)
It should look like this, but different characters have slightly different skeletons + joint names. If you have multiple meshes then you'll need to merge them.
In Outliner, click on the + in all_root so you see skl_root. Middle click and hold on skl_root. Then drag it outside of all_root. Delete all_root. Go to Create > Empty Group and name this group all_root. Middle click on skl_root and drag it into the all_root group, and also drag your model/mesh into the group. Simply put; Swap out, delete, create, swap in.
If all is done right, it should now look like this.
Renaming the mesh isn't mandatory but make sure you do not rename anything else!
Let's just double check that your model has been properly rigged with rigid skinning instead of smooth.
- Select your model and go to Edit Deformers > Export Deformer Weights, and export the .xml file.
- Open this .xml file in Wordpad (notepad ignores new lines) then scroll down until you see long strings of "1.000" values.
- Keep looking through these until you spot a single decimal number smaller than 1. Spotted these 2!
- Delete the line which has the smaller number (the 0.013 in my pic) and change the size="16" to size="15", to make up for the deleted line. Then change the bigger number (0.987 in the pic) to "1.000" then hit save. No more values lower than 1? Great, lets continue.
- Go back to Maya and this time Edit Deformers > Import Deformer Weights and pick the one you just saved.
Safe-Section 2: Testing the character ASAP without wasting timeI understand how frustrating it would be if you followed all of Section 2 and reached Section 3 only to test the character and it immediately crashes the game on the select screen. So you might want to use the shortcuts this section has to offer.
For now instead of actually following the entirety of Section 2 where you create every animation file, we are going to do something much quicker instead. We're going to create blank placeholder animations, which are VERY easy and quick to make, as opposed to exporting/importing existing animations.
Scroll down until you reach "Safe-Section 2 Shortcut 1". Skip through Section 2 and look out for it! (Marked in blue so it's easy to spot.)
Section 2: Animations export > import > export > import > exportIf you are following this section and not Safe-Section 2, then just ignore any blue text.
It's time for Blender to open! And Ohana3ds once again! This next part will take you quite a while, be prepared.
- In Maya, 'Export All' and save as YourRig.fbx.
- In Blender, import the .fbx. If you do not see the .smd import option, you don't have the plugin installed yet. You'll need for the next step. Scroll back up to the downloads & install that!
- In Ohana3ds, individually export every animation from your selected character as .smd to a folder.
Warning: Using animations from other characters might not turn out so great. Stick to the character skeleton you've chosen!
- In Blender, while having your character fbx imported, go to Import > Source Engine (.smd) and import one of your exported smd anims.
The feet is misplaced because I forgot to listen to my own advice earlier and used the move skinned joints tool on the waist joint. Well now you know why to not use it! I'll have to reanimate the feet.
- In Blender, go to Export > .fbx as the animation name you imported (back.fbx for example) and save it in another folder.
Clear the scene by hitting CTRL + Z a couple of times until nothing is there, then redo step 4 and this step again until you have exported every animation to its own .fbx file. Yep... you heard me right, you have to redo this around 17 times... You won't be going on to step 6 for a while.
- You done now? Now back to Maya, we're done with Blender for the rest of this guide. With your character still open in maya, drag and drop just 1 animation .fbx into it. (Make sure you made no rig changes after you exported the character .fbx from earlier, or you may see problems.)
- Now, I don't have a clue why these giant joints appear, or how they are caused
But that's not a problem. Just delete every one of these giant joints, and make sure to NOT delete any of the actual skeleton's joints. That WILL cause problems.
- Make sure the timeline shows the full animation, start to finish. This driving animation I imported starts at frame 0 and ends at frame 119, so make sure the timeline also starts at exactly frame 0 and ends at frame 119.
To see animation length, select any joint (one that has animation of course) and find how long it is just by looking at the keyframes (thin red lines are keyframes). Every anim should start at 0. All 5 driving animations (back, drift, drive , hop, dash) end at frame 119.
- Play the animation a couple of times to make sure it is looking good, and make any edits you need to. Note that Maya plays animations faster than how they appear ingame (Ohana shows the correct speed).
Unfortunately, exporting animations from Ohana isn't always perfect so you may see a certain joint not playing as smoothly as you'd want it to. Make any necessary edits then move on to the next step.
There are tutorials on Youtube if you want to understand how animating joints in Maya works.
- Safe-Section 2 Shortcut 1: Read this to bake a placeholder animation
We're going to bake the animation. What I mean is, by baking the frames, every single empty frame will become a keyframe. Certain animations crash the game if they are not baked.
Once baked it will be very hard to edit the animation, so make sure no edits are needed before continuing.
Open Hypergraph Hierarchy (can be opened in the Window tab), then select everything (the entire all_root group), then go to Edit > Keys > Bake Simulation.
If every joint is full of key frames and no blank frames, you have successfully baked the animation.
Safe-Section 2: Scroll down to Shortcut 2.
- 'Save as' the scene with the animation's name so it'll be easy to find.
If you want to be extra cautious, then 'Save as' the scene once before baking, and then Save as a separate file after baking.
Wipe the full animation from the timeline. Yes, completely clear it away. Drag + drop the next .fbx animation file and repeat this process each time, save as a separate scene. Re-do all of step 6 to step 11 (this one) for ALL animations EXCEPT the 2 throw_f ones. Don't overwrite the previous scene when saving!! You really don't want to have to redo all this.
And finally, you're done saving (and editing if you're unlucky) all those animations except for the 2 throw_f ones now? See the next step.
Note: Step 12 is purely for merging the throw_f animations into the full one to make it easy to edit. If you don't think you'll need to edit it then just export them both the same as you did the rest and skip step 12.
- We're now doing the 2 throw_f animations. But it's really 1 animation split into 2. So in Maya we're going to merge them so that it is easier to edit and fits together smoothly. This is a little awkward to follow;
First, make sure the timeline is empty again.
Drag in throw_f_ed.fbx (which you created earlier) into Maya. Select all the keyframes from this animation (make sure everything in hierarchy is still selected!!) and then right click + cut them.
Drag in throw_f_st.fbx this time. Once again, make sure everything in the hierarchy is still selected, and go to the frame AFTER the LAST keyframe in the timeline at the bottom.
That sounds confusing but basically if the last keyframe happens to be 18, then right click on frame 19.
When you've right clicked the first blank frame (frame 19 in my scenario), hit paste. If you did this right, you did not overlap other keyframes and you should now have the full throw_f animation, ready to be edited. Make any edits that you need to do from here, and save the animation. Dont forget to bake it.
Lastly, make sure to take note how many frames long the original throw_f_st and throw_f_ed anims are (we will be exporting them both separately again later).
Quick check before we continue:
- You should have finished making an INDIVIDUAL SCENE for EVERY ANIMATION, with all of them EDITED (wherever edits were needed) and BAKED (mandatory).
- If not, do that before continuing!
- Check in Hypershade that your character has no more than 2 materials - one for body and one for eye. (If your character does not use an eye texture then it is not mandatory to include it.) I'm not sure if having a third material will crash the game, but let me know if you decide to test that.
- Check the Hierarchy is like in the screenshot above. (Ignore the nw4c, that's the next step)
- Check your joint names are still the same as the original character's joints (otherwise game will crash)
- Check you clicked on your model and did Normals > Average Normals to make it look smooth.
- If your character uses a custom skeleton then ingame you may experience the head joint screwing up during the "choice" animation on the select screen. To fix this you can swap the NAMES of the head joint with another (like something less noticable such as wrist_r).
Ignore this if you're reusing a character skeleton like in this guide.
- Checked that you have rigid skinning - Instructions for this are at the end of Section 1.
- Make sure to launch Maya with the NW4C plugins ready. Open 1 saved Maya scene among the many you created earlier.
- Safe-Section 2 Shortcut 2
Open NW4C > NW4C Set Animation Range and right click the 'all_root' that appears in the left box, and select "Create and Attach nw4c_AnimRangeCtrl".
- "Enable" a row by checking the box. Enter the name of the animation. If you opened the "drift_l" animation, then enter "drift_l" and the correct animation start & end frames.
Safe-Section 2 instructions: Enable a row for every individual animation and enter every animation name with the same start & end frames. Continue next steps.
Ignore blue text if you are following Section 2 normally and not creating placeholders.
- If animation is one of these 4; Wait, Win, Lose, or Crash, then tick the "Loop" box on the right. Click close. Now would be a good time to double check that your animation is baked.
- Open NW4C > NW4C Export with Setting. In "Output Options" tab > Process Mode, tick Animation Range. Choose a folder to export to. In "Output File Selection" make sure only .cskla (Skeletal Animation Data) is ticked. Like in this pic:
Safe-Section 2: Ignore step 6, move on to 7.
- You have now exported 1 animation. Redo all 5 steps for every animation.
If you followed Step 12 earlier and merged the throw_f animations, make sure in Set Animation Range that you enable 2 animations and set the keyframes for both of them like in this pic:
But with the original animation lengths of course.
- Done exporting every animation to a .cskla file? Now reopen Hypershade again, select body & eye materials and go to NW4C Set Material Attribute. Make sure that Fragment Lighting is ticked.
- Back to NW4C Export with Setting again and this time, in Process Mode, tick Single and then underneath, check Use CreativeStudio. In Output Options, uncheck .cskla and check both .cmdl and .ctex, then click export. This will open your model and textures in Nintendo Creative Studio.
End of Section 2 aswell as Safe-Section 2. Continue to 3.
Section 3: CreativeStudio and Photoshop 2017CreativeStudio is the program you'll be using to put together the model, texture files, and animation files.
From now I'll be using Sonic as an example because I never finished that penguin.
First before doing anything, delete the .MaterialLutset file from CS. The game will crash if you keep that in the bcmdl.
The character you are replacing will have 2 letters for its name, if you are replacing Mario then it will be "mr". Replace every "mr" in this next part with whatever letters your replaced character has.
Rename the model to just "mr". Rename the 2 materials under "mr" aswell, with the body material being named "mr_mat_body" and the eyes being named "mr_mat_eye".
Your character should have 7 eye textures (though it is not needed, but it's good if you want your character to look left/right, look happy/sad, and blink ingame).
Rename the body texture to "mr_body" and each eye texture "mr_eye.0" up to "mr_eye.6".
Here's a quick guide to what each eye texture number is so you can name them properly:
- 0 - Main eye texture
- 1 - Half blink (eyes half closed)
- 2 - Full blink (eyes closed)
- 3 - Look right
- 4 - Look left
- 5 - Happy (plays when coming 1st to 4th place)
- 6 - Sad (plays when coming 5th to 8th place)
Right click on xx_mat_body and select "Load into material", and select this .cmat file:
Make sure that everything is ticked, and hit Ok. Do the same for xx_mat_eye.
It'll look like this but that's fine, just click on the material and go to "Texture" tab on the right and select the proper texture again from the drop-down list.
Your model will now have very harsh lighting on it, but that's because the alpha channel on the texture has not been added yet.
Select everything and File > Save > Save all... to a new folder so they stay with these names and settings.
Keep CS open, and now open Photoshop after installing the necessary NW4C plugins.
Drag in your .ctex texture files into Photoshop. If this doesn't work then the plugins aren't installed properly.
Once open, go to the Channels tab on the right and you will see 4 colour channels. Click the "Create new channel" button at the bottom right and an Alpha channel will be created.
The alpha channel will control how light is reflected on the textures. In darker spots of the alpha channel, light will be reflected less (and so appearing darker on the model) while brighter spots will reflect more light (appearing brighter on the model).
Copy paste the texture from the RGB (top) channel into the Alpha channel, so you will now have the same texture but in greyscale allowing you to make any part lighter or darker. Here's examples of Sonic's alpha channel textures (note that the alpha channel's detail is very low due to compression after exporting):
Don't spend too much time changing the alpha channel because you'll likely have to edit it again after seeing how it looks. I recommend not changing it at all and simply leaving it as a greyscale copypaste until first seeing how it looks in CS anyway, so lets continue:
Go File > Save As > (save as a .ctex file into a new folder with the correct name) > Select ETC1_A4 and Generate Mipmap: All > Ok. You can check this picture for the settings.
Drag and drop your edited ctex into CS and check how it looks now. Still too bright? Keep playing around with the alpha channel in Photoshop until you get the lighting on your character the way you want it to look. Time to test your character ingame!
Select all your exported cskla animation files and drop them into CS. You can drag and drop them individually in order if you're a perfectionist and want it nice & neat.
Go File > Save binary > xx.bcmdl (change xx to your character's letters).
Now you can open this bcmdl file in Ohana3ds to view it. Looks good and working well with all the animations? Great, get it on your 3DS/2DS SD card using any mod loader of your choice (Luma LayeredFS, OnionFS, CTGP7) and see how it looks ingame!
...Either at this moment you're happy that your character is now alive and working ingame, or... the game has crashed.
- If MK7 crashed on load, then it probably isn't the fault of the bcmdl file.
- If MK7 crashed on the character select screen, then it could be that one of the joints or wait/choice animations are named incorrectly, or you did not delete the .MaterialLutset file in CS or you didn't "load into material" with the .cmat file.
- If MK7 crashes after selecting a cup, then one of the animations are probably not baked or named incorrectly.
If you followed the Safe-Section 2 making placeholder animations, and you have confirmed that the model does work ingame, is scaled correctly, and without crashes, then yay, you can go wayy back up and follow the proper Section 2 in full from the start.
Make any edits you need to do, fixing the alpha channel, animation edits & exporting again, anything until your character is good to go. Once that's all sorted, theres 1 last thing to add to your character.
If your character does not have multiple eye textures, then you can skip this step.
Eye material animations:
This step will make use of the extra 6 textures with yellow warning symbols next to them.
In CreativeStudio, select xx_mat_eye and go to Window > Curve Editor.
- You will see this window:
Select the same thing as shown above.
- On the grid, just scroll all the way out then scroll a bunch back in, so that the numbers on the left will show as 0 to 10 like in this pic:
- Set the "Snap to frames" to 1.0.
Move your cursor to the 0,0 coordinate, then press 'S' on your keyboard. This will place a dot. Place 6 more dots in a diagonal line at points 1,1 , 2,2 , 3,3 , 4,4 , 5,5 , 6,6.
- Select a dot and look at Key Control to double check that you have placed them correctly.
- Close the window, and you will see that at the very bottom, a MaterialAnimation file was created. Rename this to face_anim.MaterialAnimation.
Under Texture Pattern, select the xx_eye.0 texture and click Add.
- Add all eye textures in order from 0 up to 6. Change the Number of frames: to 7.
You will see that the yellow warning symbols have disappeared from every eye texture now. Export the character as bcmdl again and test ingame.
- It does not crash at all
- Animations work correctly and look good
- You are happy with the alpha channel lighting
- Eye animation works ingame
But if you haven't quite finished the character yet, then you can still continue on to the next steps and go back to it later.
Be sure to ask me on discord Frozen Blur#4327 if you need any help with a step.
Section 4: Opponent _lod modelYou may notice that while you have your custom character ingame, opponents such as bots won't. Bots use the "xx_lod.bcmdl" model, which is just a less detailed model of the same character and with no animations.
- Find or create a low poly model for your character, and try to aim for under 250 polys. In Maya, the poly count is displayed next to "Tris". Merge your textures so that your character has only 1 texture.
Texture size: No bigger than 128x128 (base the texture size off the replaced character's texture).
- Open the xx_lod.bcmdl of the character you're replacing in Ohana3DS, extract as .obj and open it in Maya. Use the model as a reference for scaling and where the hands & feet go.
- Once your NPC model is scaled correctly, has 1 texture, and is under 250 polys, then export the model to CreativeStudio the same way you did with the player model. Check your settings are like in this picture:
- In CS rename the model to "xx_lod", and rename both the material & texture to "xx_lod_body".
Delete any ".MaterialLutset" files that appear.
- Right click the material, click "load into material", and select the same .cmat file you downloaded earlier. Save your files into a folder somewhere, and open the xx_lod_body.ctex file in Photoshop and add the alpha channel like how you did with the player model. Keep the alpha channel consistent with the alpha channel on the player model.
Make sure only those 3 things are present in CreativeStudio: Model, Material, and Texture.
- Select the model and go to FIle > Optimise selected models > Compress node > Unite all node. With the model selected do the same again but instead, click SkeletalModel-Simplification. Basically this just makes the model not be invisible ingame.
- Save > Save binary > "xx_lod.bcmdl" Put this onto your SD card and test ingame!
- Crashed on boot: Won't be because of the bcmdl.
- Crashed loading course: Something may be named incorrectly, or you left the MaterialLutset file in the bcmdl, or you didn't "load into material" with the .cmat file.