<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.oni2.net/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Delano762</id>
	<title>OniGalore - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.oni2.net/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Delano762"/>
	<link rel="alternate" type="text/html" href="https://wiki.oni2.net/Special:Contributions/Delano762"/>
	<updated>2026-04-06T09:23:43Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Troubleshooting&amp;diff=43727</id>
		<title>Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Troubleshooting&amp;diff=43727"/>
		<updated>2025-01-06T22:50:25Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Rendering offset from center */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UpdatedForOniX|1.0.0}}&lt;br /&gt;
==Mac-specific==&lt;br /&gt;
See the [[FERAL|Intel Mac build]]&#039;s page for Mac-specific issues.&lt;br /&gt;
&lt;br /&gt;
==Windows-specific==&lt;br /&gt;
Most of the problems in Oni itself can be solved by installing a community patch:&lt;br /&gt;
*The [[Daodan DLL]] (see that page for manual installation instructions),&lt;br /&gt;
*the [[Anniversary Edition]] (installs and updates the Daodan DLL automatically), or you could&lt;br /&gt;
*use [[OniX]], the new game application for Windows.&lt;br /&gt;
&lt;br /&gt;
But some problems remain unfixed, so the information below may be useful.&lt;br /&gt;
&lt;br /&gt;
===Installer===&lt;br /&gt;
The installer on the CD-ROM, OniSetup.exe, may no longer run in Windows 10. You can extract the game data from the installer&#039;s data file (ONISETUP.002) using [https://www.legroom.net/software/uniextract Universal Extractor].&lt;br /&gt;
&lt;br /&gt;
===Blam!s===&lt;br /&gt;
Have you seen this message?&lt;br /&gt;
&lt;br /&gt;
[[Image:Blam!.png|center]]&lt;br /&gt;
&lt;br /&gt;
There are several reasons why Oni might exit with such a message. The most common cause is solved by the Daodan DLL and OniX, but if neither of those fixes it…&lt;br /&gt;
&lt;br /&gt;
The [[/Blam|Blam page]] contains a thorough list of things that cause Oni to &amp;quot;blam&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Mouse/keyboard problems===&lt;br /&gt;
See [[Mouse control issues]].&lt;br /&gt;
&lt;br /&gt;
===Low-quality texturing/models===&lt;br /&gt;
There are several things that can be go wrong, from fuzzy textures to very-low-detail character models. That&#039;s always a driver issue. Try and get a recent driver for your GFX card (upgrade to Catalyst if you have an ATI, etc.). But sometimes, Oni is incompatible with modern stuff. Try and get a really old driver, then :)&lt;br /&gt;
&lt;br /&gt;
===Low frame rate===&lt;br /&gt;
;Power management&lt;br /&gt;
This can be a problem on notebooks. Under certain conditions, the performance of the computer will decrease dramatically, for example:&lt;br /&gt;
*if you run on battery power&lt;br /&gt;
*if you let the computer overheat&lt;br /&gt;
;Driver issue&lt;br /&gt;
&lt;br /&gt;
First let&#039;s make sure that your graphic card has Direct3D and AGP acceleration enabled.&lt;br /&gt;
Click on Start, Run, type &amp;quot;dxdiag&amp;quot;, and press OK. You will see now various information about your DirectX and your computer hardware/software. Click on display, and check the Direct3D/AGP acceleration checkbox. If it is off, try enabling it, and if it is cannot be enabled, your graphics card may have not have this option, or Windows is using your card as [[wikipedia:Peripheral_Component_Interconnect|PCI]] instead of AGP. In this case, try &amp;lt;u&amp;gt;updating or re-installing all your motherboard drivers.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Direct3d acceleration.jpg|thumb|200px|center|Make sure that you have acceleration enabled.]]&lt;br /&gt;
&lt;br /&gt;
Now, if acceleration is enabled like in the picture above, try installing or updating your graphics drivers; don&#039;t use the ones that come with Windows. If you have an Nvidia card and if it is old (like GeForce 2 or Riva), I recommend you install an older driver. My recommendation is one from the 28.x and 60.x. range; these seemed to work better with my old card.&lt;br /&gt;
&lt;br /&gt;
Nvidia users can download old drivers [https://www.nvidia.com/en-us/drivers/ here]. ATI users, try [https://www.amd.com/en/support here] (look for the &amp;quot;Previous Drivers&amp;quot; link after finding your card).&lt;br /&gt;
&lt;br /&gt;
See also &amp;quot;Bad texturing&amp;quot;, above.&lt;br /&gt;
&lt;br /&gt;
===Widescreen===&lt;br /&gt;
To get Oni to support widescreen resolutions, install the Anniversary Edition or just the Daodan DLL.&lt;br /&gt;
&lt;br /&gt;
====Rendering offset from center====&lt;br /&gt;
When running the game at wide resolutions (e.g. 3440x1440) it may render offset from center of the screen.&lt;br /&gt;
&lt;br /&gt;
[[Image:Screenshot 2025-01-04 192212.png|400px|center]]&lt;br /&gt;
There are three known solutions:&lt;br /&gt;
* Set Windows display scaling to 100%,&lt;br /&gt;
* Set High DPI scaling override on Oni.exe to Application or try Program DPI on it,&lt;br /&gt;
* Get Daodan 4.2 Beta from [https://rossy.oni2.net/daodan-4.2-beta1.zip here],&lt;br /&gt;
** Backup binkw32.dll in your &amp;lt;code&amp;gt;\Oni\AE&amp;lt;/code&amp;gt; folder,&lt;br /&gt;
** Place &amp;lt;code&amp;gt;\build\binkw32.dll&amp;lt;/code&amp;gt; from the archive into your \Oni\AE folder.&lt;br /&gt;
&lt;br /&gt;
[[Category:Oni Support]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Troubleshooting&amp;diff=43726</id>
		<title>Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Troubleshooting&amp;diff=43726"/>
		<updated>2025-01-06T22:49:52Z</updated>

		<summary type="html">&lt;p&gt;Delano762: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UpdatedForOniX|1.0.0}}&lt;br /&gt;
==Mac-specific==&lt;br /&gt;
See the [[FERAL|Intel Mac build]]&#039;s page for Mac-specific issues.&lt;br /&gt;
&lt;br /&gt;
==Windows-specific==&lt;br /&gt;
Most of the problems in Oni itself can be solved by installing a community patch:&lt;br /&gt;
*The [[Daodan DLL]] (see that page for manual installation instructions),&lt;br /&gt;
*the [[Anniversary Edition]] (installs and updates the Daodan DLL automatically), or you could&lt;br /&gt;
*use [[OniX]], the new game application for Windows.&lt;br /&gt;
&lt;br /&gt;
But some problems remain unfixed, so the information below may be useful.&lt;br /&gt;
&lt;br /&gt;
===Installer===&lt;br /&gt;
The installer on the CD-ROM, OniSetup.exe, may no longer run in Windows 10. You can extract the game data from the installer&#039;s data file (ONISETUP.002) using [https://www.legroom.net/software/uniextract Universal Extractor].&lt;br /&gt;
&lt;br /&gt;
===Blam!s===&lt;br /&gt;
Have you seen this message?&lt;br /&gt;
&lt;br /&gt;
[[Image:Blam!.png|center]]&lt;br /&gt;
&lt;br /&gt;
There are several reasons why Oni might exit with such a message. The most common cause is solved by the Daodan DLL and OniX, but if neither of those fixes it…&lt;br /&gt;
&lt;br /&gt;
The [[/Blam|Blam page]] contains a thorough list of things that cause Oni to &amp;quot;blam&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Mouse/keyboard problems===&lt;br /&gt;
See [[Mouse control issues]].&lt;br /&gt;
&lt;br /&gt;
===Low-quality texturing/models===&lt;br /&gt;
There are several things that can be go wrong, from fuzzy textures to very-low-detail character models. That&#039;s always a driver issue. Try and get a recent driver for your GFX card (upgrade to Catalyst if you have an ATI, etc.). But sometimes, Oni is incompatible with modern stuff. Try and get a really old driver, then :)&lt;br /&gt;
&lt;br /&gt;
===Low frame rate===&lt;br /&gt;
;Power management&lt;br /&gt;
This can be a problem on notebooks. Under certain conditions, the performance of the computer will decrease dramatically, for example:&lt;br /&gt;
*if you run on battery power&lt;br /&gt;
*if you let the computer overheat&lt;br /&gt;
;Driver issue&lt;br /&gt;
&lt;br /&gt;
First let&#039;s make sure that your graphic card has Direct3D and AGP acceleration enabled.&lt;br /&gt;
Click on Start, Run, type &amp;quot;dxdiag&amp;quot;, and press OK. You will see now various information about your DirectX and your computer hardware/software. Click on display, and check the Direct3D/AGP acceleration checkbox. If it is off, try enabling it, and if it is cannot be enabled, your graphics card may have not have this option, or Windows is using your card as [[wikipedia:Peripheral_Component_Interconnect|PCI]] instead of AGP. In this case, try &amp;lt;u&amp;gt;updating or re-installing all your motherboard drivers.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Direct3d acceleration.jpg|thumb|200px|center|Make sure that you have acceleration enabled.]]&lt;br /&gt;
&lt;br /&gt;
Now, if acceleration is enabled like in the picture above, try installing or updating your graphics drivers; don&#039;t use the ones that come with Windows. If you have an Nvidia card and if it is old (like GeForce 2 or Riva), I recommend you install an older driver. My recommendation is one from the 28.x and 60.x. range; these seemed to work better with my old card.&lt;br /&gt;
&lt;br /&gt;
Nvidia users can download old drivers [https://www.nvidia.com/en-us/drivers/ here]. ATI users, try [https://www.amd.com/en/support here] (look for the &amp;quot;Previous Drivers&amp;quot; link after finding your card).&lt;br /&gt;
&lt;br /&gt;
See also &amp;quot;Bad texturing&amp;quot;, above.&lt;br /&gt;
&lt;br /&gt;
===Widescreen===&lt;br /&gt;
To get Oni to support widescreen resolutions, install the Anniversary Edition or just the Daodan DLL.&lt;br /&gt;
&lt;br /&gt;
====Rendering offset from center====&lt;br /&gt;
When running the game at wide resolutions (e.g. 3440x1440) the game may render offset from center of the screen.&lt;br /&gt;
&lt;br /&gt;
[[Image:Screenshot 2025-01-04 192212.png|400px|center]]&lt;br /&gt;
There are three known solutions:&lt;br /&gt;
* Set Windows display scaling to 100%,&lt;br /&gt;
* Set High DPI scaling override on Oni.exe to Application or try Program DPI on it,&lt;br /&gt;
* Get Daodan 4.2 Beta from [https://rossy.oni2.net/daodan-4.2-beta1.zip here],&lt;br /&gt;
** Backup binkw32.dll in your &amp;lt;code&amp;gt;\Oni\AE&amp;lt;/code&amp;gt; folder,&lt;br /&gt;
** Place &amp;lt;code&amp;gt;\build\binkw32.dll&amp;lt;/code&amp;gt; from the archive into your \Oni\AE folder.&lt;br /&gt;
&lt;br /&gt;
[[Category:Oni Support]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Troubleshooting&amp;diff=43725</id>
		<title>Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Troubleshooting&amp;diff=43725"/>
		<updated>2025-01-06T22:49:28Z</updated>

		<summary type="html">&lt;p&gt;Delano762: Documented the issue with Oni rendering offset from center of the screen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UpdatedForOniX|1.0.0}}&lt;br /&gt;
==Mac-specific==&lt;br /&gt;
See the [[FERAL|Intel Mac build]]&#039;s page for Mac-specific issues.&lt;br /&gt;
&lt;br /&gt;
==Windows-specific==&lt;br /&gt;
Most of the problems in Oni itself can be solved by installing a community patch:&lt;br /&gt;
*The [[Daodan DLL]] (see that page for manual installation instructions),&lt;br /&gt;
*the [[Anniversary Edition]] (installs and updates the Daodan DLL automatically), or you could&lt;br /&gt;
*use [[OniX]], the new game application for Windows.&lt;br /&gt;
&lt;br /&gt;
But some problems remain unfixed, so the information below may be useful.&lt;br /&gt;
&lt;br /&gt;
===Installer===&lt;br /&gt;
The installer on the CD-ROM, OniSetup.exe, may no longer run in Windows 10. You can extract the game data from the installer&#039;s data file (ONISETUP.002) using [https://www.legroom.net/software/uniextract Universal Extractor].&lt;br /&gt;
&lt;br /&gt;
===Blam!s===&lt;br /&gt;
Have you seen this message?&lt;br /&gt;
&lt;br /&gt;
[[Image:Blam!.png|center]]&lt;br /&gt;
&lt;br /&gt;
There are several reasons why Oni might exit with such a message. The most common cause is solved by the Daodan DLL and OniX, but if neither of those fixes it…&lt;br /&gt;
&lt;br /&gt;
The [[/Blam|Blam page]] contains a thorough list of things that cause Oni to &amp;quot;blam&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Mouse/keyboard problems===&lt;br /&gt;
See [[Mouse control issues]].&lt;br /&gt;
&lt;br /&gt;
===Low-quality texturing/models===&lt;br /&gt;
There are several things that can be go wrong, from fuzzy textures to very-low-detail character models. That&#039;s always a driver issue. Try and get a recent driver for your GFX card (upgrade to Catalyst if you have an ATI, etc.). But sometimes, Oni is incompatible with modern stuff. Try and get a really old driver, then :)&lt;br /&gt;
&lt;br /&gt;
===Low frame rate===&lt;br /&gt;
;Power management&lt;br /&gt;
This can be a problem on notebooks. Under certain conditions, the performance of the computer will decrease dramatically, for example:&lt;br /&gt;
*if you run on battery power&lt;br /&gt;
*if you let the computer overheat&lt;br /&gt;
;Driver issue&lt;br /&gt;
&lt;br /&gt;
First let&#039;s make sure that your graphic card has Direct3D and AGP acceleration enabled.&lt;br /&gt;
Click on Start, Run, type &amp;quot;dxdiag&amp;quot;, and press OK. You will see now various information about your DirectX and your computer hardware/software. Click on display, and check the Direct3D/AGP acceleration checkbox. If it is off, try enabling it, and if it is cannot be enabled, your graphics card may have not have this option, or Windows is using your card as [[wikipedia:Peripheral_Component_Interconnect|PCI]] instead of AGP. In this case, try &amp;lt;u&amp;gt;updating or re-installing all your motherboard drivers.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Direct3d acceleration.jpg|thumb|200px|center|Make sure that you have acceleration enabled.]]&lt;br /&gt;
&lt;br /&gt;
Now, if acceleration is enabled like in the picture above, try installing or updating your graphics drivers; don&#039;t use the ones that come with Windows. If you have an Nvidia card and if it is old (like GeForce 2 or Riva), I recommend you install an older driver. My recommendation is one from the 28.x and 60.x. range; these seemed to work better with my old card.&lt;br /&gt;
&lt;br /&gt;
Nvidia users can download old drivers [https://www.nvidia.com/en-us/drivers/ here]. ATI users, try [https://www.amd.com/en/support here] (look for the &amp;quot;Previous Drivers&amp;quot; link after finding your card).&lt;br /&gt;
&lt;br /&gt;
See also &amp;quot;Bad texturing&amp;quot;, above.&lt;br /&gt;
&lt;br /&gt;
===Widescreen===&lt;br /&gt;
To get Oni to support widescreen resolutions, install the Anniversary Edition or just the Daodan DLL.&lt;br /&gt;
&lt;br /&gt;
==Rendering offset from center==&lt;br /&gt;
When running the game at wide resolutions (e.g. 3440x1440) the game may render offset from center of the screen.&lt;br /&gt;
&lt;br /&gt;
[[Image:Screenshot 2025-01-04 192212.png|400px|center]]&lt;br /&gt;
There are three known solutions:&lt;br /&gt;
* Set Windows display scaling to 100%,&lt;br /&gt;
* Set High DPI scaling override on Oni.exe to Application or try Program DPI on it,&lt;br /&gt;
* Get Daodan 4.2 Beta from [https://rossy.oni2.net/daodan-4.2-beta1.zip here],&lt;br /&gt;
** Backup binkw32.dll in your &amp;lt;code&amp;gt;\Oni\AE&amp;lt;/code&amp;gt; folder,&lt;br /&gt;
** Place &amp;lt;code&amp;gt;\build\binkw32.dll&amp;lt;/code&amp;gt; from the archive into your \Oni\AE folder.&lt;br /&gt;
&lt;br /&gt;
[[Category:Oni Support]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=File:Off-center_render.png&amp;diff=43723</id>
		<title>File:Off-center render.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=File:Off-center_render.png&amp;diff=43723"/>
		<updated>2025-01-06T22:21:31Z</updated>

		<summary type="html">&lt;p&gt;Delano762: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A screenshot showcasing the issue where Oni renders offset to the screen center.&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=XML:TRAM&amp;diff=41294</id>
		<title>XML:TRAM</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=XML:TRAM&amp;diff=41294"/>
		<updated>2023-10-16T17:51:36Z</updated>

		<summary type="html">&lt;p&gt;Delano762: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{XML_File_Header | prev=TRAC | type=TRAM | next=TRAS | name=Totoro Animation}}&lt;br /&gt;
&lt;br /&gt;
{{TOCfloat|side=right}}&lt;br /&gt;
==General information==&lt;br /&gt;
TRAM files — animation data for characters — are basically made of three chunks:&lt;br /&gt;
* Metadata or &amp;quot;header&amp;quot;: animation type, state, flags, particle, sounds, etc.&lt;br /&gt;
* Animation data: &#039;&#039;&#039;pelvis heights, pelvis velocities (root motion)&#039;&#039;&#039;, bone rotations&lt;br /&gt;
* Attack data: damage, self-damage, extents (danger zones for AI awareness) and throws&lt;br /&gt;
&lt;br /&gt;
Root motion: a character moves by changing the position of its root bone (pelvis). The animated legs just create the &#039;&#039;&#039;illusion for the player&#039;&#039;&#039; that they are responsible for the motion.&lt;br /&gt;
&lt;br /&gt;
Bones: Each character has &#039;&#039;&#039;19 separate body parts&#039;&#039;&#039; which get animated (rotated) relative to each other. Compared to modern games Oni&#039;s bone system is [[wp:Deprecation|deprecated]]. The body doesn&#039;t get deformed by following animated bones. Oni modders often use the terms mesh and bone interchangeably. Only the pelvis has &#039;&#039;&#039;translation&#039;&#039;&#039; data (heights and velocities) besides rotations. The hierarchy of the body parts (or bones) is determined by [[XML:TRBS#Standard_TRIA_hierarchy|TRIA]].&lt;br /&gt;
&lt;br /&gt;
The term &#039;&#039;&#039;animation&#039;&#039;&#039; is often shortened to &#039;&#039;&#039;anim&#039;&#039;&#039; by modders, following the naming of commands in BSL: chr_wait_animstate, chr_wait_animtype, env_anim, etc.&lt;br /&gt;
&lt;br /&gt;
Oni&#039;s code and debugging messages tend to spell the word variant as &amp;quot;varient&amp;quot;. Blame the programmers for that one. Typically we use the correct spelling here, but OniSplit&#039;s XML follows Oni&#039;s misspelling, so you may see &amp;quot;varient&amp;quot; creep into the wiki here and there.&lt;br /&gt;
&lt;br /&gt;
TRAMs used in Oni follow a naming pattern. A list of all combat TRAMs in-game and their naming can be found [[Combat moves|here]].&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
* If the never-used Thrown type can be applied as type 18 the table looks much more complete. &amp;quot;Restoring&amp;quot; forward tackles (face-to-face, src run + tgt run) can be omitted as the AI would most often stop movement for actual combat?&lt;br /&gt;
&lt;br /&gt;
* All important header data of STRCOMrun_thw_fw_p and STRCOMrun_thw_fw_pl is identical. That means the engine picks the correct TRAM by using an unknown context, possibly this is similar or part of the distinction of &amp;quot;forward&amp;quot; (face-to-face) and &amp;quot;backward&amp;quot; (face-to-back).&lt;br /&gt;
: &#039;&#039;&#039;Maybe the algorithm checks always tgt&#039;s rotation and relative position to src at the same time but for most cases only tgt&#039;s rotation (facing) is relevant.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Also, STRCOMrun_thw_fw_p(l) routing to Thrown5 and Thrown6 shows that Thrown anim types might be used however we like. A src-tgt-anim-type-pairing might be simply a &#039;&#039;convention&#039;&#039;. Well, someone could check the source code...&lt;br /&gt;
&lt;br /&gt;
* The existence of STRCOMrun_thw_fw_p(_tgt) and STRCOMrun_thw_fw_pl(_t) means that we need extra research to understand the full extent of the throw system.&lt;br /&gt;
* The variant pickup system is not clear yet: is a RIFCOM idle and a RIFNAT idle both possible?&lt;br /&gt;
** Or do rightpistol, leftpistol, rightrifle and leftrifle variants count as subsets of combat?&lt;br /&gt;
&lt;br /&gt;
==Summary of animation lookup logic==&lt;br /&gt;
* First the game builds a pool of anims a character can use. They are loaded from the TRAC file registered in [[ONCC]], including parent TRACs.&lt;br /&gt;
* Anims from a child TRAC override those of the parent if their combination of state, type and variant is exactly the same.&lt;br /&gt;
* Child TRACs usually omit some anims. For example, Elite Strikers don&#039;t have their own run anims, so they use the parent anims of normal Strikers. See [[XML:TRAC|TRAC]] page for details.&lt;br /&gt;
* A character always possesses a single animation state. This term derives from state machines, but you only need to know that states are the first point in the decision path determining what anims are actually allowed to play at a given moment.&lt;br /&gt;
* Here is the full decision path:&lt;br /&gt;
** anim &#039;&#039;&#039;state&#039;&#039;&#039; check&lt;br /&gt;
** event (user input, or engine input for the AI) -&amp;gt; [[XML talk:StNA|context check]] -&amp;gt; anim &#039;&#039;&#039;type&#039;&#039;&#039; check&lt;br /&gt;
** anim &#039;&#039;&#039;variant&#039;&#039;&#039; check&lt;br /&gt;
** TRAC &#039;&#039;&#039;weight&#039;&#039;&#039; check&lt;br /&gt;
&lt;br /&gt;
===Elaboration===&lt;br /&gt;
Animations never stop – they flow from one to another. (See the concept of [[wp:State machine|state machines]] in gaming.) The default case is a character getting spawned and then just standing there: he idles forever. This brings us to the core attributes of every animation: &#039;&#039;&#039;type, state, variant&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Now then, the idle animation does not link to a specific follow-up animation – it rather links to a follow-up &#039;&#039;state&#039;&#039;.&lt;br /&gt;
: Ironically all anims have a &amp;lt;FromState&amp;gt; and a &amp;lt;ToState&amp;gt; field, but no obvious &amp;lt;CurrentState&amp;gt; which can cause confusion on what the current anim&#039;s state actually is. This gives us two options of how to think about the situation: either consider &amp;lt;FromState&amp;gt; as usually being the &amp;lt;CurrentState&amp;gt;, or states exist only &#039;&#039;between&#039;&#039; anims and serve as &#039;&#039;transition rules&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Linking to a follow-up state allows for multiple choices of what specific anim comes next. An anim is picked up randomly from a pool of valid anims. Their probability or &amp;lt;Weight&amp;gt; is determined by the anim listing in the TRAC – the anim collection (see &amp;quot;Weights&amp;quot; section for an explanation of exactly how &amp;lt;Weight&amp;gt; is handled).&lt;br /&gt;
&lt;br /&gt;
Anyway, to let an character flow from one anim state to another, the &amp;lt;ToState&amp;gt; is used. Let&#039;s say an SBG grenade hits Konoko. The particle&#039;s &#039;&#039;&#039;damage type&#039;&#039;&#039; is &#039;&#039;&#039;blownup&#039;&#039;&#039;; this and the direction of the incoming damage force an anim of type &#039;&#039;&#039;Blownup&#039;&#039;&#039; or &#039;&#039;&#039;BlownupBehind&#039;&#039;&#039; to play, such as TRAMKONOKOblownup1.&lt;br /&gt;
&lt;br /&gt;
Thus, Konoko falls to her back, going into the FallenBack state. The engine picks up the next anim which has &amp;lt;FromState&amp;gt;FallenBack. Also, receiving damage puts a character into combat mode, so further anims will be of variant Combat. But if the player gives no input, Konoko will remain on the ground, as &amp;lt;ToState&amp;gt;FallenBack creates a loop.&lt;br /&gt;
&lt;br /&gt;
So here&#039;s a question: why isn&#039;t a getup anim like KONCOMgetup_lt played automatically since it also has &amp;lt;FromState&amp;gt;FallenBack and &amp;lt;Varient&amp;gt;Combat? Answer: it differs in its &amp;lt;Type&amp;gt;. Most [[XML_talk:StNA|anim types are bound to user input]] and therefore are excluded from the automatically created pool of valid anims which can follow.&lt;br /&gt;
&lt;br /&gt;
Now let&#039;s consider what happens upon user input. A leftward movement of the mouse tells the engine to use an anim of type StandingTurnLeft. There are two anims with that type, KONOKOcomb_turnlt and KONCOMgetup_lt, but only the latter matches the current &amp;lt;FromState&amp;gt; condition.&lt;br /&gt;
: In fact, KONOKOcomb_turnlt has &amp;lt;Varient&amp;gt; Combat – the &amp;quot;comb&amp;quot; here stands for &amp;quot;combat&amp;quot;, not &amp;quot;combo&amp;quot;. Following Oni&#039;s naming convention, the file &#039;&#039;should&#039;&#039; have been named KONCOMturn_lt.&lt;br /&gt;
&lt;br /&gt;
Knowing this behavior, we can deduce that anim types registered to user input will make the engine ignore all the automatic anims inside the pool, therefore breaking the loop of KONCOMfallen_back. And since KONCOMgetup_lt has &amp;lt;ToState&amp;gt;Standing and Konoko is still in combat mode, the following idle anim must also have &amp;lt;Varient&amp;gt;Combat. So the next anim played will be KON&#039;&#039;&#039;COM&#039;&#039;&#039;idle1 or KON&#039;&#039;&#039;COM&#039;&#039;&#039;idle2.&lt;br /&gt;
&lt;br /&gt;
Konoko will eventually calm down when her ONCC &amp;lt;FightModeTimer&amp;gt; runs down, and then KON&#039;&#039;&#039;OKO&#039;&#039;&#039;idle1 or KON&#039;&#039;&#039;OKO&#039;&#039;&#039;idle2 will be played instead. (Actually, the COMidle will continue until a non-combat anim such as running breaks that loop. You won&#039;t ever see Konoko drop from combat readiness to her regular idle animation. Instead she will go from combat idle to running, to stopping, then standing at ease.)&lt;br /&gt;
&lt;br /&gt;
Note the fallback behavior of anim lookup: if the engine cannot find an anim for the active variant (or &amp;quot;mode&amp;quot;) of the character, it will choose the normal (non-variant-matching) version. Anims can be in the following variants: Combat, LeftPistol, LeftRifle, Panic, RightPistol, RightRifle and Sprint.&lt;br /&gt;
&lt;br /&gt;
As for combinations of variants, it&#039;s possible, yes, but rarely and only Sprint and one weapon variant at a time.&lt;br /&gt;
&lt;br /&gt;
==Weights==&lt;br /&gt;
Let&#039;s say that we&#039;re playing as a Ninja, we are in the state Standing, and we hit the action key to perform a taunt. The engine recognizes the context (no console to interact with), places the character in combat mode, and looks up anims of type Taunt. Since we are in combat mode, the next anim must be of variant Combat if possible. These lookups boil down to two valid possible anims: NINCOMtaunt1 (a spin) and NINCOMtaunt2 (the [[wp:Moon walk|moon walk]] Easter egg). The engine picks one of them randomly.&lt;br /&gt;
&lt;br /&gt;
However, NINCOMtaunt1 has a TRAC Weight (probability) of 100 while NINCOMtaunt2 has a TRAC Weight value of just 5. So the chances are quite high that we will not see the moon walk taunt.&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;TRACAnimation&amp;gt;&lt;br /&gt;
                &amp;lt;Weight&amp;gt;100&amp;lt;/Weight&amp;gt;&lt;br /&gt;
                &amp;lt;Animation&amp;gt;TRAMNINCOMtaunt1&amp;lt;/Animation&amp;gt;&lt;br /&gt;
            &amp;lt;/TRACAnimation&amp;gt;&lt;br /&gt;
            &amp;lt;TRACAnimation&amp;gt;&lt;br /&gt;
                &amp;lt;Weight&amp;gt;5&amp;lt;/Weight&amp;gt;&lt;br /&gt;
                &amp;lt;Animation&amp;gt;TRAMNINCOMtaunt2&amp;lt;/Animation&amp;gt;&lt;br /&gt;
            &amp;lt;/TRACAnimation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If there is only one anim to choose from, it will always play no matter what its Weight, even if it is zero. When it comes to multiple anims being a valid choice, the calculation is: weight of anim / sum of all valid anim weights. For NINCOMtaunt2, this means 5 / 105 = 0.047, or a 4.7% chance of a moon walk.&lt;br /&gt;
&lt;br /&gt;
==Idle timer==&lt;br /&gt;
There&#039;s a semi-famous Easter egg where [https://www.youtube.com/watch?v=qbo2Q-VD6dc Konoko will sneeze] if she stands still for a long time. The timer for this is so long that most players never see it unless they step away from the game and leave it running without hitting F1. You might think that the way the sneeze is triggered is to set a low weight for it so that it&#039;s very unlikely a repeating idle cycle will choose the anim. But here&#039;s the sneeze anim in the TRAC with a Weight of 100:&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;TRACAnimation&amp;gt;&lt;br /&gt;
                &amp;lt;Weight&amp;gt;100&amp;lt;/Weight&amp;gt;&lt;br /&gt;
                &amp;lt;Animation&amp;gt;TRAMKONOKOidle_spec3&amp;lt;/Animation&amp;gt;&lt;br /&gt;
            &amp;lt;/TRACAnimation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What&#039;s going on here? All regular idle anims are in fact of &#039;&#039;&#039;type Stand&#039;&#039;&#039;, while Konoko&#039;s idle_spec3 anim above is of &#039;&#039;&#039;type Idle&#039;&#039;&#039;. Anims of &#039;&#039;&#039;type Idle&#039;&#039;&#039; are played every time the idle animation timer expires.  This is found in ONCC as &amp;lt;IdleAnimation1Timer&amp;gt; and &amp;lt;IdleAnimation2Timer&amp;gt;. These timers are set to 30,000 for every character. The number is in ticks, so if we convert to minutes – 30,000 / 60 / 60 = 8.3̅ – we find that the secret idle anim for Konoko (or any character) will play every 8⅓ minutes.&lt;br /&gt;
&lt;br /&gt;
==List of tags, types, and flags==&lt;br /&gt;
Use the search function in your browser to quickly find a tag.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=100%&lt;br /&gt;
|width=120px| &#039;&#039;&#039;tag&#039;&#039;&#039;&lt;br /&gt;
|width=100px| &#039;&#039;&#039;type&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Lookup&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Type&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_types|HERE]]. The pool of valid TRAMs (animations a character can choose from) is built from the TRAC files registered in the ONCC. Most of the anim types are connected to player inputs.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;AimingType&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_types|HERE]]. The pool of valid TRAMs, and therefore TRASs (aiming screens a character can choose from) is built from the TRSC files registered in the ONCC.&lt;br /&gt;
:&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;FromState&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
| [[Image:chr_debug_characters_shows_interpolated_animations.jpg|thumb|400px|right|Primary &amp;lt;FromState&amp;gt; in &amp;lt;Lookup&amp;gt; uses about 8 interpolating frames by default. Use Shortcut&#039;s &amp;lt;FromState&amp;gt; to override this frame number.]]&lt;br /&gt;
&lt;br /&gt;
Look them up over [[XML:StNA#Animation_states|HERE]].&lt;br /&gt;
: When FromState is set to None, some default behaviors are ignored and are replaced by Shortcuts.&lt;br /&gt;
: Shortcuts extend the number of states from which an animation can be played and under what conditions (replacing this atomic yes/no).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ToState&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_states|HERE]].&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Varient&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|(misspelled because Oni misspells it) If unused, the tag will simply be &amp;quot;&amp;lt;Varient /&amp;gt;&amp;quot;, such as for non-combat animations. Otherwise it contains one of these values:&lt;br /&gt;
: Combat&lt;br /&gt;
: LeftPistol&lt;br /&gt;
: LeftRifle&lt;br /&gt;
: Panic&lt;br /&gt;
: RightPistol&lt;br /&gt;
: RightRifle&lt;br /&gt;
: Sprint&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;FirstLevel&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|Number of first level in which move becomes available to the player (&amp;quot;0&amp;quot; to make it available from the start).&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Shortcuts&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
|&lt;br /&gt;
Works as an &#039;&#039;&#039;alternative FromState&#039;&#039;&#039; collection.&lt;br /&gt;
&lt;br /&gt;
Shortcuts are accepted if their &amp;lt;Shortcut&amp;gt;&amp;lt;FromState&amp;gt; value differs from the &amp;quot;primary&amp;quot; &amp;lt;Lookup&amp;gt;&amp;lt;FromState&amp;gt; value. In other words, if you want to make a &#039;&#039;&#039;Shortcut&#039;&#039;&#039; that uses the &#039;&#039;&#039;same FromState&#039;&#039;&#039; value then you have to set &#039;&#039;&#039;primary FromState&#039;&#039;&#039; value to &#039;&#039;&#039;None&#039;&#039;&#039;. By doing that, the hardcoded interpolation frame length of about 8 frames can be overridden.&lt;br /&gt;
&lt;br /&gt;
In the following example, the new interpolation length is 0. This will require the animation to match perfectly with the previous one. For a smooth transition to the next animation, set a suitable value at &amp;lt;Interpolation&amp;gt;&amp;lt;End&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Lookup&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
            &amp;lt;FromState&amp;gt;None&amp;lt;/FromState&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
            &amp;lt;Shortcuts&amp;gt;&lt;br /&gt;
                &amp;lt;Shortcut&amp;gt;&lt;br /&gt;
                    &amp;lt;FromState&amp;gt;Standing&amp;lt;/FromState&amp;gt;&lt;br /&gt;
                    &amp;lt;Length&amp;gt;0&amp;lt;/Length&amp;gt;&lt;br /&gt;
                    &amp;lt;ReplaceAtomic&amp;gt;no&amp;lt;/ReplaceAtomic&amp;gt;&lt;br /&gt;
                &amp;lt;/Shortcut&amp;gt;&lt;br /&gt;
            &amp;lt;/Shortcuts&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:TRAM interpolation - standard case.jpg|thumb|400px|left|Scenario A: hardcoded interpolation of 8 frames. Scenario B: changeable interpolation frame number.]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Shortcut&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;FromState&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_types|HERE]].&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Length&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int16&lt;br /&gt;
|Amount of interpolating frames. While interpolations of rotation are less noticeable, interpolations of different positions can cause drift (i.e. sliding).&lt;br /&gt;
&lt;br /&gt;
This is especially observed for transitions from idle to movements and vice versa — basically any combination of animations with different accelerations at start and end. By default, animations without specified Shortcut interpolation give about 8 frames of interpolation. For moves starting or ending in idle, it&#039;s better not to use interpolation. Just give the start and end frames the same positions and rotation values as the idle. Interpolations should always be considered a &#039;&#039;last resort&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
This drift can be observed even in vanilla animations — most prominently in Konoko&#039;s comb_k. Konoko&#039;s left foot should be in a fixed position as the animation starts from from Konoko&#039;s idle pose. However, the interpolation is causing her left foot to drift noticeably to the right and a bit forward.&lt;br /&gt;
&lt;br /&gt;
The reason this happens is because the interpolation &amp;quot;mixes&amp;quot; two animations. When one animation transitions into another via interpolation, part of the animation system continues playing the initial animation, and part of it is playing the follow-up animation, with all the rotations and positions getting linearly interpolated.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;ReplaceAtomic&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: yes&lt;br /&gt;
: no&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Flags&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|These are top-level flags on the whole animation. See the other &amp;lt;Flags&amp;gt; for flags on an attack part.&lt;br /&gt;
:RuntimeLoaded&lt;br /&gt;
::(This bit is not stored on disk; it is used at runtime to mark that the animation was loaded.)&lt;br /&gt;
:Invulnerable&lt;br /&gt;
::While playing this animation, the player is invulnerable to melee damage and also cannot be thrown. Damage from particles and fall damage still hurt.&lt;br /&gt;
:BlockHigh&lt;br /&gt;
::While playing this animation, the player is invulnerable to high or undefined attacks within some arc in front of him. If you set this flag on an animation where the player character is spinning, then the character can still be kicked in the back or thrown.&lt;br /&gt;
:BlockLow&lt;br /&gt;
::Same as above, only it can block low or undefined attacks.&lt;br /&gt;
:Attack&lt;br /&gt;
::Animations with an attack part have this turned on. It&#039;s unclear what it does, but it may enable the melee soft-lock (where the character turns a bit during the animation to face a nearby enemy).&lt;br /&gt;
:DropWeapon&lt;br /&gt;
::If the player is armed, he drops his weapon when this animation plays.&lt;br /&gt;
:InAir&lt;br /&gt;
::Something to do with jumps; not investigated.&lt;br /&gt;
:Atomic&lt;br /&gt;
::The whole animation must be played; player cannot interrupt it once it starts.&lt;br /&gt;
:NoTurn&lt;br /&gt;
:::Player cannot turn by mouse while performing this animation.&lt;br /&gt;
:AttackForward&lt;br /&gt;
::Unknown, but it looks like this is a hint for the AI about where an attack is aiming, from the player&#039;s point of view.&lt;br /&gt;
:AttackLeft&lt;br /&gt;
::Same as above.&lt;br /&gt;
:AttackRight&lt;br /&gt;
::Same as above.&lt;br /&gt;
:AttackBackward&lt;br /&gt;
::Same as above.&lt;br /&gt;
:Overlay&lt;br /&gt;
::Not a standalone animation; it just overwrites part of an already-playing one, e.g. the weapon-holstering animation.&lt;br /&gt;
:DontInterpolateVelocity&lt;br /&gt;
::Unknown, but maybe it has something to do with {x,y,z} velocities and the fact that directional jumps, for example, take information about their direction vector from the {x,z} velocity part of the TRAM (the vertical Y component is in the ONCC).&lt;br /&gt;
:ThrowSource&lt;br /&gt;
::Unknown, but throws use it.&lt;br /&gt;
::: Probably a developer relic. Throws work in animation pairs: whenever a throw source is played, the other character must perform the throw target animation. See throw(n) types:&lt;br /&gt;
:::: TRAM &amp;lt;TargetType&amp;gt;&lt;br /&gt;
:::: [[XML:StNA#Animation_types|StNA]] (First &amp;lt;u&amp;gt;used&amp;lt;/u&amp;gt; throw starts at #96.)&lt;br /&gt;
::: Characters have only their own pool of animations available. And since enemy&#039;s TRAC might not contain the necessary animation the information must be provided by the throw source TRAC. &lt;br /&gt;
::: Since every throw animation must have a throw animation type the ThrowSource flag is actually redundant.&lt;br /&gt;
:ThrowTarget&lt;br /&gt;
::Animation can hurt anybody with its attack part, including teammates. The player can even hurt himself with the TRAM&#039;s damage part (whereas a player cannot hurt himself with his own animation&#039;s attack part). It also allows two attack parts to be executed instead of only one (maybe a bug? more than two will result in a crash).&lt;br /&gt;
:::If you set the first attack part to be able to deal damage from the 1st to the 100th frame of the TRAM, and the second attack part to deal damage within that range (e.g. from the 25th to the 41st frame), then the first attack part will deal damage from the 1st to the 100th frame (as usual), but even if it hits, that second attack part can hurt the enemy as well during frames 25–41. Note that the second attack part must be executed within the first attack part&#039;s active &amp;quot;window&amp;quot;, otherwise it won&#039;t work.&lt;br /&gt;
:RealWorld&lt;br /&gt;
::It appears this flag was used to create a TRAM and an OBAN from one animation source. The OBAN is supposed to store pelvis rotations and positions, allowing a character to move over obstacles/gaps. The vast majority of them are used in cutscenes.&lt;br /&gt;
:DoAim&lt;br /&gt;
::Applies the aiming animation overlay (PIS/RIF) if the player has a weapon.&lt;br /&gt;
:DontAim&lt;br /&gt;
::An aiming overlay will not be applied.&lt;br /&gt;
:CanPickup&lt;br /&gt;
::Player can pick up an item during this animation if he intersects with one during his movement.&lt;br /&gt;
:Aim360&lt;br /&gt;
::Unknown.&lt;br /&gt;
:DisableShield&lt;br /&gt;
::If the player has an active supershield (chr_super &amp;quot;name&amp;quot; 1), this forces him to disable it (chr_super &amp;quot;name&amp;quot; 0)&lt;br /&gt;
:NoAIPickup&lt;br /&gt;
::AIs are not permitted to pick up items with this animation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Atomic&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Makes animation particle atomic?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Invulnerable&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Character will not take melee damage during a time frame defined by the Start and End frames.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| First frame of character being invulnerable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Last frame of character being invulnerable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Overlay&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;UsedBones&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|Simply contains &amp;quot;&amp;lt;UsedBones /&amp;gt;&amp;quot; if no bones are involved, otherwise:&lt;br /&gt;
:Pelvis&lt;br /&gt;
:LeftThigh&lt;br /&gt;
:LeftCalf&lt;br /&gt;
:LeftFoot&lt;br /&gt;
:RightThigh&lt;br /&gt;
:RightCalf&lt;br /&gt;
:RightFoot&lt;br /&gt;
:Mid&lt;br /&gt;
:Chest&lt;br /&gt;
:Neck&lt;br /&gt;
:Head&lt;br /&gt;
:LeftShoulder&lt;br /&gt;
:LeftArm&lt;br /&gt;
:LeftWrist&lt;br /&gt;
:LeftFist&lt;br /&gt;
:RightShoulder&lt;br /&gt;
:RightArm&lt;br /&gt;
:RightFist&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;ReplacedBones&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
| &amp;quot;&amp;lt;ReplacedBones /&amp;gt;&amp;quot; if unused, otherwise:&lt;br /&gt;
:Pelvis&lt;br /&gt;
:LeftThigh&lt;br /&gt;
:LeftCalf&lt;br /&gt;
:LeftFoot&lt;br /&gt;
:RightThigh&lt;br /&gt;
:RightCalf&lt;br /&gt;
:RightFoot&lt;br /&gt;
:Mid&lt;br /&gt;
:Chest&lt;br /&gt;
:Neck&lt;br /&gt;
:Head&lt;br /&gt;
:LeftShoulder&lt;br /&gt;
:LeftArm&lt;br /&gt;
:LeftWrist&lt;br /&gt;
:LeftFist&lt;br /&gt;
:RightShoulder&lt;br /&gt;
:RightArm&lt;br /&gt;
:RightFist&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;DirectAnimations&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Link&amp;gt;&lt;br /&gt;
| link&lt;br /&gt;
| First slot. &amp;quot;&amp;lt;Link /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Link&amp;gt;&lt;br /&gt;
| link&lt;br /&gt;
| Second slot. &amp;quot;&amp;lt;Link /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Pause&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Hard&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| In ticks. The Hard and Soft pause values are ignored if this animation has a direct link (above) to another animation.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Soft&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int16&lt;br /&gt;
| In ticks. As mentioned above, the player cannot enter new inputs during this pause unless this animation is part of a combo animation defined by &amp;lt;DirectAnimations&amp;gt;&amp;lt;Link&amp;gt;.&lt;br /&gt;
: Examples:&lt;br /&gt;
: COMcomb_p, (no pause) COMcomb_p_p&lt;br /&gt;
: COMcomb_p, (pause) COMcomb_k&lt;br /&gt;
&lt;br /&gt;
The difference between the hard and soft pause is that you can block during the soft pause and not the hard pause.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Interpolation&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;End&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int16&lt;br /&gt;
|&lt;br /&gt;
* interpolates first X frames of next animation&lt;br /&gt;
* if the first follow-up animation is too short, it can continue to play even further (not observed with vanilla anims)&lt;br /&gt;
&lt;br /&gt;
While interpolations with rotations are less noticeable, interpolations of different positions can cause an additional drift.&lt;br /&gt;
&lt;br /&gt;
This was especially observed for transitions of idle to movements and vice versa — basically any combination of animations with different accelerations at the start and end. By default, animations without a specified Shortcut interpolation get about 8 frames of interpolation. For moves starting or ending in idle, it&#039;s better not to use interpolation. Just give the start and end frames the same positions and rotation values as the idle. Interpolations should always be considered a &#039;&#039;last resort&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:TRAM interpolations - end interpolation bigger than next anim.jpg|thumb|400px|left|&amp;quot;End&amp;quot; interpolation covering multiple follow-up animations.]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Max&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| unused&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;FinalRotation&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| float&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| Ending rotation in degrees. (During an animation, the camera is detached rotation-wise. If this value matches the body&#039;s final rotation, it will prevent a &amp;quot;glitchy&amp;quot; re-attaching.)&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Direction&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
| Used by [[AI#Melee_combat_behaviors|AI melee system]].&lt;br /&gt;
:None&lt;br /&gt;
:Forward&lt;br /&gt;
:Backward&lt;br /&gt;
:Left&lt;br /&gt;
:Right&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Vocalization&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| ID of one of the [[XML:SNDD#Step_1:_Preparing_the_TRAM|SoundConstants in ONCC]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ActionFrame&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Frame number for any special events associated with this animation: weapon theft via disarm, weapon holstering, Mukade teleporting, items getting handed over to player, etc.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Impact&amp;gt;&lt;br /&gt;
| link&lt;br /&gt;
| &amp;quot;&amp;lt;Impact /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Particles&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
| serves as group element&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Particle&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
| holds individual particle data&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Start&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int&lt;br /&gt;
| frame number for particle to start&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;End&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int&lt;br /&gt;
| frame number for particle to end (if the number exceeds frame count of animation, the particle will simply die at the end of the animation)&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Bone&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: Pelvis &lt;br /&gt;
: LeftThigh &lt;br /&gt;
: LeftCalf &lt;br /&gt;
: LeftFoot &lt;br /&gt;
: RightThigh &lt;br /&gt;
: RightCalf &lt;br /&gt;
: RightFoot &lt;br /&gt;
: Mid &lt;br /&gt;
: Chest &lt;br /&gt;
: Neck &lt;br /&gt;
: Head &lt;br /&gt;
: LeftShoulder &lt;br /&gt;
: LeftArm &lt;br /&gt;
: LeftWrist &lt;br /&gt;
: LeftFist &lt;br /&gt;
: RightShoulder &lt;br /&gt;
: RightArm &lt;br /&gt;
: RightFist&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Name&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| link&lt;br /&gt;
| particle name in [[XML:ONCC#ONCP:_Oni_Character_Particle_.28Array.29|ONCC-ONCP]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| sequence element&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Bones&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: Pelvis &lt;br /&gt;
: LeftThigh &lt;br /&gt;
: LeftCalf &lt;br /&gt;
: LeftFoot &lt;br /&gt;
: RightThigh &lt;br /&gt;
: RightCalf &lt;br /&gt;
: RightFoot &lt;br /&gt;
: Mid &lt;br /&gt;
: Chest &lt;br /&gt;
: Neck &lt;br /&gt;
: Head &lt;br /&gt;
: LeftShoulder &lt;br /&gt;
: LeftArm &lt;br /&gt;
: LeftWrist &lt;br /&gt;
: LeftFist &lt;br /&gt;
: RightShoulder &lt;br /&gt;
: RightArm &lt;br /&gt;
: RightFist&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Start frame of motion blur sequence&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| End frame of motion blur sequence&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Lifetime&amp;gt;&lt;br /&gt;
| int8&lt;br /&gt;
| Lifetime of each &amp;quot;ghost&amp;quot; in frames. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Alpha&amp;gt;&lt;br /&gt;
| int8&lt;br /&gt;
| Transparency of &amp;quot;ghosts&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Interval&amp;gt;&lt;br /&gt;
| int8&lt;br /&gt;
| Frame interval between each rendered &amp;quot;ghost&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Footsteps&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Footstep&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Type&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: Left&lt;br /&gt;
: Right&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Sounds&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &amp;quot;&amp;lt;Sounds /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Sound&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Name&amp;gt;&lt;br /&gt;
| char[32]&lt;br /&gt;
| &amp;lt;font color=&amp;quot;#777777&amp;quot;&amp;gt;OSBD&amp;lt;/font&amp;gt;file&amp;lt;font color=&amp;quot;#777777&amp;quot;&amp;gt;.imp.oni&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#777777&amp;quot;&amp;gt;(don&#039;t use resource type&#039;s prefix or suffix)&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|The frame when the sound starts to play.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Heights&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Height&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
|Absolute position.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Velocities&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Velocity&amp;gt;&lt;br /&gt;
| 2 x float&lt;br /&gt;
|Relative positions (delta values); the numbers represent the change in position from one frame to another.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Rotations&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Bone&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|There are 19 bone tags, one for each [[TRIA#Bones|body part]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;EKey&amp;gt;&lt;br /&gt;
| int8 + 3 * float&lt;br /&gt;
|For normal animations. The first value is the number of frames for which the rotation is maintained; the sum of all of these first EKey components always equals the total number of frames for the animation.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;QKey&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int8 + 4 * float&lt;br /&gt;
|For overlay animations used by [[TRAS|TRAS]] aiming screens.&lt;br /&gt;
&lt;br /&gt;
OniSplit v0.9.54.0 produces &amp;lt;QKey&amp;gt;s (quaternions) instead of &amp;lt;EKey&amp;gt;s (Euler rotations) for normal animations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;PositionOffset&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &amp;lt;PositionOffset&amp;gt; and &amp;lt;Positions&amp;gt; belong together. In the [[OBD:TRAM/raw0x30|binaries]], they are written in place. &#039;&#039;&#039;Seems unused; changing them has no effect in-game.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;X&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Z&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Positions&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Position&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| seems to be unused (and when checking this with &amp;quot;chr_debug_sphere = 1&amp;quot;, the spheres remain unchanged)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Height&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| vertical extent&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;YOffset&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| Y offset of the vertical extent from character location &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ThrowSource&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &amp;quot;&amp;lt;ThrowSource /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;TargetAdjustment&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Used to position targets during throws, relative to the position of the character executing the throw.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Position&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| 3 * float&lt;br /&gt;
| Contains XYZ values, which position the target character:&lt;br /&gt;
*X - Side axis. Negative values move the target to the right and positive values move the target to the left.&lt;br /&gt;
*Y - Height axis. Negative values move the target downwards, but cannot make the target go below the floor. Positive values make the target go upwards — if the value is too big, the target will teleport upward and then immediately start falling, interrupting the target animation.&lt;br /&gt;
*Z - Forward axis. Negative values move the target backwards and positive values move the target forward.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Angle&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| In radians - adjusts the rotation of the target in Oni&#039;s Y axis; most of the time (if not always) it&#039;s set to &#039;&#039;3.14159274&#039;&#039; radians in vanilla anims, equaling 180 degrees - which effectively rotates the rotates by those 180 degrees; if it was set to 0, the target would face the throw source character with his back.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Distance&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| Activation distance. The throw can be triggered if it is within this range. However the value must be greater than the equivalent TRAM in the parent TRAC.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;TargetType&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
| The flags are part of the [[XML:StNA#Animation_types|animation type list]].&lt;br /&gt;
&lt;br /&gt;
(static throws)&lt;br /&gt;
: Thrown1 = ###COMthrow_fw_p_tgt&lt;br /&gt;
: Thrown2 = ###COMthrow_fw_k_tgt&lt;br /&gt;
: Thrown3 = ###COMthrow_bk_p_tgt&lt;br /&gt;
: Thrown4 = ###COMthrow_bk_k_tgt&lt;br /&gt;
(running throws)&lt;br /&gt;
: Thrown5 = ###COMrun_throw_fw_p_tgt&lt;br /&gt;
: Thrown6 = ###COMrun_throw_fw_p_tgt&lt;br /&gt;
: Thrown7 = ###COMrun_throw_bk_k_tgt&lt;br /&gt;
: Thrown8 = ###COMrun_throw_bk_k_tgt (not tested)&lt;br /&gt;
(tackle throw = catching)&lt;br /&gt;
: Thrown9 = ###COMrun_tkl_fw_p_tgt (not tested)&lt;br /&gt;
: Thrown10 = ###COMrun_tkl_bk_p_tgt&lt;br /&gt;
(pistol disarms)&lt;br /&gt;
: Thrown11 = ###PISthrow_fw_p_tgt&lt;br /&gt;
: Thrown12 = ###PISthrow_fw_k_tgt&lt;br /&gt;
: Thrown13 = ###PISthrow_bk_p_tgt&lt;br /&gt;
(rifle disarm)&lt;br /&gt;
: Thrown14 = ###PISthrow_bk_k_tgt (not tested)&lt;br /&gt;
: Thrown15 = ###RIFthrow_fw_p_tgt&lt;br /&gt;
: Thrown16 = ###RIFthrow_bk_p_tgt&lt;br /&gt;
: Thrown17 = ###RIF? = (not tested)&lt;br /&gt;
----&lt;br /&gt;
About the naming:&lt;br /&gt;
: &amp;quot;fw&amp;quot; = face-to-face throw&lt;br /&gt;
: &amp;quot;bk&amp;quot; = thrower is facing victim&#039;s back&lt;br /&gt;
: &amp;quot;throw&amp;quot; inside TRAM names is sometimes shortened to &amp;quot;thr&amp;quot;&lt;br /&gt;
: &amp;quot;p&amp;quot;/&amp;quot;k&amp;quot; = triggered by punch or kick button (&amp;quot;p&amp;quot; is sometimes omitted)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;SelfDamage&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&amp;quot;&amp;lt;SelfDamage /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
&lt;br /&gt;
Works only with specific, hardcoded AnimTypes (mainly ThrownX, it&#039;s unknown if any other types work - that remains to be investigated). Using SelfDamage on an AnimType that wasn&#039;t intended for it will cause the game to crash. (ToDo: Checked if &amp;lt;Flag&amp;gt;ThrowTarget is enough to explain this. Modify a simple kick? For more please link to and use talk page.)&lt;br /&gt;
&lt;br /&gt;
From a practical standpoint, this means SelfDamage can be used only on ThrowTarget animations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Damage&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| sequence element&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Points&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Damage taken by character.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Frame of the animation when damage is dealt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Attacks&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Attack&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
| Only 2 attack parts per file are allowed. Normally the target gets only one hit. But if the attack frame ranges of both attack parts are overlapping, then the target can be [http://oni.bungie.org/forum/viewtopic.php?pid=39787#p39787 hit by both of them].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| First frame where damage can be inflicted on an opponent.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Last frame where damage can be inflicted on an opponent.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Bones&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| The bones which can inflict damage.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Flags&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|These are flags on an attack part, inside an &amp;lt;Attacks&amp;gt;&amp;lt;Attack&amp;gt; element. See the previous &amp;lt;Flags&amp;gt; for general flags on the TRAM.&lt;br /&gt;
: Unblockable&lt;br /&gt;
: Low - Target of attack needs to crouch in order to block this attack.&lt;br /&gt;
: High - Blocker needs to stand; if both Low and High are set, blocker can block from both standing and crouching positions.&lt;br /&gt;
: HalfDamage - Blocker receives half of the normal damage.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Knockback&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| Target gets knocked back by this amount.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;HitPoints&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Damage points inflicted by attack.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;HitType&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Animation type for opponent&#039;s animation when the attack isn&#039;t blocked. The flags are part of the [[XML:StNA#Animation_types|animation type list]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;HitLength&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Number of frames that the target should remain in his hit animation state when he gets hit.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;StunLength&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Number of frames that the target should remain in his blocking animation state when he blocks the attack.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;StaggerLength&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Number of frames that the target should perform his stagger animation after a successful block.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Extents&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Explained below. Automatically calculated by OniSplit if there&#039;s a DAE file referenced in the XML.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Extent&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| One tag per attack frame. Number of &amp;lt;Extent&amp;gt; tags = &amp;lt;Attack&amp;gt;&amp;lt;End&amp;gt; - &amp;lt;Attack&amp;gt;&amp;lt;Start&amp;gt; + 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Angle&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| In degrees.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Length&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MinY&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MaxY&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;AttackRing&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|  parent tag&lt;br /&gt;
| Always contains 36 &amp;lt;Length&amp;gt; tags, explained below. Automatically calculated by OniSplit if there&#039;s a DAE file referenced in the XML. (AttackRing was formerly known as &amp;quot;horizontal extents&amp;quot; in older versions of OniSplit.)&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Length&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| float&lt;br /&gt;
| Horizontal extents, explained below. They create a &amp;quot;danger zone&amp;quot; around the attacker which the AI uses to try to dodge an attack.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Export==&lt;br /&gt;
TRAM files can be extracted &#039;&#039;&#039;A) as pure XML&#039;&#039;&#039; files or &#039;&#039;&#039;B) as a pair of XML and DAE&#039;&#039;&#039; files. For editing the actual animation, you will want to use method B. While exporting an ONCC, you might see errors such as:&lt;br /&gt;
&lt;br /&gt;
 Cannot find instance &#039;TRAMKONCOMthrow_rev&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONCOMthrow_rev&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONRIFturn_right&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONOKOlev18_ZomStand&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONOKOcorner_hide&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONPIScorner_hide&#039;&lt;br /&gt;
&lt;br /&gt;
Ignore them, as those files doesn&#039;t exist. (Someday we should remove them from the TRACs.)&lt;br /&gt;
&lt;br /&gt;
===Via command line===&lt;br /&gt;
To export a single TRAM:&lt;br /&gt;
 onisplit -extract:xml output_path -anim-body:path_to\TRBS_or_ONCCname.oni path_to\TRAMname.oni&lt;br /&gt;
&lt;br /&gt;
To export merged TRAMs:&lt;br /&gt;
 onisplit -extract:xml output_path &#039;&#039;&#039;-anim-merge&#039;&#039;&#039; -anim-body:path_to\TRBS_or_ONCCname.oni path_to\TRAMname1.oni  path_to\TRAMnameN.oni&lt;br /&gt;
&lt;br /&gt;
===Via Vago===&lt;br /&gt;
[[Image:Vago_xml_plus_dae_extraction.png|thumb|200px|right|Combined extraction of DAE and XML.]]&lt;br /&gt;
&lt;br /&gt;
Change to Characters tab and follow these steps.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 1:&#039;&#039;&#039; Select &amp;quot;TRAM ONI&amp;quot; as input format (&amp;quot;From&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 2:&#039;&#039;&#039; Select &amp;quot;XML / XML &amp;amp; DAE&amp;quot; as output format (&amp;quot;To&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 3:&#039;&#039;&#039; Tick checkbox &amp;quot;Extract with TRBS / ONCC&amp;quot;. It&#039;s important this is done before adding a TRAM file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 4:&#039;&#039;&#039; Set full path of ONCC or TRBS.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 5:&#039;&#039;&#039; Add TRAM file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 6:&#039;&#039;&#039; Click &amp;quot;Convert&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Via Simple OniSplit GUI===&lt;br /&gt;
There was a long-standing problem with combined ONCC/TRAM files where the textures would be missing.&amp;lt;!--[Iritscen: I don&#039;t understand this sentence; is it important to keep this historical note?][Paradox: Geyser still didn&#039;t release a new OniSplit containing that fix, right?] With an older method you couldn&#039;t export non-native TRAM which meant to the TRAM had to be registered in the TRAC the ONCC is using.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.paradox.oni2.net/programs/Simple_OniSplit_GUI.zip Simple OniSplit GUI]&#039;&#039;&#039; post-edits the DAE to fix missing textures. The character-related .oni files must be all in one folder. Usually the level0_Final folder does the trick.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 1:&#039;&#039;&#039; Drag and drop the TRAM and ONCC into the [http://www.paradox.oni2.net/images/simpleOniSplitGui.png big field.] (One by one or simultaneously; the order doesn&#039;t matter.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 2:&#039;&#039;&#039; Hit &amp;quot;Convert&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Editing 3D data==&lt;br /&gt;
===Blender===&lt;br /&gt;
See the [[Blender]] article for a general tutorial on using the free program to create animations for Oni. It also contains a Blender addon for automating certain tasks, troubleshooting advice, and links to an animation rig that makes animation much easier.&lt;br /&gt;
&lt;br /&gt;
===XSI===&lt;br /&gt;
In the past, the community&#039;s preferred tool for any 3D modeling and animation was {{ModTool}}. However, this free program was discontinued in 2014, and modders did not want to be tied to an aging (not to mention Windows-only) program. Thus, we have generally moved to using Blender (see next section). The following information is preserved for historical purposes.&lt;br /&gt;
----&lt;br /&gt;
For the correct Mod Tool settings, see [[Mod Tool#Animating|HERE]].&lt;br /&gt;
&lt;br /&gt;
Here are some hints for creating animations when there is no rigging available:&lt;br /&gt;
* Use the ONCC model in your 3D editor that will actually make use of the animations. This makes sure that the pelvis height will match and that the character&#039;s feet will not float in the air or go through the ground. &lt;br /&gt;
* The first frame and last frames should match the probable previous and follow-up animations. This will reduce the necessity for long interpolations.&lt;br /&gt;
* When setting keyframes, each body part should have moved. This rule of thumb will give a more natural-looking animation.&lt;br /&gt;
* The first body part to be animated is always the pelvis.&lt;br /&gt;
* Watch out for pelvis rotations so that the XYZ rotations don&#039;t overlap too much, otherwise you will get into a [[wp:Gimbal_lock|gimbal lock]].&lt;br /&gt;
&lt;br /&gt;
Also see our [http://oni.bungie.org/forum/viewtopic.php?id=1433 OCF thread].&lt;br /&gt;
&lt;br /&gt;
==Import==&lt;br /&gt;
 onisplit -create output_path path_to\TRAMname.xml&lt;br /&gt;
&lt;br /&gt;
==Common operations on animations by the community==&lt;br /&gt;
===Speeding up existing animations===&lt;br /&gt;
s10k has created an XmlTools script that allows the speed-up of any existing TRAM by removing frames. More information and download link [http://mods.oni2.net/node/354 here.]&lt;br /&gt;
&lt;br /&gt;
==Selected notes on animation types==&lt;br /&gt;
===Attacks===&lt;br /&gt;
====Extents and XML====&lt;br /&gt;
&#039;&#039;&#039;As a regular modder you don&#039;t need to know how the attack ring and the extents get calculated.&#039;&#039;&#039; If you just want to create an attack animation then add an appropriate &amp;lt;Attacks&amp;gt; code block to your XML as seen in the [[#Using OniSplit to calculate extents|section below]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;How attack ring (horizontal extents) and extents get calculated&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Ever wondered how the AI can recognize incoming attacks and block or dodge them? Extents (found by geyser and fully uncovered by Neo) are the key. Imagine the character looked at from above, and visualize a circle with this character being at the center of the circle. Now divide this circle into 10° segments, and those are the 36 units of horizontal extents (that is, the lateral reach of the attack). The 0° point is directly in front of the character and 180° is behind the character. The segments run clockwise around the character. So the first Extent tag is the horizontal reach on the 0° line, the second tag is for the line 10° clockwise, and so on. Note that a frontal attack like a simple kick could hit a target not only if he&#039;s standing at 0° (directly in front), but also at 10° or 20° to the right, and also at 340° and 350° (a bit to the left). When setting these manually, you should guess the inner and outer ranges of the reach of the attacker&#039;s bones that have damage attached to them. Test these values with an AI that blocks often. If you did it right, your attack will often be blocked, but if the extent length is too high, the AIs will react when too far from you, which does not look good.&lt;br /&gt;
&lt;br /&gt;
There are two types of extents:&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;Extents&amp;gt;&#039;&#039;&#039; stores this info:&lt;br /&gt;
::&amp;lt;Angle&amp;gt; at which this extent radiates from the character.&lt;br /&gt;
::&amp;lt;Length&amp;gt; of this extent.&lt;br /&gt;
::&amp;lt;MinY&amp;gt; minimum height of this extent.&lt;br /&gt;
::&amp;lt;MaxY&amp;gt; maximum height of this extent.&lt;br /&gt;
:Length, MinY and MaxY serve to create an invisible area in space which is &amp;quot;dangerous to be in&amp;quot;. If an AI intersects with this area and notices it (refer to the Notice field in [[MELE]]), it will attempt to block or dodge according to its modifiers in its MELE profile.&lt;br /&gt;
::The number of &amp;lt;Extent&amp;gt;s is equal to the number of attack frames: &amp;lt;End&amp;gt; minus &amp;lt;Start&amp;gt; plus one (because the start frame counts too). For example, for TRAMKONCOMkick_low1: &amp;lt;End&amp;gt;30&amp;lt;/End&amp;gt; minus &amp;lt;Start&amp;gt;22&amp;lt;/Start&amp;gt; plus 1 = 9 &amp;lt;Extent&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;AttackRing&amp;gt; (formerly known as &amp;lt;HorizontalExtents&amp;gt;&#039;&#039;&#039; stores this info:&lt;br /&gt;
::36 fields (exactly 36, otherwise it won&#039;t compile back into a .oni file), which correspond to areas in 10° intervals around the character as described above.&lt;br /&gt;
&lt;br /&gt;
====Using OniSplit to calculate extents====&lt;br /&gt;
Let&#039;s say that you want to convert a non-attack animation to a damage-dealing animation. Non-attack TRAMs do not have extents information used to notify the AIs about incoming attacks, so how do you generate this information from the animation?&lt;br /&gt;
:1. Export the animation to XML with a body attached. If you extract using just &amp;quot;-extract:xml dest_folder TRAMsomething.oni&amp;quot;, you&#039;ll get the 3D animation data inside the XML (namely, the tags Heights, Velocities, Rotations, PositionOffset, and Positions; for an attack animation, you&#039;ll also get Attacks and AttackRing, and inside Attacks&#039; elements, each Attack element will have Extents at the end of it).&lt;br /&gt;
:However, if you extract this same animation using &amp;quot;-extract:xml dest_folder TRAMsomething.oni &#039;&#039;&#039;-anim-body ONCCtramuser.oni&#039;&#039;&#039;&amp;quot;, the animation data will be placed in a DAE file along with the character model geometry. Be sure to pick a body with a size that&#039;s representative of the character classes that will actually use this TRAM, because the extents will be calculated from it. The XML file will be very short without the 3D data in it — this is how we want the non-attack TRAM to look. We do not know the extents information that should go in Extents or AttackRing, so we just want to add the part that distinguishes a DAE-extracted attack TRAM XML from a DAE-extracted non-attack TRAM XML. That part is the Attacks section, without the Extents under each Attack.&lt;br /&gt;
:2. First, consider whether the TRAM should have something added to its Flags section, like Attack or ThrowTarget.&lt;br /&gt;
:3. Now add to the XML of the non-attack TRAM data in the following format (after the &amp;lt;SelfDamage /&amp;gt; section, typically):&lt;br /&gt;
        &amp;lt;Attacks&amp;gt;&lt;br /&gt;
            &amp;lt;Attack&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;1&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;10&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;RightWrist RightFist&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Flags /&amp;gt;&lt;br /&gt;
                &amp;lt;Knockback&amp;gt;4&amp;lt;/Knockback&amp;gt;&lt;br /&gt;
                &amp;lt;HitPoints&amp;gt;10&amp;lt;/HitPoints&amp;gt;&lt;br /&gt;
                &amp;lt;HitType&amp;gt;KnockdownHead&amp;lt;/HitType&amp;gt;&lt;br /&gt;
                &amp;lt;HitLength&amp;gt;5&amp;lt;/HitLength&amp;gt;&lt;br /&gt;
                &amp;lt;StunLength&amp;gt;8&amp;lt;/StunLength&amp;gt;&lt;br /&gt;
                &amp;lt;StaggerLength&amp;gt;0&amp;lt;/StaggerLength&amp;gt;&lt;br /&gt;
            &amp;lt;/Attack&amp;gt;&lt;br /&gt;
        &amp;lt;/Attacks&amp;gt;&lt;br /&gt;
:Do not add an AttackRing section after Attacks.&lt;br /&gt;
:4. Import this with &amp;quot;-create dest_folder TRAMsomething.xml&amp;quot;. The Extents sections and the AttackRing will be calculated by OniSplit from the attached DAE.&lt;br /&gt;
:5. If you need this information for a patch mod, run &amp;quot;-extract:xml&amp;quot; on the TRAMsomething.oni you&#039;ve created &amp;lt;u&amp;gt;without&amp;lt;/u&amp;gt; using &amp;quot;-anim-body&amp;quot;. Now you can copy the Extents and AttackRing data to your XML patch. For an example of how the patch should look, see the [http://mods.oni2.net/node/311 Domino Knockdowns] mod.&lt;br /&gt;
&lt;br /&gt;
===Combos===&lt;br /&gt;
The type and order of player input for triggering a given animation type (such as PPK) is hardcoded, and new animation types cannot be created. That being said, Oni has unused combo animation types, such as PKP, PKK, KPK, KPP, etc. that work perfectly fine and can be used to create new combos. To assign an animation type to a specific combo attack, you set a corresponding value in &amp;lt;Lookup&amp;gt;&amp;lt;Type&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Setting a value in the &amp;lt;Link&amp;gt; of &#039;&#039;&#039;&amp;lt;DirectAnimations&amp;gt;&#039;&#039;&#039; will do two things:&lt;br /&gt;
# It will increase the time window for player input, meaning the next animation can be executed more easily. (In vanilla Oni, the Crescent Moon Kick has no link in KONCOMcomb_k_k_kfw and therefore is difficult to use.)&lt;br /&gt;
# It disables &amp;lt;Interpolation&amp;gt;&amp;lt;End&amp;gt; for the next combo anim.&lt;br /&gt;
# It enables &amp;lt;Pause&amp;gt;&amp;lt;Soft&amp;gt; and &amp;lt;Pause&amp;gt;&amp;lt;Hard&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Just Frame input===&lt;br /&gt;
Implemented by Delano762, inspired by the game series Tekken, a Just Frame (&amp;quot;JF&amp;quot;) move means that you have to press certain keys (W+K or W+P) at the exact same time, which is more difficult than it might sound. Delano&#039;s mod [http://mods.oni2.net/node/353 54000 New Combat Moves for Konoko] has a collection of animations which utilize existing animation states differently to create new moves.&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
* new forward kick = TRAMKONCOMkick_fw_JF &amp;lt;FromState&amp;gt;Standing&lt;br /&gt;
** key strokes: w + k&lt;br /&gt;
* old forward kick = TRAMKONCOMkick_fw &amp;lt;FromState&amp;gt;RunStart&lt;br /&gt;
** key strokes: w, k&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
* new forward punch = TRAMKONCOMpunch_fw_JF &amp;lt;FromState&amp;gt;Standing&lt;br /&gt;
** key strokes: w + p&lt;br /&gt;
* old forward punch = TRAMKONCOMpunch_fw &amp;lt;FromState&amp;gt;RunStart&lt;br /&gt;
** key strokes: w, p&lt;br /&gt;
&lt;br /&gt;
Note that these animations are referred to as JF moves, not JF combos. The Crescent Moon Kick, as mentioned above, is an unintentional JF combo found in vanilla Oni.&lt;br /&gt;
&lt;br /&gt;
===Throws===&lt;br /&gt;
&lt;br /&gt;
====States====&lt;br /&gt;
The first anim state of source (src) and target (tgt) is the &amp;quot;primary&amp;quot; &amp;lt;FromState&amp;gt;. The others &amp;lt;FromState&amp;gt; entries are located in &amp;lt;Shortcut&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
====Types====&lt;br /&gt;
Throw target animations are registered in the TRAC of the throw initiator (AKA the throw source). Target animations are forced onto the other character. Throw target (TRAM*tgt) animations can only cover up to 256 frames (0-255). &lt;br /&gt;
&lt;br /&gt;
The game identifies which Target animation is it supposed to play through the &#039;&#039;ThrownX&#039;&#039; animation types. Each throw, together with its corresponding Target animation, uses one of the 17 available &#039;&#039;ThrownX&#039;&#039; animation types. These types are used in three tags:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;TargetType&amp;gt; tag in the Source animation,&lt;br /&gt;
* &amp;lt;Type&amp;gt; and &amp;lt;AimingType&amp;gt; tags in the Target animation.&lt;br /&gt;
&lt;br /&gt;
For example, Konoko&#039;s forward punch throw / &#039;&#039;KONCOMthrow_fw_p&#039;&#039; uses Thrown1 as its TargetType tag:&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;TargetType&amp;gt;Thrown1&amp;lt;/TargetType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the corresponding target animation, &#039;&#039;KONCOMthrow_fw_p&#039;&#039;, uses Thrown1 in the Type and AimingType tags:&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;Type&amp;gt;Thrown1&amp;lt;/Type&amp;gt;&lt;br /&gt;
            &amp;lt;AimingType&amp;gt;Thrown1&amp;lt;/AimingType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;ThrownX&#039;&#039; anim types work like slots - if you want to add a new throw to the game, you have to assign both the Source and the Target animations the same ThrownX type in the tags listed above. While these &amp;quot;pairs&amp;quot; are organized within vanilla animations according to the Throw Table below, this is nothing more than a convention, and as a result &#039;&#039;ThrownX&#039;&#039; types can be used freely. To give an example, while all Forward Punch Throws in the game seem to use the Thrown1 type, you can swap those types with another throw and they will work just as fine.&lt;br /&gt;
&lt;br /&gt;
The fact that the game has only 17 &#039;&#039;ThrownX&#039;&#039; types is a major limitation - this effectively means that each character can have no more than 17 throws - out of which only 4 are unused by any character in the game. This prevents modders from creating a significant number of throws despite the game allowing great flexibility in creating new throws by mixing Animation States, Animation Types and &amp;lt;Varient&amp;gt; tags.&lt;br /&gt;
&lt;br /&gt;
 {{divhide|Throw table}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=100%&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=2 width=240 | names&lt;br /&gt;
! rowspan=2 width=40 | key combo&lt;br /&gt;
! colspan=4 | context&lt;br /&gt;
! colspan=2 style=&amp;quot;background: #FF0;&amp;quot; | anim type&lt;br /&gt;
! rowspan=2 width=400 | image&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;!--context--&amp;gt;&lt;br /&gt;
! width=40 | varient&lt;br /&gt;
! width=60 | src state&lt;br /&gt;
! width=60 | tgt state&lt;br /&gt;
! width=85 | facing setup&amp;lt;!--tgt position only?(or pelvis rotation?)--&amp;gt;&lt;br /&gt;
&amp;lt;!--facing setup tgt rotation relative to src pelvis (or tgt pelvis position?)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--anim type--&amp;gt;&lt;br /&gt;
! width=40 style=&amp;quot;background: #FF0;&amp;quot; | src&lt;br /&gt;
! width=40 style=&amp;quot;background: #FF0;&amp;quot; | tgt&lt;br /&gt;
|-&lt;br /&gt;
! colspan=9 | normal throws a.k.a. static throws&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; static throw forward punch&lt;br /&gt;
: TRAMKONCOMthrow_fw_p&lt;br /&gt;
: TRAMKONCOMthrow_fw_p_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; P + ↑&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; COM&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt; &#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunStart&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt; &#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crouch&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;face&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;ThrowForwardPunch&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown1&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONCOMthrow_fw_p.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; static throw forward kick&lt;br /&gt;
: TRAMKONCOMthrow_fw_k&lt;br /&gt;
: TRAMKONCOMthrow_fw_k_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; K + ↑&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; COM&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt; &#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunStart&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt; &#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crouch&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;face&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;ThrowForwardKick&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown2&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONCOMthrow_fw_k.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; static throw backward punch&lt;br /&gt;
: TRAMKONCOMthrow_bk&lt;br /&gt;
: TRAMKONCOMthrow_bk_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; P + ↑&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; COM&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt; &#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunStart&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt; &#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crouch&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingRightDown&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;back&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;ThrowBackwardPunch&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown3&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONCOMthrow_bk.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; static throw backward punch&lt;br /&gt;
: TRAMKONCOMthrow_bk_k&lt;br /&gt;
: TRAMKONCOMthrow_bk_k_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; K + ↑&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; COM&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt; &#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunStart&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt; &#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crouch&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingRightDown&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;back&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;ThrowBackwardKick&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown4&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONCOMthrow_bk_k.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
! colspan=9 | run throws&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; run throw forward punch&lt;br /&gt;
: (forward &amp;quot;lariat&amp;quot;)&lt;br /&gt;
: TRAMKONCOMrun_throw_fw&lt;br /&gt;
: TRAMKONCOMrun_throw_fw_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; P + ↑(↑)&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; COM&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt; &#039;&#039;&#039;&amp;lt;span style=&amp;quot;color: silver;&amp;quot;&amp;gt;None&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunningLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
RunningRightDown&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt; &#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunningLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
RunningRightDown&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingRightDown&amp;lt;br&amp;gt;&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;face&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;RunThrowForwardPunch&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown5&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONCOMrun_throw_fw.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; run throw forward kick&lt;br /&gt;
: TRAMKONCOMrun_thw_fw_k&lt;br /&gt;
: TRAMKONCOMrun_thw_fw_k_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; K + ↑(↑)&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; COM&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color: silver;&amp;quot;&amp;gt;None&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunningLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
RunningRightDown&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunningLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
RunningRightDown&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingRightDown&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;face&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;RunThrowForwardKick&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown6&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONCOMrun_thw_fw_k.jpg|200px]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
identical headers but&lt;br /&gt;
STRCOMrun_thw_fw_p (face-to-face, with righty angle) links to Thrown5&lt;br /&gt;
STRCOMrun_thw_fw_pl (face-to-face, with lefty angle) links to Thrown6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; run throw backward punch&lt;br /&gt;
: (backward &amp;quot;lariat&amp;quot;)&lt;br /&gt;
: TRAMKONCOMrun_throw_bk&lt;br /&gt;
: TRAMKONCOMrun_throw_bk_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; P + ↑(↑)&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; COM&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color: silver;&amp;quot;&amp;gt;None&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunningLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
RunningRightDown&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunningBackLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
RunningBackRightDown&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingRightDown&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;back&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;RunThrowBackwardPunch&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown7&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt;&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; run throw backward kick&lt;br /&gt;
: TRAMREDCOMrun_thw_bk_k&lt;br /&gt;
: TRAMREDCOMrun_thw_bk_k_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; K + ↑(↑)&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; COM&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color: silver;&amp;quot;&amp;gt;None&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunningLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
RunningRightDown&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunningBackLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
RunningBackRightDown&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;back&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;RunThrowBackwardKick&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown8&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:REDCOMrun_thw_bk_k.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
! colspan=9 | catching throws a.k.a. tackle throws&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; tackle throw backward kick?&amp;lt;br&amp;gt;(never used)&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt;&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt;&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; Thrown9&lt;br /&gt;
|&amp;lt;!--image--&amp;gt;&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; tackle throw backward punch&lt;br /&gt;
: TRAMKONCOMrun_tkl_bk_p&lt;br /&gt;
: TRAMKONCOMrun_tkl_bk_p_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; P + ↑(↑)&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; COM&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color: silver;&amp;quot;&amp;gt;None&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunningLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
RunningRightDown&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color: silver;&amp;quot;&amp;gt;None&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunningLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
RunningRightDown&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;back&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;RunThrowBackwardPunch&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown10&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONCOMrun_tkl_bk_p.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
! colspan=9 | disarm throws&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; pistol disarm throw forward punch&lt;br /&gt;
: TRAMKONPISthrow_fw_p&lt;br /&gt;
: TRAMKONPISthrow_fw_p_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; P + ↑&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; PIS&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunStart&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crouch&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;face&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;ThrowForwardPunch&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown11&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONPISthrow_fw_p.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; pistol disarm throw forward kick&lt;br /&gt;
: TRAMKONPISthrow_fw_k&lt;br /&gt;
: TRAMKONPISthrow_fw_k_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; K + ↑&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; PIS&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunStart&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crouch&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;face&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;ThrowForwardKick&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown12&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONPISthrow_fw_k.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; pistol disarm throw backward punch&lt;br /&gt;
: TRAMKONPISthrow_bk&lt;br /&gt;
: TRAMKONPISthrow_bk_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; P + ↑&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; PIS&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunStart&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crouch&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingRightDown&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;back&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;ThrowBackwardPunch&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown13&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONPISthrow_bk.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; (never used)&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt;&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt;&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; Thrown14&lt;br /&gt;
|&amp;lt;!--image--&amp;gt;&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; rifle disarm throw forward punch&lt;br /&gt;
: TRAMKONRIFthrow_fw_p&lt;br /&gt;
: TRAMKONRIFthrow_fw_p_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; P + ↑&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; RIF&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunStart&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crouch&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;face&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;ThrowForwardPunch&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown15&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONRIFthrow_fw_p.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; rifle disarm throw backward punch&lt;br /&gt;
: TRAMKONRIFthrow_bk_p&lt;br /&gt;
: TRAMKONRIFthrow_bk_p_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; P + ↑&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; RIF&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunStart&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crouch&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;back&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;ThrowBackwardPunch&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown16&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONRIFthrow_bk_p.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; (never used)&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt;&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt;&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; Thrown17&lt;br /&gt;
|&amp;lt;!--image--&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{{divhide|end}}&lt;br /&gt;
&lt;br /&gt;
Looks like there was/is support for [[OBD:BINA/OBJC/MELE/MoveList/Throw|running disarms]]. Though unused types for new Thrown&#039;&#039;N&#039;&#039; would be needed. On second thought, one should check if we can&#039;t simply make a &#039;&#039;&#039;running (tgt + src) variant&#039;&#039;&#039; of disarms.&lt;br /&gt;
&lt;br /&gt;
====Forward throws====&lt;br /&gt;
Scenario: You load two characters into Mod Tool and rotate (+/-180°) the throw target character because you need them to stand face to face as you work on an animation. When you are done animating, the target animation would need to be reversed again. This means multiplying the velocities by -1; the rotation also needs correcting. So it looks like you need *(-1) for the x rotation and -/+180° (depending on your initial change) for the Y rotation.&lt;br /&gt;
&lt;br /&gt;
=====BlenderOni Throw Adjust=====&lt;br /&gt;
There is a Blender script implemented within the BlenderOni addon for rotating and adding PositionOffset to a forward throw Target animation. It is capable of adjusting both forward and back throws. The script&#039;s old version can be accessed [[Blender/Obsolete_scripts#Script_for_adjusting_forward_throw_targets|HERE.]]&lt;br /&gt;
&lt;br /&gt;
===Run animations===&lt;br /&gt;
Here&#039;s a breakdown of the Striker&#039;s run animations, meant as an illustration for what would be needed to make new run TRAMs.&lt;br /&gt;
&lt;br /&gt;
Run cancel:&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
* STRIKErun1stepa&lt;br /&gt;
* STRIKErun1stepb&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
&lt;br /&gt;
Run – &#039;&#039;a minimal cycle&#039;&#039;:&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
* STRIKErun1stepa&lt;br /&gt;
* STRIKErunstart&lt;br /&gt;
* STRIKErun_rt&lt;br /&gt;
* STRIKErun_lt (optional)&lt;br /&gt;
* STRIKErunstop&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
&lt;br /&gt;
Follow the images below from right to left.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:XML_TRAM_STRIKErunstop.png|STRIKErunstop&lt;br /&gt;
Image:XML_TRAM_STRIKErun_lt.png|STRIKErun_lt&lt;br /&gt;
Image:XML_TRAM_STRIKErun_rt.png|STRIKErun_rt&lt;br /&gt;
Image:XML_TRAM_STRIKErunstart.png|STRIKErunstart&lt;br /&gt;
Image:XML_TRAM_STRIKErun1stepa.png|STRIKErun1stepa&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of unused animations==&lt;br /&gt;
Here are all the known unused animations. These could be recycled in a new mod.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;From the original game&#039;&#039;&#039;&lt;br /&gt;
* KONOKOconsole_punch: What the name says (the engine can use that animation depending on the console&#039;s configuration, see [[OBD:BINA/OBJC/CONS|CONS]]) .&lt;br /&gt;
* KONOKOlev3_intro: Looks like she&#039;s placing something (bomb?) and then running away.&lt;br /&gt;
* KONOKOlev4_undress: From an aborted clothes-changing cutscene.&lt;br /&gt;
* KONOKOlev16_bomb: Planting a bomb.&lt;br /&gt;
* KONCOMsuper_kick: Now used in [[OTA]] as a spawn event, and by the fan-made character [[Shinatama Evolved]].&lt;br /&gt;
* KONCOMsuper_punch: KONCOMpunch_heavy but without the shouted attack name, has HalfDamage flag, and does 10 less damage in its first attack part.&lt;br /&gt;
* COMPISidle_special1: Comguy checking environment and his gun; meant for a feature that would visually depict an elevation in the AI&#039;s level of alertness after, say, hearing a noise.&lt;br /&gt;
* STRPISidle_special1: Striker checking his his gun and communicating with an ally (another unused alertness-elevation animation).&lt;br /&gt;
* THUGlev1_direct: Thug probably directing a truck driver.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;From modders&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Image:female_stun.jpg|right|thumb|Char A and Char B performing stun animations.]]&lt;br /&gt;
&lt;br /&gt;
* http://mods.oni2.net/node/376&lt;br /&gt;
** StrikerKneeStepKickThrow.zip&lt;br /&gt;
** REDCOMjump_fw_crouch--double_flip--dae.zip&lt;br /&gt;
** KONprone_getup--dae.zip&lt;br /&gt;
** KONRIF_k_bk_throw.zip&lt;br /&gt;
** female_stun--dae.zip&lt;br /&gt;
&lt;br /&gt;
==Special effects==&lt;br /&gt;
If the scene is overloaded by too many particles (including motion blur), these effects will cease being rendered. So don&#039;t overuse effects.&lt;br /&gt;
&lt;br /&gt;
===Color trails===&lt;br /&gt;
Open the XML-accompanied TRAM, search for the &amp;quot;Particles&amp;quot; tag, and insert your markup.&lt;br /&gt;
&lt;br /&gt;
First example: TRAMSTRCOMcomb_p_p.xml&lt;br /&gt;
&lt;br /&gt;
[[Image:Colorful_contrail_added.png|right|thumb]]&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Particles&amp;gt;&lt;br /&gt;
            &amp;lt;Particle&amp;gt;&lt;br /&gt;
                &amp;lt;StartFrame&amp;gt;0&amp;lt;/StartFrame&amp;gt;&lt;br /&gt;
                &amp;lt;EndFrame&amp;gt;12&amp;lt;/EndFrame&amp;gt;&lt;br /&gt;
                &amp;lt;Bone&amp;gt;LeftFist&amp;lt;/Bone&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;contrail&amp;lt;/Name&amp;gt;&lt;br /&gt;
            &amp;lt;/Particle&amp;gt;&lt;br /&gt;
        &amp;lt;/Particles&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;contrail&amp;quot; is looked up by the character class (ONCC) that emits the actual particle; here it is &amp;quot;h2h_strtrail_e01&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This second example is about creating two different contrails in a TRAM at the same time. The animation is &amp;quot;TRAMSTRCOMpunch_heavy.xml&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Different_contrails_in_attack.png|right|thumb]]&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Particles&amp;gt;&lt;br /&gt;
            &amp;lt;Particle&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;0&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;54&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Bone&amp;gt;RightWrist&amp;lt;/Bone&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;contrail&amp;lt;/Name&amp;gt;&lt;br /&gt;
            &amp;lt;/Particle&amp;gt;&lt;br /&gt;
            &amp;lt;Particle&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;0&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;54&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Bone&amp;gt;LeftWrist&amp;lt;/Bone&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;&#039;&#039;&#039;contrail_2&#039;&#039;&#039;&amp;lt;/Name&amp;gt;&lt;br /&gt;
            &amp;lt;/Particle&amp;gt;&lt;br /&gt;
        &amp;lt;/Particles&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that you need to register the second contrail in the ONCC as well. Using your own contrail particle is also possible; just insert its name between the &amp;lt;Type&amp;gt; tags.&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;ONCPParticle&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;contrail&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Type&amp;gt;h2h_strtrail_e01&amp;lt;/Type&amp;gt;&lt;br /&gt;
                &amp;lt;BodyPart&amp;gt;-1&amp;lt;/BodyPart&amp;gt;&lt;br /&gt;
            &amp;lt;/ONCPParticle&amp;gt;&lt;br /&gt;
            &amp;lt;ONCPParticle&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;&#039;&#039;&#039;contrail_2&#039;&#039;&#039;&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Type&amp;gt;&#039;&#039;&#039;h2h_murtrail_e01&#039;&#039;&#039;&amp;lt;/Type&amp;gt;&lt;br /&gt;
                &amp;lt;BodyPart&amp;gt;-1&amp;lt;/BodyPart&amp;gt;&lt;br /&gt;
            &amp;lt;/ONCPParticle&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Motion blur===&lt;br /&gt;
[[Image:XML_TRAM_willow_kick_with_motion_blur.jpg|thumb|200px]]&lt;br /&gt;
Motion blur in Oni works much like ghosting/onion skinning features in any animation software: In the frame range specified by &amp;lt;Start&amp;gt; and &amp;lt;End&amp;gt; an additional instance of body parts specified in &amp;lt;Bones&amp;gt; are rendered for additional extra frames specified by &amp;lt;Lifetime&amp;gt;, with transparency set by &amp;lt;Alpha&amp;gt;, and every &amp;lt;Interval&amp;gt; frames within the frame range.&lt;br /&gt;
Example snippet from KONCOMcomb_p_p_k:&lt;br /&gt;
        &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
            &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;RightThigh RightCalf RightFoot&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;20&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;28&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Lifetime&amp;gt;4&amp;lt;/Lifetime&amp;gt;&lt;br /&gt;
                &amp;lt;Alpha&amp;gt;127&amp;lt;/Alpha&amp;gt;&lt;br /&gt;
                &amp;lt;Interval&amp;gt;1&amp;lt;/Interval&amp;gt;&lt;br /&gt;
            &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
        &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The one noteworthy thing is that you can have multiple motion blur sequences. If you wanted to add an extra motion blur to the above animation, you could do something like this:&lt;br /&gt;
        &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
            &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;LeftThigh LeftCalf LeftFoot&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;10&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;18&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Lifetime&amp;gt;4&amp;lt;/Lifetime&amp;gt;&lt;br /&gt;
                &amp;lt;Alpha&amp;gt;127&amp;lt;/Alpha&amp;gt;&lt;br /&gt;
                &amp;lt;Interval&amp;gt;1&amp;lt;/Interval&amp;gt;&lt;br /&gt;
            &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
            &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;RightThigh RightCalf RightFoot&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;20&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;28&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Lifetime&amp;gt;4&amp;lt;/Lifetime&amp;gt;&lt;br /&gt;
                &amp;lt;Alpha&amp;gt;127&amp;lt;/Alpha&amp;gt;&lt;br /&gt;
                &amp;lt;Interval&amp;gt;1&amp;lt;/Interval&amp;gt;&lt;br /&gt;
            &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
        &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Impact effect===&lt;br /&gt;
Impact effects – mostly particle – are chosen based on logic written within [[XML:BINA/ONIE#Visual guides: weapon, melee, environment|ONIE]]. Furthermore particles must be registered in [[XML:ONCC|ONCC]]: You probably want to look at ONIA instead of ONCP.&lt;br /&gt;
&lt;br /&gt;
[[Image:XML_TRAM_KONCOMkick_fw_with_ninflash1.jpg|thumb|200px]]&lt;br /&gt;
&lt;br /&gt;
{{XML}}&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=XML:TRAM&amp;diff=41293</id>
		<title>XML:TRAM</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=XML:TRAM&amp;diff=41293"/>
		<updated>2023-10-16T17:00:30Z</updated>

		<summary type="html">&lt;p&gt;Delano762: Reworked the Throws section. Removed the information on forward/back naming pattern, as forward/back/left/right is a naming convention for input direction in the game, therefore it isn&amp;#039;t even specific to throws. Will continue reworking this section later.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{XML_File_Header | prev=TRAC | type=TRAM | next=TRAS | name=Totoro Animation}}&lt;br /&gt;
&lt;br /&gt;
{{TOCfloat|side=right}}&lt;br /&gt;
==General information==&lt;br /&gt;
TRAM files — animation data for characters — are basically made of three chunks:&lt;br /&gt;
* Metadata or &amp;quot;header&amp;quot;: animation type, state, flags, particle, sounds, etc.&lt;br /&gt;
* Animation data: &#039;&#039;&#039;pelvis heights, pelvis velocities (root motion)&#039;&#039;&#039;, bone rotations&lt;br /&gt;
* Attack data: damage, self-damage, extents (danger zones for AI awareness) and throws&lt;br /&gt;
&lt;br /&gt;
Root motion: a character moves by changing the position of its root bone (pelvis). The animated legs just create the &#039;&#039;&#039;illusion for the player&#039;&#039;&#039; that they are responsible for the motion.&lt;br /&gt;
&lt;br /&gt;
Bones: Each character has &#039;&#039;&#039;19 separate body parts&#039;&#039;&#039; which get animated (rotated) relative to each other. Compared to modern games Oni&#039;s bone system is [[wp:Deprecation|deprecated]]. The body doesn&#039;t get deformed by following animated bones. Oni modders often use the terms mesh and bone interchangeably. Only the pelvis has &#039;&#039;&#039;translation&#039;&#039;&#039; data (heights and velocities) besides rotations. The hierarchy of the body parts (or bones) is determined by [[XML:TRBS#Standard_TRIA_hierarchy|TRIA]].&lt;br /&gt;
&lt;br /&gt;
The term &#039;&#039;&#039;animation&#039;&#039;&#039; is often shortened to &#039;&#039;&#039;anim&#039;&#039;&#039; by modders, following the naming of commands in BSL: chr_wait_animstate, chr_wait_animtype, env_anim, etc.&lt;br /&gt;
&lt;br /&gt;
Oni&#039;s code and debugging messages tend to spell the word variant as &amp;quot;varient&amp;quot;. Blame the programmers for that one. Typically we use the correct spelling here, but OniSplit&#039;s XML follows Oni&#039;s misspelling, so you may see &amp;quot;varient&amp;quot; creep into the wiki here and there.&lt;br /&gt;
&lt;br /&gt;
TRAMs used in Oni follow a naming pattern. A list of all combat TRAMs in-game and their naming can be found [[Combat moves|here]].&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
* If the never-used Thrown type can be applied as type 18 the table looks much more complete. &amp;quot;Restoring&amp;quot; forward tackles (face-to-face, src run + tgt run) can be omitted as the AI would most often stop movement for actual combat?&lt;br /&gt;
&lt;br /&gt;
* All important header data of STRCOMrun_thw_fw_p and STRCOMrun_thw_fw_pl is identical. That means the engine picks the correct TRAM by using an unknown context, possibly this is similar or part of the distinction of &amp;quot;forward&amp;quot; (face-to-face) and &amp;quot;backward&amp;quot; (face-to-back).&lt;br /&gt;
: &#039;&#039;&#039;Maybe the algorithm checks always tgt&#039;s rotation and relative position to src at the same time but for most cases only tgt&#039;s rotation (facing) is relevant.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Also, STRCOMrun_thw_fw_p(l) routing to Thrown5 and Thrown6 shows that Thrown anim types might be used however we like. A src-tgt-anim-type-pairing might be simply a &#039;&#039;convention&#039;&#039;. Well, someone could check the source code...&lt;br /&gt;
&lt;br /&gt;
* The existence of STRCOMrun_thw_fw_p(_tgt) and STRCOMrun_thw_fw_pl(_t) means that we need extra research to understand the full extent of the throw system.&lt;br /&gt;
* The variant pickup system is not clear yet: is a RIFCOM idle and a RIFNAT idle both possible?&lt;br /&gt;
** Or do rightpistol, leftpistol, rightrifle and leftrifle variants count as subsets of combat?&lt;br /&gt;
&lt;br /&gt;
==Summary of animation lookup logic==&lt;br /&gt;
* First the game builds a pool of anims a character can use. They are loaded from the TRAC file registered in [[ONCC]], including parent TRACs.&lt;br /&gt;
* Anims from a child TRAC override those of the parent if their combination of state, type and variant is exactly the same.&lt;br /&gt;
* Child TRACs usually omit some anims. For example, Elite Strikers don&#039;t have their own run anims, so they use the parent anims of normal Strikers. See [[XML:TRAC|TRAC]] page for details.&lt;br /&gt;
* A character always possesses a single animation state. This term derives from state machines, but you only need to know that states are the first point in the decision path determining what anims are actually allowed to play at a given moment.&lt;br /&gt;
* Here is the full decision path:&lt;br /&gt;
** anim &#039;&#039;&#039;state&#039;&#039;&#039; check&lt;br /&gt;
** event (user input, or engine input for the AI) -&amp;gt; [[XML talk:StNA|context check]] -&amp;gt; anim &#039;&#039;&#039;type&#039;&#039;&#039; check&lt;br /&gt;
** anim &#039;&#039;&#039;variant&#039;&#039;&#039; check&lt;br /&gt;
** TRAC &#039;&#039;&#039;weight&#039;&#039;&#039; check&lt;br /&gt;
&lt;br /&gt;
===Elaboration===&lt;br /&gt;
Animations never stop – they flow from one to another. (See the concept of [[wp:State machine|state machines]] in gaming.) The default case is a character getting spawned and then just standing there: he idles forever. This brings us to the core attributes of every animation: &#039;&#039;&#039;type, state, variant&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Now then, the idle animation does not link to a specific follow-up animation – it rather links to a follow-up &#039;&#039;state&#039;&#039;.&lt;br /&gt;
: Ironically all anims have a &amp;lt;FromState&amp;gt; and a &amp;lt;ToState&amp;gt; field, but no obvious &amp;lt;CurrentState&amp;gt; which can cause confusion on what the current anim&#039;s state actually is. This gives us two options of how to think about the situation: either consider &amp;lt;FromState&amp;gt; as usually being the &amp;lt;CurrentState&amp;gt;, or states exist only &#039;&#039;between&#039;&#039; anims and serve as &#039;&#039;transition rules&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Linking to a follow-up state allows for multiple choices of what specific anim comes next. An anim is picked up randomly from a pool of valid anims. Their probability or &amp;lt;Weight&amp;gt; is determined by the anim listing in the TRAC – the anim collection (see &amp;quot;Weights&amp;quot; section for an explanation of exactly how &amp;lt;Weight&amp;gt; is handled).&lt;br /&gt;
&lt;br /&gt;
Anyway, to let an character flow from one anim state to another, the &amp;lt;ToState&amp;gt; is used. Let&#039;s say an SBG grenade hits Konoko. The particle&#039;s &#039;&#039;&#039;damage type&#039;&#039;&#039; is &#039;&#039;&#039;blownup&#039;&#039;&#039;; this and the direction of the incoming damage force an anim of type &#039;&#039;&#039;Blownup&#039;&#039;&#039; or &#039;&#039;&#039;BlownupBehind&#039;&#039;&#039; to play, such as TRAMKONOKOblownup1.&lt;br /&gt;
&lt;br /&gt;
Thus, Konoko falls to her back, going into the FallenBack state. The engine picks up the next anim which has &amp;lt;FromState&amp;gt;FallenBack. Also, receiving damage puts a character into combat mode, so further anims will be of variant Combat. But if the player gives no input, Konoko will remain on the ground, as &amp;lt;ToState&amp;gt;FallenBack creates a loop.&lt;br /&gt;
&lt;br /&gt;
So here&#039;s a question: why isn&#039;t a getup anim like KONCOMgetup_lt played automatically since it also has &amp;lt;FromState&amp;gt;FallenBack and &amp;lt;Varient&amp;gt;Combat? Answer: it differs in its &amp;lt;Type&amp;gt;. Most [[XML_talk:StNA|anim types are bound to user input]] and therefore are excluded from the automatically created pool of valid anims which can follow.&lt;br /&gt;
&lt;br /&gt;
Now let&#039;s consider what happens upon user input. A leftward movement of the mouse tells the engine to use an anim of type StandingTurnLeft. There are two anims with that type, KONOKOcomb_turnlt and KONCOMgetup_lt, but only the latter matches the current &amp;lt;FromState&amp;gt; condition.&lt;br /&gt;
: In fact, KONOKOcomb_turnlt has &amp;lt;Varient&amp;gt; Combat – the &amp;quot;comb&amp;quot; here stands for &amp;quot;combat&amp;quot;, not &amp;quot;combo&amp;quot;. Following Oni&#039;s naming convention, the file &#039;&#039;should&#039;&#039; have been named KONCOMturn_lt.&lt;br /&gt;
&lt;br /&gt;
Knowing this behavior, we can deduce that anim types registered to user input will make the engine ignore all the automatic anims inside the pool, therefore breaking the loop of KONCOMfallen_back. And since KONCOMgetup_lt has &amp;lt;ToState&amp;gt;Standing and Konoko is still in combat mode, the following idle anim must also have &amp;lt;Varient&amp;gt;Combat. So the next anim played will be KON&#039;&#039;&#039;COM&#039;&#039;&#039;idle1 or KON&#039;&#039;&#039;COM&#039;&#039;&#039;idle2.&lt;br /&gt;
&lt;br /&gt;
Konoko will eventually calm down when her ONCC &amp;lt;FightModeTimer&amp;gt; runs down, and then KON&#039;&#039;&#039;OKO&#039;&#039;&#039;idle1 or KON&#039;&#039;&#039;OKO&#039;&#039;&#039;idle2 will be played instead. (Actually, the COMidle will continue until a non-combat anim such as running breaks that loop. You won&#039;t ever see Konoko drop from combat readiness to her regular idle animation. Instead she will go from combat idle to running, to stopping, then standing at ease.)&lt;br /&gt;
&lt;br /&gt;
Note the fallback behavior of anim lookup: if the engine cannot find an anim for the active variant (or &amp;quot;mode&amp;quot;) of the character, it will choose the normal (non-variant-matching) version. Anims can be in the following variants: Combat, LeftPistol, LeftRifle, Panic, RightPistol, RightRifle and Sprint.&lt;br /&gt;
&lt;br /&gt;
As for combinations of variants, it&#039;s possible, yes, but rarely and only Sprint and one weapon variant at a time.&lt;br /&gt;
&lt;br /&gt;
==Weights==&lt;br /&gt;
Let&#039;s say that we&#039;re playing as a Ninja, we are in the state Standing, and we hit the action key to perform a taunt. The engine recognizes the context (no console to interact with), places the character in combat mode, and looks up anims of type Taunt. Since we are in combat mode, the next anim must be of variant Combat if possible. These lookups boil down to two valid possible anims: NINCOMtaunt1 (a spin) and NINCOMtaunt2 (the [[wp:Moon walk|moon walk]] Easter egg). The engine picks one of them randomly.&lt;br /&gt;
&lt;br /&gt;
However, NINCOMtaunt1 has a TRAC Weight (probability) of 100 while NINCOMtaunt2 has a TRAC Weight value of just 5. So the chances are quite high that we will not see the moon walk taunt.&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;TRACAnimation&amp;gt;&lt;br /&gt;
                &amp;lt;Weight&amp;gt;100&amp;lt;/Weight&amp;gt;&lt;br /&gt;
                &amp;lt;Animation&amp;gt;TRAMNINCOMtaunt1&amp;lt;/Animation&amp;gt;&lt;br /&gt;
            &amp;lt;/TRACAnimation&amp;gt;&lt;br /&gt;
            &amp;lt;TRACAnimation&amp;gt;&lt;br /&gt;
                &amp;lt;Weight&amp;gt;5&amp;lt;/Weight&amp;gt;&lt;br /&gt;
                &amp;lt;Animation&amp;gt;TRAMNINCOMtaunt2&amp;lt;/Animation&amp;gt;&lt;br /&gt;
            &amp;lt;/TRACAnimation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If there is only one anim to choose from, it will always play no matter what its Weight, even if it is zero. When it comes to multiple anims being a valid choice, the calculation is: weight of anim / sum of all valid anim weights. For NINCOMtaunt2, this means 5 / 105 = 0.047, or a 4.7% chance of a moon walk.&lt;br /&gt;
&lt;br /&gt;
==Idle timer==&lt;br /&gt;
There&#039;s a semi-famous Easter egg where [https://www.youtube.com/watch?v=qbo2Q-VD6dc Konoko will sneeze] if she stands still for a long time. The timer for this is so long that most players never see it unless they step away from the game and leave it running without hitting F1. You might think that the way the sneeze is triggered is to set a low weight for it so that it&#039;s very unlikely a repeating idle cycle will choose the anim. But here&#039;s the sneeze anim in the TRAC with a Weight of 100:&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;TRACAnimation&amp;gt;&lt;br /&gt;
                &amp;lt;Weight&amp;gt;100&amp;lt;/Weight&amp;gt;&lt;br /&gt;
                &amp;lt;Animation&amp;gt;TRAMKONOKOidle_spec3&amp;lt;/Animation&amp;gt;&lt;br /&gt;
            &amp;lt;/TRACAnimation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What&#039;s going on here? All regular idle anims are in fact of &#039;&#039;&#039;type Stand&#039;&#039;&#039;, while Konoko&#039;s idle_spec3 anim above is of &#039;&#039;&#039;type Idle&#039;&#039;&#039;. Anims of &#039;&#039;&#039;type Idle&#039;&#039;&#039; are played every time the idle animation timer expires.  This is found in ONCC as &amp;lt;IdleAnimation1Timer&amp;gt; and &amp;lt;IdleAnimation2Timer&amp;gt;. These timers are set to 30,000 for every character. The number is in ticks, so if we convert to minutes – 30,000 / 60 / 60 = 8.3̅ – we find that the secret idle anim for Konoko (or any character) will play every 8⅓ minutes.&lt;br /&gt;
&lt;br /&gt;
==List of tags, types, and flags==&lt;br /&gt;
Use the search function in your browser to quickly find a tag.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=100%&lt;br /&gt;
|width=120px| &#039;&#039;&#039;tag&#039;&#039;&#039;&lt;br /&gt;
|width=100px| &#039;&#039;&#039;type&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Lookup&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Type&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_types|HERE]]. The pool of valid TRAMs (animations a character can choose from) is built from the TRAC files registered in the ONCC. Most of the anim types are connected to player inputs.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;AimingType&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_types|HERE]]. The pool of valid TRAMs, and therefore TRASs (aiming screens a character can choose from) is built from the TRSC files registered in the ONCC.&lt;br /&gt;
:&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;FromState&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
| [[Image:chr_debug_characters_shows_interpolated_animations.jpg|thumb|400px|right|Primary &amp;lt;FromState&amp;gt; in &amp;lt;Lookup&amp;gt; uses about 8 interpolating frames by default. Use Shortcut&#039;s &amp;lt;FromState&amp;gt; to override this frame number.]]&lt;br /&gt;
&lt;br /&gt;
Look them up over [[XML:StNA#Animation_states|HERE]].&lt;br /&gt;
: When FromState is set to None, some default behaviors are ignored and are replaced by Shortcuts.&lt;br /&gt;
: Shortcuts extend the number of states from which an animation can be played and under what conditions (replacing this atomic yes/no).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ToState&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_states|HERE]].&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Varient&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|(misspelled because Oni misspells it) If unused, the tag will simply be &amp;quot;&amp;lt;Varient /&amp;gt;&amp;quot;, such as for non-combat animations. Otherwise it contains one of these values:&lt;br /&gt;
: Combat&lt;br /&gt;
: LeftPistol&lt;br /&gt;
: LeftRifle&lt;br /&gt;
: Panic&lt;br /&gt;
: RightPistol&lt;br /&gt;
: RightRifle&lt;br /&gt;
: Sprint&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;FirstLevel&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|Number of first level in which move becomes available to the player (&amp;quot;0&amp;quot; to make it available from the start).&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Shortcuts&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
|&lt;br /&gt;
Works as an &#039;&#039;&#039;alternative FromState&#039;&#039;&#039; collection.&lt;br /&gt;
&lt;br /&gt;
Shortcuts are accepted if their &amp;lt;Shortcut&amp;gt;&amp;lt;FromState&amp;gt; value differs from the &amp;quot;primary&amp;quot; &amp;lt;Lookup&amp;gt;&amp;lt;FromState&amp;gt; value. In other words, if you want to make a &#039;&#039;&#039;Shortcut&#039;&#039;&#039; that uses the &#039;&#039;&#039;same FromState&#039;&#039;&#039; value then you have to set &#039;&#039;&#039;primary FromState&#039;&#039;&#039; value to &#039;&#039;&#039;None&#039;&#039;&#039;. By doing that, the hardcoded interpolation frame length of about 8 frames can be overridden.&lt;br /&gt;
&lt;br /&gt;
In the following example, the new interpolation length is 0. This will require the animation to match perfectly with the previous one. For a smooth transition to the next animation, set a suitable value at &amp;lt;Interpolation&amp;gt;&amp;lt;End&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Lookup&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
            &amp;lt;FromState&amp;gt;None&amp;lt;/FromState&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
            &amp;lt;Shortcuts&amp;gt;&lt;br /&gt;
                &amp;lt;Shortcut&amp;gt;&lt;br /&gt;
                    &amp;lt;FromState&amp;gt;Standing&amp;lt;/FromState&amp;gt;&lt;br /&gt;
                    &amp;lt;Length&amp;gt;0&amp;lt;/Length&amp;gt;&lt;br /&gt;
                    &amp;lt;ReplaceAtomic&amp;gt;no&amp;lt;/ReplaceAtomic&amp;gt;&lt;br /&gt;
                &amp;lt;/Shortcut&amp;gt;&lt;br /&gt;
            &amp;lt;/Shortcuts&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:TRAM interpolation - standard case.jpg|thumb|400px|left|Scenario A: hardcoded interpolation of 8 frames. Scenario B: changeable interpolation frame number.]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Shortcut&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;FromState&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_types|HERE]].&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Length&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int16&lt;br /&gt;
|Amount of interpolating frames. While interpolations of rotation are less noticeable, interpolations of different positions can cause drift (i.e. sliding).&lt;br /&gt;
&lt;br /&gt;
This is especially observed for transitions from idle to movements and vice versa — basically any combination of animations with different accelerations at start and end. By default, animations without specified Shortcut interpolation give about 8 frames of interpolation. For moves starting or ending in idle, it&#039;s better not to use interpolation. Just give the start and end frames the same positions and rotation values as the idle. Interpolations should always be considered a &#039;&#039;last resort&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
This drift can be observed even in vanilla animations — most prominently in Konoko&#039;s comb_k. Konoko&#039;s left foot should be in a fixed position as the animation starts from from Konoko&#039;s idle pose. However, the interpolation is causing her left foot to drift noticeably to the right and a bit forward.&lt;br /&gt;
&lt;br /&gt;
The reason this happens is because the interpolation &amp;quot;mixes&amp;quot; two animations. When one animation transitions into another via interpolation, part of the animation system continues playing the initial animation, and part of it is playing the follow-up animation, with all the rotations and positions getting linearly interpolated.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;ReplaceAtomic&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: yes&lt;br /&gt;
: no&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Flags&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|These are top-level flags on the whole animation. See the other &amp;lt;Flags&amp;gt; for flags on an attack part.&lt;br /&gt;
:RuntimeLoaded&lt;br /&gt;
::(This bit is not stored on disk; it is used at runtime to mark that the animation was loaded.)&lt;br /&gt;
:Invulnerable&lt;br /&gt;
::While playing this animation, the player is invulnerable to melee damage and also cannot be thrown. Damage from particles and fall damage still hurt.&lt;br /&gt;
:BlockHigh&lt;br /&gt;
::While playing this animation, the player is invulnerable to high or undefined attacks within some arc in front of him. If you set this flag on an animation where the player character is spinning, then the character can still be kicked in the back or thrown.&lt;br /&gt;
:BlockLow&lt;br /&gt;
::Same as above, only it can block low or undefined attacks.&lt;br /&gt;
:Attack&lt;br /&gt;
::Animations with an attack part have this turned on. It&#039;s unclear what it does, but it may enable the melee soft-lock (where the character turns a bit during the animation to face a nearby enemy).&lt;br /&gt;
:DropWeapon&lt;br /&gt;
::If the player is armed, he drops his weapon when this animation plays.&lt;br /&gt;
:InAir&lt;br /&gt;
::Something to do with jumps; not investigated.&lt;br /&gt;
:Atomic&lt;br /&gt;
::The whole animation must be played; player cannot interrupt it once it starts.&lt;br /&gt;
:NoTurn&lt;br /&gt;
:::Player cannot turn by mouse while performing this animation.&lt;br /&gt;
:AttackForward&lt;br /&gt;
::Unknown, but it looks like this is a hint for the AI about where an attack is aiming, from the player&#039;s point of view.&lt;br /&gt;
:AttackLeft&lt;br /&gt;
::Same as above.&lt;br /&gt;
:AttackRight&lt;br /&gt;
::Same as above.&lt;br /&gt;
:AttackBackward&lt;br /&gt;
::Same as above.&lt;br /&gt;
:Overlay&lt;br /&gt;
::Not a standalone animation; it just overwrites part of an already-playing one, e.g. the weapon-holstering animation.&lt;br /&gt;
:DontInterpolateVelocity&lt;br /&gt;
::Unknown, but maybe it has something to do with {x,y,z} velocities and the fact that directional jumps, for example, take information about their direction vector from the {x,z} velocity part of the TRAM (the vertical Y component is in the ONCC).&lt;br /&gt;
:ThrowSource&lt;br /&gt;
::Unknown, but throws use it.&lt;br /&gt;
::: Probably a developer relic. Throws work in animation pairs: whenever a throw source is played, the other character must perform the throw target animation. See throw(n) types:&lt;br /&gt;
:::: TRAM &amp;lt;TargetType&amp;gt;&lt;br /&gt;
:::: [[XML:StNA#Animation_types|StNA]] (First &amp;lt;u&amp;gt;used&amp;lt;/u&amp;gt; throw starts at #96.)&lt;br /&gt;
::: Characters have only their own pool of animations available. And since enemy&#039;s TRAC might not contain the necessary animation the information must be provided by the throw source TRAC. &lt;br /&gt;
::: Since every throw animation must have a throw animation type the ThrowSource flag is actually redundant.&lt;br /&gt;
:ThrowTarget&lt;br /&gt;
::Animation can hurt anybody with its attack part, including teammates. The player can even hurt himself with the TRAM&#039;s damage part (whereas a player cannot hurt himself with his own animation&#039;s attack part). It also allows two attack parts to be executed instead of only one (maybe a bug? more than two will result in a crash).&lt;br /&gt;
:::If you set the first attack part to be able to deal damage from the 1st to the 100th frame of the TRAM, and the second attack part to deal damage within that range (e.g. from the 25th to the 41st frame), then the first attack part will deal damage from the 1st to the 100th frame (as usual), but even if it hits, that second attack part can hurt the enemy as well during frames 25–41. Note that the second attack part must be executed within the first attack part&#039;s active &amp;quot;window&amp;quot;, otherwise it won&#039;t work.&lt;br /&gt;
:RealWorld&lt;br /&gt;
::It appears this flag was used to create a TRAM and an OBAN from one animation source. The OBAN is supposed to store pelvis rotations and positions, allowing a character to move over obstacles/gaps. The vast majority of them are used in cutscenes.&lt;br /&gt;
:DoAim&lt;br /&gt;
::Applies the aiming animation overlay (PIS/RIF) if the player has a weapon.&lt;br /&gt;
:DontAim&lt;br /&gt;
::An aiming overlay will not be applied.&lt;br /&gt;
:CanPickup&lt;br /&gt;
::Player can pick up an item during this animation if he intersects with one during his movement.&lt;br /&gt;
:Aim360&lt;br /&gt;
::Unknown.&lt;br /&gt;
:DisableShield&lt;br /&gt;
::If the player has an active supershield (chr_super &amp;quot;name&amp;quot; 1), this forces him to disable it (chr_super &amp;quot;name&amp;quot; 0)&lt;br /&gt;
:NoAIPickup&lt;br /&gt;
::AIs are not permitted to pick up items with this animation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Atomic&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Makes animation particle atomic?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Invulnerable&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Character will not take melee damage during a time frame defined by the Start and End frames.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| First frame of character being invulnerable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Last frame of character being invulnerable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Overlay&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;UsedBones&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|Simply contains &amp;quot;&amp;lt;UsedBones /&amp;gt;&amp;quot; if no bones are involved, otherwise:&lt;br /&gt;
:Pelvis&lt;br /&gt;
:LeftThigh&lt;br /&gt;
:LeftCalf&lt;br /&gt;
:LeftFoot&lt;br /&gt;
:RightThigh&lt;br /&gt;
:RightCalf&lt;br /&gt;
:RightFoot&lt;br /&gt;
:Mid&lt;br /&gt;
:Chest&lt;br /&gt;
:Neck&lt;br /&gt;
:Head&lt;br /&gt;
:LeftShoulder&lt;br /&gt;
:LeftArm&lt;br /&gt;
:LeftWrist&lt;br /&gt;
:LeftFist&lt;br /&gt;
:RightShoulder&lt;br /&gt;
:RightArm&lt;br /&gt;
:RightFist&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;ReplacedBones&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
| &amp;quot;&amp;lt;ReplacedBones /&amp;gt;&amp;quot; if unused, otherwise:&lt;br /&gt;
:Pelvis&lt;br /&gt;
:LeftThigh&lt;br /&gt;
:LeftCalf&lt;br /&gt;
:LeftFoot&lt;br /&gt;
:RightThigh&lt;br /&gt;
:RightCalf&lt;br /&gt;
:RightFoot&lt;br /&gt;
:Mid&lt;br /&gt;
:Chest&lt;br /&gt;
:Neck&lt;br /&gt;
:Head&lt;br /&gt;
:LeftShoulder&lt;br /&gt;
:LeftArm&lt;br /&gt;
:LeftWrist&lt;br /&gt;
:LeftFist&lt;br /&gt;
:RightShoulder&lt;br /&gt;
:RightArm&lt;br /&gt;
:RightFist&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;DirectAnimations&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Link&amp;gt;&lt;br /&gt;
| link&lt;br /&gt;
| First slot. &amp;quot;&amp;lt;Link /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Link&amp;gt;&lt;br /&gt;
| link&lt;br /&gt;
| Second slot. &amp;quot;&amp;lt;Link /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Pause&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Hard&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| In ticks. The Hard and Soft pause values are ignored if this animation has a direct link (above) to another animation.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Soft&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int16&lt;br /&gt;
| In ticks. As mentioned above, the player cannot enter new inputs during this pause unless this animation is part of a combo animation defined by &amp;lt;DirectAnimations&amp;gt;&amp;lt;Link&amp;gt;.&lt;br /&gt;
: Examples:&lt;br /&gt;
: COMcomb_p, (no pause) COMcomb_p_p&lt;br /&gt;
: COMcomb_p, (pause) COMcomb_k&lt;br /&gt;
&lt;br /&gt;
The difference between the hard and soft pause is that you can block during the soft pause and not the hard pause.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Interpolation&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;End&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int16&lt;br /&gt;
|&lt;br /&gt;
* interpolates first X frames of next animation&lt;br /&gt;
* if the first follow-up animation is too short, it can continue to play even further (not observed with vanilla anims)&lt;br /&gt;
&lt;br /&gt;
While interpolations with rotations are less noticeable, interpolations of different positions can cause an additional drift.&lt;br /&gt;
&lt;br /&gt;
This was especially observed for transitions of idle to movements and vice versa — basically any combination of animations with different accelerations at the start and end. By default, animations without a specified Shortcut interpolation get about 8 frames of interpolation. For moves starting or ending in idle, it&#039;s better not to use interpolation. Just give the start and end frames the same positions and rotation values as the idle. Interpolations should always be considered a &#039;&#039;last resort&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:TRAM interpolations - end interpolation bigger than next anim.jpg|thumb|400px|left|&amp;quot;End&amp;quot; interpolation covering multiple follow-up animations.]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Max&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| unused&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;FinalRotation&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| float&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| Ending rotation in degrees. (During an animation, the camera is detached rotation-wise. If this value matches the body&#039;s final rotation, it will prevent a &amp;quot;glitchy&amp;quot; re-attaching.)&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Direction&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
| Used by [[AI#Melee_combat_behaviors|AI melee system]].&lt;br /&gt;
:None&lt;br /&gt;
:Forward&lt;br /&gt;
:Backward&lt;br /&gt;
:Left&lt;br /&gt;
:Right&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Vocalization&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| ID of one of the [[XML:SNDD#Step_1:_Preparing_the_TRAM|SoundConstants in ONCC]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ActionFrame&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Frame number for any special events associated with this animation: weapon theft via disarm, weapon holstering, Mukade teleporting, items getting handed over to player, etc.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Impact&amp;gt;&lt;br /&gt;
| link&lt;br /&gt;
| &amp;quot;&amp;lt;Impact /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Particles&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
| serves as group element&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Particle&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
| holds individual particle data&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Start&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int&lt;br /&gt;
| frame number for particle to start&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;End&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int&lt;br /&gt;
| frame number for particle to end (if the number exceeds frame count of animation, the particle will simply die at the end of the animation)&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Bone&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: Pelvis &lt;br /&gt;
: LeftThigh &lt;br /&gt;
: LeftCalf &lt;br /&gt;
: LeftFoot &lt;br /&gt;
: RightThigh &lt;br /&gt;
: RightCalf &lt;br /&gt;
: RightFoot &lt;br /&gt;
: Mid &lt;br /&gt;
: Chest &lt;br /&gt;
: Neck &lt;br /&gt;
: Head &lt;br /&gt;
: LeftShoulder &lt;br /&gt;
: LeftArm &lt;br /&gt;
: LeftWrist &lt;br /&gt;
: LeftFist &lt;br /&gt;
: RightShoulder &lt;br /&gt;
: RightArm &lt;br /&gt;
: RightFist&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Name&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| link&lt;br /&gt;
| particle name in [[XML:ONCC#ONCP:_Oni_Character_Particle_.28Array.29|ONCC-ONCP]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| sequence element&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Bones&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: Pelvis &lt;br /&gt;
: LeftThigh &lt;br /&gt;
: LeftCalf &lt;br /&gt;
: LeftFoot &lt;br /&gt;
: RightThigh &lt;br /&gt;
: RightCalf &lt;br /&gt;
: RightFoot &lt;br /&gt;
: Mid &lt;br /&gt;
: Chest &lt;br /&gt;
: Neck &lt;br /&gt;
: Head &lt;br /&gt;
: LeftShoulder &lt;br /&gt;
: LeftArm &lt;br /&gt;
: LeftWrist &lt;br /&gt;
: LeftFist &lt;br /&gt;
: RightShoulder &lt;br /&gt;
: RightArm &lt;br /&gt;
: RightFist&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Start frame of motion blur sequence&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| End frame of motion blur sequence&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Lifetime&amp;gt;&lt;br /&gt;
| int8&lt;br /&gt;
| Lifetime of each &amp;quot;ghost&amp;quot; in frames. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Alpha&amp;gt;&lt;br /&gt;
| int8&lt;br /&gt;
| Transparency of &amp;quot;ghosts&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Interval&amp;gt;&lt;br /&gt;
| int8&lt;br /&gt;
| Frame interval between each rendered &amp;quot;ghost&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Footsteps&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Footstep&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Type&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: Left&lt;br /&gt;
: Right&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Sounds&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &amp;quot;&amp;lt;Sounds /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Sound&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Name&amp;gt;&lt;br /&gt;
| char[32]&lt;br /&gt;
| &amp;lt;font color=&amp;quot;#777777&amp;quot;&amp;gt;OSBD&amp;lt;/font&amp;gt;file&amp;lt;font color=&amp;quot;#777777&amp;quot;&amp;gt;.imp.oni&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#777777&amp;quot;&amp;gt;(don&#039;t use resource type&#039;s prefix or suffix)&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|The frame when the sound starts to play.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Heights&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Height&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
|Absolute position.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Velocities&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Velocity&amp;gt;&lt;br /&gt;
| 2 x float&lt;br /&gt;
|Relative positions (delta values); the numbers represent the change in position from one frame to another.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Rotations&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Bone&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|There are 19 bone tags, one for each [[TRIA#Bones|body part]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;EKey&amp;gt;&lt;br /&gt;
| int8 + 3 * float&lt;br /&gt;
|For normal animations. The first value is the number of frames for which the rotation is maintained; the sum of all of these first EKey components always equals the total number of frames for the animation.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;QKey&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int8 + 4 * float&lt;br /&gt;
|For overlay animations used by [[TRAS|TRAS]] aiming screens.&lt;br /&gt;
&lt;br /&gt;
OniSplit v0.9.54.0 produces &amp;lt;QKey&amp;gt;s (quaternions) instead of &amp;lt;EKey&amp;gt;s (Euler rotations) for normal animations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;PositionOffset&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &amp;lt;PositionOffset&amp;gt; and &amp;lt;Positions&amp;gt; belong together. In the [[OBD:TRAM/raw0x30|binaries]], they are written in place. &#039;&#039;&#039;Seems unused; changing them has no effect in-game.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;X&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Z&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Positions&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Position&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| seems to be unused (and when checking this with &amp;quot;chr_debug_sphere = 1&amp;quot;, the spheres remain unchanged)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Height&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| vertical extent&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;YOffset&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| Y offset of the vertical extent from character location &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ThrowSource&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &amp;quot;&amp;lt;ThrowSource /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;TargetAdjustment&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Used to position targets during throws, relative to the position of the character executing the throw.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Position&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| 3 * float&lt;br /&gt;
| Contains XYZ values, which position the target character:&lt;br /&gt;
*X - Side axis. Negative values move the target to the right and positive values move the target to the left.&lt;br /&gt;
*Y - Height axis. Negative values move the target downwards, but cannot make the target go below the floor. Positive values make the target go upwards — if the value is too big, the target will teleport upward and then immediately start falling, interrupting the target animation.&lt;br /&gt;
*Z - Forward axis. Negative values move the target backwards and positive values move the target forward.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Angle&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| In radians - adjusts the rotation of the target in Oni&#039;s Y axis; most of the time (if not always) it&#039;s set to &#039;&#039;3.14159274&#039;&#039; radians in vanilla anims, equaling 180 degrees - which effectively rotates the rotates by those 180 degrees; if it was set to 0, the target would face the throw source character with his back.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Distance&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| Activation distance. The throw can be triggered if it is within this range. However the value must be greater than the equivalent TRAM in the parent TRAC.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;TargetType&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
| The flags are part of the [[XML:StNA#Animation_types|animation type list]].&lt;br /&gt;
&lt;br /&gt;
(static throws)&lt;br /&gt;
: Thrown1 = ###COMthrow_fw_p_tgt&lt;br /&gt;
: Thrown2 = ###COMthrow_fw_k_tgt&lt;br /&gt;
: Thrown3 = ###COMthrow_bk_p_tgt&lt;br /&gt;
: Thrown4 = ###COMthrow_bk_k_tgt&lt;br /&gt;
(running throws)&lt;br /&gt;
: Thrown5 = ###COMrun_throw_fw_p_tgt&lt;br /&gt;
: Thrown6 = ###COMrun_throw_fw_p_tgt&lt;br /&gt;
: Thrown7 = ###COMrun_throw_bk_k_tgt&lt;br /&gt;
: Thrown8 = ###COMrun_throw_bk_k_tgt (not tested)&lt;br /&gt;
(tackle throw = catching)&lt;br /&gt;
: Thrown9 = ###COMrun_tkl_fw_p_tgt (not tested)&lt;br /&gt;
: Thrown10 = ###COMrun_tkl_bk_p_tgt&lt;br /&gt;
(pistol disarms)&lt;br /&gt;
: Thrown11 = ###PISthrow_fw_p_tgt&lt;br /&gt;
: Thrown12 = ###PISthrow_fw_k_tgt&lt;br /&gt;
: Thrown13 = ###PISthrow_bk_p_tgt&lt;br /&gt;
(rifle disarm)&lt;br /&gt;
: Thrown14 = ###PISthrow_bk_k_tgt (not tested)&lt;br /&gt;
: Thrown15 = ###RIFthrow_fw_p_tgt&lt;br /&gt;
: Thrown16 = ###RIFthrow_bk_p_tgt&lt;br /&gt;
: Thrown17 = ###RIF? = (not tested)&lt;br /&gt;
----&lt;br /&gt;
About the naming:&lt;br /&gt;
: &amp;quot;fw&amp;quot; = face-to-face throw&lt;br /&gt;
: &amp;quot;bk&amp;quot; = thrower is facing victim&#039;s back&lt;br /&gt;
: &amp;quot;throw&amp;quot; inside TRAM names is sometimes shortened to &amp;quot;thr&amp;quot;&lt;br /&gt;
: &amp;quot;p&amp;quot;/&amp;quot;k&amp;quot; = triggered by punch or kick button (&amp;quot;p&amp;quot; is sometimes omitted)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;SelfDamage&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&amp;quot;&amp;lt;SelfDamage /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
&lt;br /&gt;
Works only with specific, hardcoded AnimTypes (mainly ThrownX, it&#039;s unknown if any other types work - that remains to be investigated). Using SelfDamage on an AnimType that wasn&#039;t intended for it will cause the game to crash. (ToDo: Checked if &amp;lt;Flag&amp;gt;ThrowTarget is enough to explain this. Modify a simple kick? For more please link to and use talk page.)&lt;br /&gt;
&lt;br /&gt;
From a practical standpoint, this means SelfDamage can be used only on ThrowTarget animations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Damage&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| sequence element&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Points&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Damage taken by character.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Frame of the animation when damage is dealt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Attacks&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Attack&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
| Only 2 attack parts per file are allowed. Normally the target gets only one hit. But if the attack frame ranges of both attack parts are overlapping, then the target can be [http://oni.bungie.org/forum/viewtopic.php?pid=39787#p39787 hit by both of them].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| First frame where damage can be inflicted on an opponent.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Last frame where damage can be inflicted on an opponent.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Bones&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| The bones which can inflict damage.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Flags&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|These are flags on an attack part, inside an &amp;lt;Attacks&amp;gt;&amp;lt;Attack&amp;gt; element. See the previous &amp;lt;Flags&amp;gt; for general flags on the TRAM.&lt;br /&gt;
: Unblockable&lt;br /&gt;
: Low - Target of attack needs to crouch in order to block this attack.&lt;br /&gt;
: High - Blocker needs to stand; if both Low and High are set, blocker can block from both standing and crouching positions.&lt;br /&gt;
: HalfDamage - Blocker receives half of the normal damage.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Knockback&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| Target gets knocked back by this amount.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;HitPoints&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Damage points inflicted by attack.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;HitType&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Animation type for opponent&#039;s animation when the attack isn&#039;t blocked. The flags are part of the [[XML:StNA#Animation_types|animation type list]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;HitLength&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Number of frames that the target should remain in his hit animation state when he gets hit.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;StunLength&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Number of frames that the target should remain in his blocking animation state when he blocks the attack.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;StaggerLength&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Number of frames that the target should perform his stagger animation after a successful block.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Extents&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Explained below. Automatically calculated by OniSplit if there&#039;s a DAE file referenced in the XML.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Extent&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| One tag per attack frame. Number of &amp;lt;Extent&amp;gt; tags = &amp;lt;Attack&amp;gt;&amp;lt;End&amp;gt; - &amp;lt;Attack&amp;gt;&amp;lt;Start&amp;gt; + 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Angle&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| In degrees.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Length&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MinY&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MaxY&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;AttackRing&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|  parent tag&lt;br /&gt;
| Always contains 36 &amp;lt;Length&amp;gt; tags, explained below. Automatically calculated by OniSplit if there&#039;s a DAE file referenced in the XML. (AttackRing was formerly known as &amp;quot;horizontal extents&amp;quot; in older versions of OniSplit.)&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Length&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| float&lt;br /&gt;
| Horizontal extents, explained below. They create a &amp;quot;danger zone&amp;quot; around the attacker which the AI uses to try to dodge an attack.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Export==&lt;br /&gt;
TRAM files can be extracted &#039;&#039;&#039;A) as pure XML&#039;&#039;&#039; files or &#039;&#039;&#039;B) as a pair of XML and DAE&#039;&#039;&#039; files. For editing the actual animation, you will want to use method B. While exporting an ONCC, you might see errors such as:&lt;br /&gt;
&lt;br /&gt;
 Cannot find instance &#039;TRAMKONCOMthrow_rev&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONCOMthrow_rev&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONRIFturn_right&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONOKOlev18_ZomStand&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONOKOcorner_hide&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONPIScorner_hide&#039;&lt;br /&gt;
&lt;br /&gt;
Ignore them, as those files doesn&#039;t exist. (Someday we should remove them from the TRACs.)&lt;br /&gt;
&lt;br /&gt;
===Via command line===&lt;br /&gt;
To export a single TRAM:&lt;br /&gt;
 onisplit -extract:xml output_path -anim-body:path_to\TRBS_or_ONCCname.oni path_to\TRAMname.oni&lt;br /&gt;
&lt;br /&gt;
To export merged TRAMs:&lt;br /&gt;
 onisplit -extract:xml output_path &#039;&#039;&#039;-anim-merge&#039;&#039;&#039; -anim-body:path_to\TRBS_or_ONCCname.oni path_to\TRAMname1.oni  path_to\TRAMnameN.oni&lt;br /&gt;
&lt;br /&gt;
===Via Vago===&lt;br /&gt;
[[Image:Vago_xml_plus_dae_extraction.png|thumb|200px|right|Combined extraction of DAE and XML.]]&lt;br /&gt;
&lt;br /&gt;
Change to Characters tab and follow these steps.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 1:&#039;&#039;&#039; Select &amp;quot;TRAM ONI&amp;quot; as input format (&amp;quot;From&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 2:&#039;&#039;&#039; Select &amp;quot;XML / XML &amp;amp; DAE&amp;quot; as output format (&amp;quot;To&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 3:&#039;&#039;&#039; Tick checkbox &amp;quot;Extract with TRBS / ONCC&amp;quot;. It&#039;s important this is done before adding a TRAM file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 4:&#039;&#039;&#039; Set full path of ONCC or TRBS.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 5:&#039;&#039;&#039; Add TRAM file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 6:&#039;&#039;&#039; Click &amp;quot;Convert&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Via Simple OniSplit GUI===&lt;br /&gt;
There was a long-standing problem with combined ONCC/TRAM files where the textures would be missing.&amp;lt;!--[Iritscen: I don&#039;t understand this sentence; is it important to keep this historical note?][Paradox: Geyser still didn&#039;t release a new OniSplit containing that fix, right?] With an older method you couldn&#039;t export non-native TRAM which meant to the TRAM had to be registered in the TRAC the ONCC is using.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.paradox.oni2.net/programs/Simple_OniSplit_GUI.zip Simple OniSplit GUI]&#039;&#039;&#039; post-edits the DAE to fix missing textures. The character-related .oni files must be all in one folder. Usually the level0_Final folder does the trick.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 1:&#039;&#039;&#039; Drag and drop the TRAM and ONCC into the [http://www.paradox.oni2.net/images/simpleOniSplitGui.png big field.] (One by one or simultaneously; the order doesn&#039;t matter.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 2:&#039;&#039;&#039; Hit &amp;quot;Convert&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Editing 3D data==&lt;br /&gt;
===Blender===&lt;br /&gt;
See the [[Blender]] article for a general tutorial on using the free program to create animations for Oni. It also contains a Blender addon for automating certain tasks, troubleshooting advice, and links to an animation rig that makes animation much easier.&lt;br /&gt;
&lt;br /&gt;
===XSI===&lt;br /&gt;
In the past, the community&#039;s preferred tool for any 3D modeling and animation was {{ModTool}}. However, this free program was discontinued in 2014, and modders did not want to be tied to an aging (not to mention Windows-only) program. Thus, we have generally moved to using Blender (see next section). The following information is preserved for historical purposes.&lt;br /&gt;
----&lt;br /&gt;
For the correct Mod Tool settings, see [[Mod Tool#Animating|HERE]].&lt;br /&gt;
&lt;br /&gt;
Here are some hints for creating animations when there is no rigging available:&lt;br /&gt;
* Use the ONCC model in your 3D editor that will actually make use of the animations. This makes sure that the pelvis height will match and that the character&#039;s feet will not float in the air or go through the ground. &lt;br /&gt;
* The first frame and last frames should match the probable previous and follow-up animations. This will reduce the necessity for long interpolations.&lt;br /&gt;
* When setting keyframes, each body part should have moved. This rule of thumb will give a more natural-looking animation.&lt;br /&gt;
* The first body part to be animated is always the pelvis.&lt;br /&gt;
* Watch out for pelvis rotations so that the XYZ rotations don&#039;t overlap too much, otherwise you will get into a [[wp:Gimbal_lock|gimbal lock]].&lt;br /&gt;
&lt;br /&gt;
Also see our [http://oni.bungie.org/forum/viewtopic.php?id=1433 OCF thread].&lt;br /&gt;
&lt;br /&gt;
==Import==&lt;br /&gt;
 onisplit -create output_path path_to\TRAMname.xml&lt;br /&gt;
&lt;br /&gt;
==Common operations on animations by the community==&lt;br /&gt;
===Speeding up existing animations===&lt;br /&gt;
s10k has created an XmlTools script that allows the speed-up of any existing TRAM by removing frames. More information and download link [http://mods.oni2.net/node/354 here.]&lt;br /&gt;
&lt;br /&gt;
==Selected notes on animation types==&lt;br /&gt;
===Attacks===&lt;br /&gt;
====Extents and XML====&lt;br /&gt;
&#039;&#039;&#039;As a regular modder you don&#039;t need to know how the attack ring and the extents get calculated.&#039;&#039;&#039; If you just want to create an attack animation then add an appropriate &amp;lt;Attacks&amp;gt; code block to your XML as seen in the [[#Using OniSplit to calculate extents|section below]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;How attack ring (horizontal extents) and extents get calculated&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Ever wondered how the AI can recognize incoming attacks and block or dodge them? Extents (found by geyser and fully uncovered by Neo) are the key. Imagine the character looked at from above, and visualize a circle with this character being at the center of the circle. Now divide this circle into 10° segments, and those are the 36 units of horizontal extents (that is, the lateral reach of the attack). The 0° point is directly in front of the character and 180° is behind the character. The segments run clockwise around the character. So the first Extent tag is the horizontal reach on the 0° line, the second tag is for the line 10° clockwise, and so on. Note that a frontal attack like a simple kick could hit a target not only if he&#039;s standing at 0° (directly in front), but also at 10° or 20° to the right, and also at 340° and 350° (a bit to the left). When setting these manually, you should guess the inner and outer ranges of the reach of the attacker&#039;s bones that have damage attached to them. Test these values with an AI that blocks often. If you did it right, your attack will often be blocked, but if the extent length is too high, the AIs will react when too far from you, which does not look good.&lt;br /&gt;
&lt;br /&gt;
There are two types of extents:&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;Extents&amp;gt;&#039;&#039;&#039; stores this info:&lt;br /&gt;
::&amp;lt;Angle&amp;gt; at which this extent radiates from the character.&lt;br /&gt;
::&amp;lt;Length&amp;gt; of this extent.&lt;br /&gt;
::&amp;lt;MinY&amp;gt; minimum height of this extent.&lt;br /&gt;
::&amp;lt;MaxY&amp;gt; maximum height of this extent.&lt;br /&gt;
:Length, MinY and MaxY serve to create an invisible area in space which is &amp;quot;dangerous to be in&amp;quot;. If an AI intersects with this area and notices it (refer to the Notice field in [[MELE]]), it will attempt to block or dodge according to its modifiers in its MELE profile.&lt;br /&gt;
::The number of &amp;lt;Extent&amp;gt;s is equal to the number of attack frames: &amp;lt;End&amp;gt; minus &amp;lt;Start&amp;gt; plus one (because the start frame counts too). For example, for TRAMKONCOMkick_low1: &amp;lt;End&amp;gt;30&amp;lt;/End&amp;gt; minus &amp;lt;Start&amp;gt;22&amp;lt;/Start&amp;gt; plus 1 = 9 &amp;lt;Extent&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;AttackRing&amp;gt; (formerly known as &amp;lt;HorizontalExtents&amp;gt;&#039;&#039;&#039; stores this info:&lt;br /&gt;
::36 fields (exactly 36, otherwise it won&#039;t compile back into a .oni file), which correspond to areas in 10° intervals around the character as described above.&lt;br /&gt;
&lt;br /&gt;
====Using OniSplit to calculate extents====&lt;br /&gt;
Let&#039;s say that you want to convert a non-attack animation to a damage-dealing animation. Non-attack TRAMs do not have extents information used to notify the AIs about incoming attacks, so how do you generate this information from the animation?&lt;br /&gt;
:1. Export the animation to XML with a body attached. If you extract using just &amp;quot;-extract:xml dest_folder TRAMsomething.oni&amp;quot;, you&#039;ll get the 3D animation data inside the XML (namely, the tags Heights, Velocities, Rotations, PositionOffset, and Positions; for an attack animation, you&#039;ll also get Attacks and AttackRing, and inside Attacks&#039; elements, each Attack element will have Extents at the end of it).&lt;br /&gt;
:However, if you extract this same animation using &amp;quot;-extract:xml dest_folder TRAMsomething.oni &#039;&#039;&#039;-anim-body ONCCtramuser.oni&#039;&#039;&#039;&amp;quot;, the animation data will be placed in a DAE file along with the character model geometry. Be sure to pick a body with a size that&#039;s representative of the character classes that will actually use this TRAM, because the extents will be calculated from it. The XML file will be very short without the 3D data in it — this is how we want the non-attack TRAM to look. We do not know the extents information that should go in Extents or AttackRing, so we just want to add the part that distinguishes a DAE-extracted attack TRAM XML from a DAE-extracted non-attack TRAM XML. That part is the Attacks section, without the Extents under each Attack.&lt;br /&gt;
:2. First, consider whether the TRAM should have something added to its Flags section, like Attack or ThrowTarget.&lt;br /&gt;
:3. Now add to the XML of the non-attack TRAM data in the following format (after the &amp;lt;SelfDamage /&amp;gt; section, typically):&lt;br /&gt;
        &amp;lt;Attacks&amp;gt;&lt;br /&gt;
            &amp;lt;Attack&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;1&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;10&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;RightWrist RightFist&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Flags /&amp;gt;&lt;br /&gt;
                &amp;lt;Knockback&amp;gt;4&amp;lt;/Knockback&amp;gt;&lt;br /&gt;
                &amp;lt;HitPoints&amp;gt;10&amp;lt;/HitPoints&amp;gt;&lt;br /&gt;
                &amp;lt;HitType&amp;gt;KnockdownHead&amp;lt;/HitType&amp;gt;&lt;br /&gt;
                &amp;lt;HitLength&amp;gt;5&amp;lt;/HitLength&amp;gt;&lt;br /&gt;
                &amp;lt;StunLength&amp;gt;8&amp;lt;/StunLength&amp;gt;&lt;br /&gt;
                &amp;lt;StaggerLength&amp;gt;0&amp;lt;/StaggerLength&amp;gt;&lt;br /&gt;
            &amp;lt;/Attack&amp;gt;&lt;br /&gt;
        &amp;lt;/Attacks&amp;gt;&lt;br /&gt;
:Do not add an AttackRing section after Attacks.&lt;br /&gt;
:4. Import this with &amp;quot;-create dest_folder TRAMsomething.xml&amp;quot;. The Extents sections and the AttackRing will be calculated by OniSplit from the attached DAE.&lt;br /&gt;
:5. If you need this information for a patch mod, run &amp;quot;-extract:xml&amp;quot; on the TRAMsomething.oni you&#039;ve created &amp;lt;u&amp;gt;without&amp;lt;/u&amp;gt; using &amp;quot;-anim-body&amp;quot;. Now you can copy the Extents and AttackRing data to your XML patch. For an example of how the patch should look, see the [http://mods.oni2.net/node/311 Domino Knockdowns] mod.&lt;br /&gt;
&lt;br /&gt;
===Combos===&lt;br /&gt;
The type and order of player input for triggering a given animation type (such as PPK) is hardcoded, and new animation types cannot be created. That being said, Oni has unused combo animation types, such as PKP, PKK, KPK, KPP, etc. that work perfectly fine and can be used to create new combos. To assign an animation type to a specific combo attack, you set a corresponding value in &amp;lt;Lookup&amp;gt;&amp;lt;Type&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Setting a value in the &amp;lt;Link&amp;gt; of &#039;&#039;&#039;&amp;lt;DirectAnimations&amp;gt;&#039;&#039;&#039; will do two things:&lt;br /&gt;
# It will increase the time window for player input, meaning the next animation can be executed more easily. (In vanilla Oni, the Crescent Moon Kick has no link in KONCOMcomb_k_k_kfw and therefore is difficult to use.)&lt;br /&gt;
# It disables &amp;lt;Interpolation&amp;gt;&amp;lt;End&amp;gt; for the next combo anim.&lt;br /&gt;
# It enables &amp;lt;Pause&amp;gt;&amp;lt;Soft&amp;gt; and &amp;lt;Pause&amp;gt;&amp;lt;Hard&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Just Frame input===&lt;br /&gt;
Implemented by Delano762, inspired by the game series Tekken, a Just Frame (&amp;quot;JF&amp;quot;) move means that you have to press certain keys (W+K or W+P) at the exact same time, which is more difficult than it might sound. Delano&#039;s mod [http://mods.oni2.net/node/353 54000 New Combat Moves for Konoko] has a collection of animations which utilize existing animation states differently to create new moves.&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
* new forward kick = TRAMKONCOMkick_fw_JF &amp;lt;FromState&amp;gt;Standing&lt;br /&gt;
** key strokes: w + k&lt;br /&gt;
* old forward kick = TRAMKONCOMkick_fw &amp;lt;FromState&amp;gt;RunStart&lt;br /&gt;
** key strokes: w, k&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
* new forward punch = TRAMKONCOMpunch_fw_JF &amp;lt;FromState&amp;gt;Standing&lt;br /&gt;
** key strokes: w + p&lt;br /&gt;
* old forward punch = TRAMKONCOMpunch_fw &amp;lt;FromState&amp;gt;RunStart&lt;br /&gt;
** key strokes: w, p&lt;br /&gt;
&lt;br /&gt;
Note that these animations are referred to as JF moves, not JF combos. The Crescent Moon Kick, as mentioned above, is an unintentional JF combo found in vanilla Oni.&lt;br /&gt;
&lt;br /&gt;
===Throws===&lt;br /&gt;
&lt;br /&gt;
==States==&lt;br /&gt;
The first anim state of source (src) and target (tgt) is the &amp;quot;primary&amp;quot; &amp;lt;FromState&amp;gt;. The others &amp;lt;FromState&amp;gt; entries are located in &amp;lt;Shortcut&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
==Types==&lt;br /&gt;
Throw target animations are registered in the TRAC of the throw initiator (AKA the throw source). Target animations are forced onto the other character. Throw target (TRAM*tgt) animations can only cover up to 256 frames (0-255). &lt;br /&gt;
&lt;br /&gt;
The game identifies which Target animation is it supposed to play through the &#039;&#039;ThrownX&#039;&#039; animation types. Each throw, together with its corresponding Target animation, uses one of the 17 available &#039;&#039;ThrownX&#039;&#039; animation types. These types are used in three tags:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;TargetType&amp;gt; tag in the Source animation,&lt;br /&gt;
* &amp;lt;Type&amp;gt; and &amp;lt;AimingType&amp;gt; tags in the Target animation.&lt;br /&gt;
&lt;br /&gt;
For example, Konoko&#039;s forward punch throw / &#039;&#039;KONCOMthrow_fw_p&#039;&#039; uses Thrown1 as its TargetType tag:&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;TargetType&amp;gt;Thrown1&amp;lt;/TargetType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the corresponding target animation, &#039;&#039;KONCOMthrow_fw_p&#039;&#039;, uses Thrown1 in the Type and AimingType tags:&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;Type&amp;gt;Thrown1&amp;lt;/Type&amp;gt;&lt;br /&gt;
            &amp;lt;AimingType&amp;gt;Thrown1&amp;lt;/AimingType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;ThrownX&#039;&#039; anim types work like slots - if you want to add a new throw to the game, you have to assign both the Source and the Target animations the same ThrownX type in the tags listed above. While these &amp;quot;pairs&amp;quot; are organized within vanilla animations according to the Throw Table below, this is nothing more than a convention, and as a result &#039;&#039;ThrownX&#039;&#039; types can be used freely. To give an example, while all Forward Punch Throws in the game seem to use the Thrown1 type, you can swap those types with another throw and they will work just as fine.&lt;br /&gt;
&lt;br /&gt;
The fact that the game has only 17 &#039;&#039;ThrownX&#039;&#039; types is a major limitation - this effectively means that each character can have no more than 17 throws - out of which only 4 are unused by any character in the game. This prevents modders from creating a significant number of throws despite the game allowing great flexibility in creating new throws by mixing Animation States, Animation Types and &amp;lt;Varient&amp;gt; tags.&lt;br /&gt;
&lt;br /&gt;
 {{divhide|Throw table}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=100%&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=2 width=240 | names&lt;br /&gt;
! rowspan=2 width=40 | key combo&lt;br /&gt;
! colspan=4 | context&lt;br /&gt;
! colspan=2 style=&amp;quot;background: #FF0;&amp;quot; | anim type&lt;br /&gt;
! rowspan=2 width=400 | image&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;!--context--&amp;gt;&lt;br /&gt;
! width=40 | varient&lt;br /&gt;
! width=60 | src state&lt;br /&gt;
! width=60 | tgt state&lt;br /&gt;
! width=85 | facing setup&amp;lt;!--tgt position only?(or pelvis rotation?)--&amp;gt;&lt;br /&gt;
&amp;lt;!--facing setup tgt rotation relative to src pelvis (or tgt pelvis position?)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--anim type--&amp;gt;&lt;br /&gt;
! width=40 style=&amp;quot;background: #FF0;&amp;quot; | src&lt;br /&gt;
! width=40 style=&amp;quot;background: #FF0;&amp;quot; | tgt&lt;br /&gt;
|-&lt;br /&gt;
! colspan=9 | normal throws a.k.a. static throws&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; static throw forward punch&lt;br /&gt;
: TRAMKONCOMthrow_fw_p&lt;br /&gt;
: TRAMKONCOMthrow_fw_p_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; P + ↑&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; COM&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt; &#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunStart&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt; &#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crouch&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;face&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;ThrowForwardPunch&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown1&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONCOMthrow_fw_p.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; static throw forward kick&lt;br /&gt;
: TRAMKONCOMthrow_fw_k&lt;br /&gt;
: TRAMKONCOMthrow_fw_k_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; K + ↑&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; COM&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt; &#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunStart&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt; &#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crouch&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;face&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;ThrowForwardKick&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown2&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONCOMthrow_fw_k.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; static throw backward punch&lt;br /&gt;
: TRAMKONCOMthrow_bk&lt;br /&gt;
: TRAMKONCOMthrow_bk_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; P + ↑&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; COM&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt; &#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunStart&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt; &#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crouch&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingRightDown&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;back&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;ThrowBackwardPunch&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown3&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONCOMthrow_bk.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; static throw backward punch&lt;br /&gt;
: TRAMKONCOMthrow_bk_k&lt;br /&gt;
: TRAMKONCOMthrow_bk_k_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; K + ↑&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; COM&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt; &#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunStart&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt; &#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crouch&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingRightDown&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;back&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;ThrowBackwardKick&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown4&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONCOMthrow_bk_k.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
! colspan=9 | run throws&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; run throw forward punch&lt;br /&gt;
: (forward &amp;quot;lariat&amp;quot;)&lt;br /&gt;
: TRAMKONCOMrun_throw_fw&lt;br /&gt;
: TRAMKONCOMrun_throw_fw_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; P + ↑(↑)&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; COM&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt; &#039;&#039;&#039;&amp;lt;span style=&amp;quot;color: silver;&amp;quot;&amp;gt;None&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunningLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
RunningRightDown&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt; &#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunningLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
RunningRightDown&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingRightDown&amp;lt;br&amp;gt;&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;face&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;RunThrowForwardPunch&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown5&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONCOMrun_throw_fw.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; run throw forward kick&lt;br /&gt;
: TRAMKONCOMrun_thw_fw_k&lt;br /&gt;
: TRAMKONCOMrun_thw_fw_k_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; K + ↑(↑)&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; COM&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color: silver;&amp;quot;&amp;gt;None&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunningLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
RunningRightDown&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunningLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
RunningRightDown&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingRightDown&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;face&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;RunThrowForwardKick&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown6&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONCOMrun_thw_fw_k.jpg|200px]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
identical headers but&lt;br /&gt;
STRCOMrun_thw_fw_p (face-to-face, with righty angle) links to Thrown5&lt;br /&gt;
STRCOMrun_thw_fw_pl (face-to-face, with lefty angle) links to Thrown6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; run throw backward punch&lt;br /&gt;
: (backward &amp;quot;lariat&amp;quot;)&lt;br /&gt;
: TRAMKONCOMrun_throw_bk&lt;br /&gt;
: TRAMKONCOMrun_throw_bk_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; P + ↑(↑)&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; COM&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color: silver;&amp;quot;&amp;gt;None&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunningLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
RunningRightDown&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunningBackLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
RunningBackRightDown&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingRightDown&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;back&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;RunThrowBackwardPunch&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown7&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt;&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; run throw backward kick&lt;br /&gt;
: TRAMREDCOMrun_thw_bk_k&lt;br /&gt;
: TRAMREDCOMrun_thw_bk_k_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; K + ↑(↑)&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; COM&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color: silver;&amp;quot;&amp;gt;None&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunningLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
RunningRightDown&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunningBackLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
RunningBackRightDown&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;back&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;RunThrowBackwardKick&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown8&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:REDCOMrun_thw_bk_k.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
! colspan=9 | catching throws a.k.a. tackle throws&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; tackle throw backward kick?&amp;lt;br&amp;gt;(never used)&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt;&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt;&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; Thrown9&lt;br /&gt;
|&amp;lt;!--image--&amp;gt;&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; tackle throw backward punch&lt;br /&gt;
: TRAMKONCOMrun_tkl_bk_p&lt;br /&gt;
: TRAMKONCOMrun_tkl_bk_p_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; P + ↑(↑)&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; COM&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color: silver;&amp;quot;&amp;gt;None&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunningLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
RunningRightDown&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color: silver;&amp;quot;&amp;gt;None&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunningLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
RunningRightDown&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;back&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;RunThrowBackwardPunch&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown10&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONCOMrun_tkl_bk_p.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
! colspan=9 | disarm throws&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; pistol disarm throw forward punch&lt;br /&gt;
: TRAMKONPISthrow_fw_p&lt;br /&gt;
: TRAMKONPISthrow_fw_p_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; P + ↑&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; PIS&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunStart&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crouch&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;face&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;ThrowForwardPunch&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown11&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONPISthrow_fw_p.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; pistol disarm throw forward kick&lt;br /&gt;
: TRAMKONPISthrow_fw_k&lt;br /&gt;
: TRAMKONPISthrow_fw_k_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; K + ↑&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; PIS&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunStart&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crouch&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;face&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;ThrowForwardKick&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown12&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONPISthrow_fw_k.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; pistol disarm throw backward punch&lt;br /&gt;
: TRAMKONPISthrow_bk&lt;br /&gt;
: TRAMKONPISthrow_bk_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; P + ↑&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; PIS&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunStart&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crouch&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingLeftDown&amp;lt;br&amp;gt;&lt;br /&gt;
WalkingRightDown&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;back&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;ThrowBackwardPunch&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown13&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONPISthrow_bk.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; (never used)&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt;&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt;&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; Thrown14&lt;br /&gt;
|&amp;lt;!--image--&amp;gt;&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; rifle disarm throw forward punch&lt;br /&gt;
: TRAMKONRIFthrow_fw_p&lt;br /&gt;
: TRAMKONRIFthrow_fw_p_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; P + ↑&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; RIF&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunStart&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crouch&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;face&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;ThrowForwardPunch&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown15&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONRIFthrow_fw_p.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; rifle disarm throw backward punch&lt;br /&gt;
: TRAMKONRIFthrow_bk_p&lt;br /&gt;
: TRAMKONRIFthrow_bk_p_tgt&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt; P + ↑&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt; RIF&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RunStart&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&#039;&#039;&#039;Standing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crouch&amp;lt;br&amp;gt;&lt;br /&gt;
Stunned&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt; face-to-&#039;&#039;&#039;back&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt; &#039;&#039;&#039;ThrowBackwardPunch&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; &#039;&#039;&#039;Thrown16&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;!--image--&amp;gt; [[image:KONRIFthrow_bk_p.jpg|200px]]&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;!--names--&amp;gt; (never used)&lt;br /&gt;
|&amp;lt;!--key combo--&amp;gt;&lt;br /&gt;
|&amp;lt;!--varient--&amp;gt;&lt;br /&gt;
|&amp;lt;!--src state--&amp;gt;&lt;br /&gt;
|&amp;lt;!--tgt state--&amp;gt;&lt;br /&gt;
|&amp;lt;!--facing setup--&amp;gt;&lt;br /&gt;
|&amp;lt;!--anim type src--&amp;gt;&lt;br /&gt;
|&amp;lt;!--anim type tgt--&amp;gt; Thrown17&lt;br /&gt;
|&amp;lt;!--image--&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{{divhide|end}}&lt;br /&gt;
&lt;br /&gt;
Looks like there was/is support for [[OBD:BINA/OBJC/MELE/MoveList/Throw|running disarms]]. Though unused types for new Thrown&#039;&#039;N&#039;&#039; would be needed. On second thought, one should check if we can&#039;t simply make a &#039;&#039;&#039;running (tgt + src) variant&#039;&#039;&#039; of disarms.&lt;br /&gt;
&lt;br /&gt;
====Forward throws====&lt;br /&gt;
Scenario: You load two characters into Mod Tool and rotate (+/-180°) the throw target character because you need them to stand face to face as you work on an animation. When you are done animating, the target animation would need to be reversed again. This means multiplying the velocities by -1; the rotation also needs correcting. So it looks like you need *(-1) for the x rotation and -/+180° (depending on your initial change) for the Y rotation.&lt;br /&gt;
&lt;br /&gt;
=====BlenderOni Throw Adjust=====&lt;br /&gt;
There is a Blender script implemented within the BlenderOni addon for rotating and adding PositionOffset to a forward throw Target animation. It is capable of adjusting both forward and back throws. The script&#039;s old version can be accessed [[Blender/Obsolete_scripts#Script_for_adjusting_forward_throw_targets|HERE.]]&lt;br /&gt;
&lt;br /&gt;
===Run animations===&lt;br /&gt;
Here&#039;s a breakdown of the Striker&#039;s run animations, meant as an illustration for what would be needed to make new run TRAMs.&lt;br /&gt;
&lt;br /&gt;
Run cancel:&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
* STRIKErun1stepa&lt;br /&gt;
* STRIKErun1stepb&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
&lt;br /&gt;
Run – &#039;&#039;a minimal cycle&#039;&#039;:&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
* STRIKErun1stepa&lt;br /&gt;
* STRIKErunstart&lt;br /&gt;
* STRIKErun_rt&lt;br /&gt;
* STRIKErun_lt (optional)&lt;br /&gt;
* STRIKErunstop&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
&lt;br /&gt;
Follow the images below from right to left.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:XML_TRAM_STRIKErunstop.png|STRIKErunstop&lt;br /&gt;
Image:XML_TRAM_STRIKErun_lt.png|STRIKErun_lt&lt;br /&gt;
Image:XML_TRAM_STRIKErun_rt.png|STRIKErun_rt&lt;br /&gt;
Image:XML_TRAM_STRIKErunstart.png|STRIKErunstart&lt;br /&gt;
Image:XML_TRAM_STRIKErun1stepa.png|STRIKErun1stepa&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of unused animations==&lt;br /&gt;
Here are all the known unused animations. These could be recycled in a new mod.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;From the original game&#039;&#039;&#039;&lt;br /&gt;
* KONOKOconsole_punch: What the name says (the engine can use that animation depending on the console&#039;s configuration, see [[OBD:BINA/OBJC/CONS|CONS]]) .&lt;br /&gt;
* KONOKOlev3_intro: Looks like she&#039;s placing something (bomb?) and then running away.&lt;br /&gt;
* KONOKOlev4_undress: From an aborted clothes-changing cutscene.&lt;br /&gt;
* KONOKOlev16_bomb: Planting a bomb.&lt;br /&gt;
* KONCOMsuper_kick: Now used in [[OTA]] as a spawn event, and by the fan-made character [[Shinatama Evolved]].&lt;br /&gt;
* KONCOMsuper_punch: KONCOMpunch_heavy but without the shouted attack name, has HalfDamage flag, and does 10 less damage in its first attack part.&lt;br /&gt;
* COMPISidle_special1: Comguy checking environment and his gun; meant for a feature that would visually depict an elevation in the AI&#039;s level of alertness after, say, hearing a noise.&lt;br /&gt;
* STRPISidle_special1: Striker checking his his gun and communicating with an ally (another unused alertness-elevation animation).&lt;br /&gt;
* THUGlev1_direct: Thug probably directing a truck driver.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;From modders&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Image:female_stun.jpg|right|thumb|Char A and Char B performing stun animations.]]&lt;br /&gt;
&lt;br /&gt;
* http://mods.oni2.net/node/376&lt;br /&gt;
** StrikerKneeStepKickThrow.zip&lt;br /&gt;
** REDCOMjump_fw_crouch--double_flip--dae.zip&lt;br /&gt;
** KONprone_getup--dae.zip&lt;br /&gt;
** KONRIF_k_bk_throw.zip&lt;br /&gt;
** female_stun--dae.zip&lt;br /&gt;
&lt;br /&gt;
==Special effects==&lt;br /&gt;
If the scene is overloaded by too many particles (including motion blur), these effects will cease being rendered. So don&#039;t overuse effects.&lt;br /&gt;
&lt;br /&gt;
===Color trails===&lt;br /&gt;
Open the XML-accompanied TRAM, search for the &amp;quot;Particles&amp;quot; tag, and insert your markup.&lt;br /&gt;
&lt;br /&gt;
First example: TRAMSTRCOMcomb_p_p.xml&lt;br /&gt;
&lt;br /&gt;
[[Image:Colorful_contrail_added.png|right|thumb]]&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Particles&amp;gt;&lt;br /&gt;
            &amp;lt;Particle&amp;gt;&lt;br /&gt;
                &amp;lt;StartFrame&amp;gt;0&amp;lt;/StartFrame&amp;gt;&lt;br /&gt;
                &amp;lt;EndFrame&amp;gt;12&amp;lt;/EndFrame&amp;gt;&lt;br /&gt;
                &amp;lt;Bone&amp;gt;LeftFist&amp;lt;/Bone&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;contrail&amp;lt;/Name&amp;gt;&lt;br /&gt;
            &amp;lt;/Particle&amp;gt;&lt;br /&gt;
        &amp;lt;/Particles&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;contrail&amp;quot; is looked up by the character class (ONCC) that emits the actual particle; here it is &amp;quot;h2h_strtrail_e01&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This second example is about creating two different contrails in a TRAM at the same time. The animation is &amp;quot;TRAMSTRCOMpunch_heavy.xml&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Different_contrails_in_attack.png|right|thumb]]&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Particles&amp;gt;&lt;br /&gt;
            &amp;lt;Particle&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;0&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;54&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Bone&amp;gt;RightWrist&amp;lt;/Bone&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;contrail&amp;lt;/Name&amp;gt;&lt;br /&gt;
            &amp;lt;/Particle&amp;gt;&lt;br /&gt;
            &amp;lt;Particle&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;0&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;54&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Bone&amp;gt;LeftWrist&amp;lt;/Bone&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;&#039;&#039;&#039;contrail_2&#039;&#039;&#039;&amp;lt;/Name&amp;gt;&lt;br /&gt;
            &amp;lt;/Particle&amp;gt;&lt;br /&gt;
        &amp;lt;/Particles&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that you need to register the second contrail in the ONCC as well. Using your own contrail particle is also possible; just insert its name between the &amp;lt;Type&amp;gt; tags.&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;ONCPParticle&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;contrail&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Type&amp;gt;h2h_strtrail_e01&amp;lt;/Type&amp;gt;&lt;br /&gt;
                &amp;lt;BodyPart&amp;gt;-1&amp;lt;/BodyPart&amp;gt;&lt;br /&gt;
            &amp;lt;/ONCPParticle&amp;gt;&lt;br /&gt;
            &amp;lt;ONCPParticle&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;&#039;&#039;&#039;contrail_2&#039;&#039;&#039;&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Type&amp;gt;&#039;&#039;&#039;h2h_murtrail_e01&#039;&#039;&#039;&amp;lt;/Type&amp;gt;&lt;br /&gt;
                &amp;lt;BodyPart&amp;gt;-1&amp;lt;/BodyPart&amp;gt;&lt;br /&gt;
            &amp;lt;/ONCPParticle&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Motion blur===&lt;br /&gt;
[[Image:XML_TRAM_willow_kick_with_motion_blur.jpg|thumb|200px]]&lt;br /&gt;
Motion blur in Oni works much like ghosting/onion skinning features in any animation software: In the frame range specified by &amp;lt;Start&amp;gt; and &amp;lt;End&amp;gt; an additional instance of body parts specified in &amp;lt;Bones&amp;gt; are rendered for additional extra frames specified by &amp;lt;Lifetime&amp;gt;, with transparency set by &amp;lt;Alpha&amp;gt;, and every &amp;lt;Interval&amp;gt; frames within the frame range.&lt;br /&gt;
Example snippet from KONCOMcomb_p_p_k:&lt;br /&gt;
        &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
            &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;RightThigh RightCalf RightFoot&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;20&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;28&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Lifetime&amp;gt;4&amp;lt;/Lifetime&amp;gt;&lt;br /&gt;
                &amp;lt;Alpha&amp;gt;127&amp;lt;/Alpha&amp;gt;&lt;br /&gt;
                &amp;lt;Interval&amp;gt;1&amp;lt;/Interval&amp;gt;&lt;br /&gt;
            &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
        &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The one noteworthy thing is that you can have multiple motion blur sequences. If you wanted to add an extra motion blur to the above animation, you could do something like this:&lt;br /&gt;
        &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
            &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;LeftThigh LeftCalf LeftFoot&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;10&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;18&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Lifetime&amp;gt;4&amp;lt;/Lifetime&amp;gt;&lt;br /&gt;
                &amp;lt;Alpha&amp;gt;127&amp;lt;/Alpha&amp;gt;&lt;br /&gt;
                &amp;lt;Interval&amp;gt;1&amp;lt;/Interval&amp;gt;&lt;br /&gt;
            &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
            &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;RightThigh RightCalf RightFoot&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;20&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;28&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Lifetime&amp;gt;4&amp;lt;/Lifetime&amp;gt;&lt;br /&gt;
                &amp;lt;Alpha&amp;gt;127&amp;lt;/Alpha&amp;gt;&lt;br /&gt;
                &amp;lt;Interval&amp;gt;1&amp;lt;/Interval&amp;gt;&lt;br /&gt;
            &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
        &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Impact effect===&lt;br /&gt;
Impact effects – mostly particle – are chosen based on logic written within [[XML:BINA/ONIE#Visual guides: weapon, melee, environment|ONIE]]. Furthermore particles must be registered in [[XML:ONCC|ONCC]]: You probably want to look at ONIA instead of ONCP.&lt;br /&gt;
&lt;br /&gt;
[[Image:XML_TRAM_KONCOMkick_fw_with_ninflash1.jpg|thumb|200px]]&lt;br /&gt;
&lt;br /&gt;
{{XML}}&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=XML:TRAM&amp;diff=41214</id>
		<title>XML:TRAM</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=XML:TRAM&amp;diff=41214"/>
		<updated>2023-10-08T18:20:50Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Combos */ Added information on unused combo animation types&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{XML_File_Header | prev=TRAC | type=TRAM | next=TRAS | name=Totoro Animation}}&lt;br /&gt;
{{update}}&lt;br /&gt;
{{TOCfloat|side=right}}&lt;br /&gt;
==General information==&lt;br /&gt;
TRAM files — animation data for characters — are basically made of three chunks:&lt;br /&gt;
* Metadata or &amp;quot;header&amp;quot;: animation type, state, flags, particle, sounds, etc.&lt;br /&gt;
* Animation data: &#039;&#039;&#039;pelvis heights, pelvis velocities (root motion)&#039;&#039;&#039;, bone rotations&lt;br /&gt;
* Attack data: damage, self-damage, extents (danger zones for AI awareness) and throws&lt;br /&gt;
&lt;br /&gt;
Root motion: a character moves by changing the position of its root bone (pelvis). The animated legs just create the &#039;&#039;&#039;illusion for the player&#039;&#039;&#039; that they are responsible for the motion.&lt;br /&gt;
&lt;br /&gt;
Bones: Each character has &#039;&#039;&#039;19 separate body parts&#039;&#039;&#039; which get animated (rotated) relative to each other. Compared to modern games Oni&#039;s bone system is [[wp:Deprecation|deprecated]]. The body doesn&#039;t get deformed by following animated bones. Oni modders often use the terms mesh and bone interchangeably. Only the pelvis has &#039;&#039;&#039;translation&#039;&#039;&#039; data (heights and velocities) besides rotations. The hierarchy of the body parts (or bones) is determined by [[XML:TRBS#Standard_TRIA_hierarchy|TRIA]].&lt;br /&gt;
&lt;br /&gt;
The term &#039;&#039;&#039;animation&#039;&#039;&#039; is often shortened to &#039;&#039;&#039;anim&#039;&#039;&#039; by modders, following the naming of commands in BSL: chr_wait_animstate, chr_wait_animtype, env_anim, etc.&lt;br /&gt;
&lt;br /&gt;
TRAMs used in Oni follow a naming pattern. A list of all combat TRAMs in-game and their naming can be found [[Combat moves|here.]]&lt;br /&gt;
&lt;br /&gt;
==Decision path of animation lookup==&lt;br /&gt;
* First the game builds a pool of anims a character can use. They are loaded from the TRAC file registered in [[ONCC]], including parent TRACs.&lt;br /&gt;
* Anims from a child TRAC override those of the parent if their combination of state, type and variant is exactly the same.&lt;br /&gt;
* Child TRACs usually omit some anims. For example, Elite Strikers don&#039;t have their own run anims, so they use the parent anims of normal Strikers. See [[XML:TRAC|TRAC]] page for details.&lt;br /&gt;
* A character always possesses a single animation state. This term derives from state machines, but you only need to know that states are the first point in the decision path determining what anims are actually allowed to play at a given moment.&lt;br /&gt;
* Here is the full decision path:&lt;br /&gt;
** anim &#039;&#039;&#039;state&#039;&#039;&#039; check&lt;br /&gt;
** event (user input, or engine input for the AI) -&amp;gt; [[XML_talk:StNA|context check]] -&amp;gt; anim &#039;&#039;&#039;type&#039;&#039;&#039; check&lt;br /&gt;
** anim &#039;&#039;&#039;variant&#039;&#039;&#039; check&lt;br /&gt;
** TRAC &#039;&#039;&#039;weight&#039;&#039;&#039; check&lt;br /&gt;
&lt;br /&gt;
Detailed example: Let&#039;s say that we shapeshifted to a Ninja ONCC, we are in the state Standing, and we hit the action key to perform a taunt. The engine recognizes the context (a hostile character to interact with) and looks up anims of type Taunt. Since we are in combat mode, the next anim must be of variant Combat if possible. These lookups boil down to two valid possible anims: NINCOMtaunt1 and NINCOMtaunt2. If there are multiple anims available at this point, the engine picks one of them randomly.&lt;br /&gt;
&lt;br /&gt;
However, NINCOMtaunt1 has a TRAC Weight (probability) of 100 while NINCOMtaunt2 has a TRAC Weight value of just 5. So the chances are quite high that we will not see the Moon Walk taunt.&lt;br /&gt;
&lt;br /&gt;
Keep in mind that if the engine cannot find an anim of a specific variant, it will fall back to a non-variant anim instead.&lt;br /&gt;
&lt;br /&gt;
Confused by how Weights work? Apparently, the Weight value is only one part of the equation — otherwise NINCOMtaunt2 would never execute. If there is only one anim to choose from, it will always play no matter what its Weight, even if it is zero. When it comes to multiple anims being a valid choice, the calculation seems to be: weight / sum of all weights. For NINCOMtaunt2, this means 5 / 105 = 0.047 (4.7%).&lt;br /&gt;
&lt;br /&gt;
==List of tags, types, and flags==&lt;br /&gt;
Use the search function in your browser to quickly find a tag.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=100%&lt;br /&gt;
|width=120px| &#039;&#039;&#039;tag&#039;&#039;&#039;&lt;br /&gt;
|width=100px| &#039;&#039;&#039;type&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Lookup&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Type&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_types|HERE]]. The pool of valid TRAMs (animations a character can choose from) is built from the TRAC files registered in the ONCC. Most of the anim types are connected to player inputs.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;AimingType&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_types|HERE]]. The pool of valid TRAMs, and therefore TRASs (aiming screens a character can choose from) is built from the TRSC files registered in the ONCC.&lt;br /&gt;
:&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;FromState&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
| [[Image:chr_debug_characters_shows_interpolated_animations.jpg|thumb|400px|right|Primary &amp;lt;FromState&amp;gt; in &amp;lt;Lookup&amp;gt; uses about 8 interpolating frames by default. Use Shortcut&#039;s &amp;lt;FromState&amp;gt; to override this frame number.]]&lt;br /&gt;
&lt;br /&gt;
Look them up over [[XML:StNA#Animation_states|HERE]].&lt;br /&gt;
: When FromState is set to None, some default behaviors are ignored and are replaced by Shortcuts.&lt;br /&gt;
: Shortcuts extend the number of states from which an animation can be played and under what conditions (replacing this atomic yes/no).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ToState&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_states|HERE]].&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Varient&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|(misspelled because Oni misspells it) If unused, the tag will simply be &amp;quot;&amp;lt;Varient /&amp;gt;&amp;quot;, such as for non-combat animations. Otherwise it contains one of these values:&lt;br /&gt;
: Combat&lt;br /&gt;
: LeftPistol&lt;br /&gt;
: LeftRifle&lt;br /&gt;
: Panic&lt;br /&gt;
: RightPistol&lt;br /&gt;
: RightRifle&lt;br /&gt;
: Sprint&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;FirstLevel&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|Number of first level in which move becomes available to the player (&amp;quot;0&amp;quot; to make it available from the start).&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Shortcuts&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
|&lt;br /&gt;
Works as an &#039;&#039;&#039;alternative FromState&#039;&#039;&#039; collection.&lt;br /&gt;
&lt;br /&gt;
Shortcuts are accepted if their &amp;lt;Shortcut&amp;gt;&amp;lt;FromState&amp;gt; value differs from the &amp;quot;primary&amp;quot; &amp;lt;Lookup&amp;gt;&amp;lt;FromState&amp;gt; value. In other words, if you want to make a &#039;&#039;&#039;Shortcut&#039;&#039;&#039; that uses the &#039;&#039;&#039;same FromState&#039;&#039;&#039; value then you have to set &#039;&#039;&#039;primary FromState&#039;&#039;&#039; value to &#039;&#039;&#039;None&#039;&#039;&#039;. By doing that, the hardcoded interpolation frame length of about 8 frames can be overridden.&lt;br /&gt;
&lt;br /&gt;
In the following example, the new interpolation length is 0. This will require the animation to match perfectly with the previous one. For a smooth transition to the next animation, set a suitable value at &amp;lt;Interpolation&amp;gt;&amp;lt;End&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Lookup&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
            &amp;lt;FromState&amp;gt;None&amp;lt;/FromState&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
            &amp;lt;Shortcuts&amp;gt;&lt;br /&gt;
                &amp;lt;Shortcut&amp;gt;&lt;br /&gt;
                    &amp;lt;FromState&amp;gt;Standing&amp;lt;/FromState&amp;gt;&lt;br /&gt;
                    &amp;lt;Length&amp;gt;0&amp;lt;/Length&amp;gt;&lt;br /&gt;
                    &amp;lt;ReplaceAtomic&amp;gt;no&amp;lt;/ReplaceAtomic&amp;gt;&lt;br /&gt;
                &amp;lt;/Shortcut&amp;gt;&lt;br /&gt;
            &amp;lt;/Shortcuts&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:TRAM interpolation - standard case.jpg|thumb|400px|left|Scenario A: hardcoded interpolation of 8 frames. Scenario B: changeable interpolation frame number.]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Shortcut&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;FromState&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_types|HERE]].&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Length&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int16&lt;br /&gt;
|Amount of interpolating frames. While interpolations of rotation are less noticeable, interpolations of different positions can cause drift (i.e. sliding).&lt;br /&gt;
&lt;br /&gt;
This is especially observed for transitions from idle to movements and vice versa — basically any combination of animations with different accelerations at start and end. By default, animations without specified Shortcut interpolation give about 8 frames of interpolation. For moves starting or ending in idle, it&#039;s better not to use interpolation. Just give the start and end frames the same positions and rotation values as the idle. Interpolations should always be considered a &#039;&#039;last resort&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
This drift can be observed even in vanilla animations — most prominently in Konoko&#039;s comb_k. Konoko&#039;s left foot should be in a fixed position as the animation starts from from Konoko&#039;s idle pose. However, the interpolation is causing her left foot to drift noticeably to the right and a bit forward.&lt;br /&gt;
&lt;br /&gt;
The reason this happens is because the interpolation &amp;quot;mixes&amp;quot; two animations. When one animation transitions into another via interpolation, part of the animation system continues playing the initial animation, and part of it is playing the follow-up animation, with all the rotations and positions getting linearly interpolated.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;ReplaceAtomic&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: yes&lt;br /&gt;
: no&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Flags&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|These are top-level flags on the whole animation. See the other &amp;lt;Flags&amp;gt; for flags on an attack part.&lt;br /&gt;
:RuntimeLoaded&lt;br /&gt;
::(This bit is not stored on disk; it is used at runtime to mark that the animation was loaded.)&lt;br /&gt;
:Invulnerable&lt;br /&gt;
::While playing this animation, the player is invulnerable to melee damage and also cannot be thrown. Damage from particles and fall damage still hurt.&lt;br /&gt;
:BlockHigh&lt;br /&gt;
::While playing this animation, the player is invulnerable to high or undefined attacks within some arc in front of him. If you set this flag on an animation where the player character is spinning, then the character can still be kicked in the back or thrown.&lt;br /&gt;
:BlockLow&lt;br /&gt;
::Same as above, only it can block low or undefined attacks.&lt;br /&gt;
:Attack&lt;br /&gt;
::Animations with an attack part have this turned on. It&#039;s unclear what it does, but it may enable the melee soft-lock (where the character turns a bit during the animation to face a nearby enemy).&lt;br /&gt;
:DropWeapon&lt;br /&gt;
::If the player is armed, he drops his weapon when this animation plays.&lt;br /&gt;
:InAir&lt;br /&gt;
::Something to do with jumps; not investigated.&lt;br /&gt;
:Atomic&lt;br /&gt;
::The whole animation must be played; player cannot interrupt it once it starts.&lt;br /&gt;
:NoTurn&lt;br /&gt;
:::Player cannot turn by mouse while performing this animation.&lt;br /&gt;
:AttackForward&lt;br /&gt;
::Unknown, but it looks like this is a hint for the AI about where an attack is aiming, from the player&#039;s point of view.&lt;br /&gt;
:AttackLeft&lt;br /&gt;
::Same as above.&lt;br /&gt;
:AttackRight&lt;br /&gt;
::Same as above.&lt;br /&gt;
:AttackBackward&lt;br /&gt;
::Same as above.&lt;br /&gt;
:Overlay&lt;br /&gt;
::Not a standalone animation; it just overwrites part of an already-playing one, e.g. the weapon-holstering animation.&lt;br /&gt;
:DontInterpolateVelocity&lt;br /&gt;
::Unknown, but maybe it has something to do with {x,y,z} velocities and the fact that directional jumps, for example, take information about their direction vector from the {x,z} velocity part of the TRAM (the vertical Y component is in the ONCC).&lt;br /&gt;
:ThrowSource&lt;br /&gt;
::Unknown, but throws use it.&lt;br /&gt;
::: Probably a developer relic. Throws work in animation pairs: whenever a throw source is played, the other character must perform the throw target animation. See throw(n) types:&lt;br /&gt;
:::: TRAM &amp;lt;TargetType&amp;gt;&lt;br /&gt;
:::: [[XML:StNA#Animation_types|StNA]] (First &amp;lt;u&amp;gt;used&amp;lt;/u&amp;gt; throw starts at #96.)&lt;br /&gt;
::: Characters have only their own pool of animations available. And since enemy&#039;s TRAC might not contain the necessary animation the information must be provided by the throw source TRAC. &lt;br /&gt;
::: Since every throw animation must have a throw animation type the ThrowSource flag is actually redundant.&lt;br /&gt;
:ThrowTarget&lt;br /&gt;
::Animation can hurt anybody with its attack part, including teammates. The player can even hurt himself with the TRAM&#039;s damage part (whereas a player cannot hurt himself with his own animation&#039;s attack part). It also allows two attack parts to be executed instead of only one (maybe a bug? more than two will result in a crash).&lt;br /&gt;
:::If you set the first attack part to be able to deal damage from the 1st to the 100th frame of the TRAM, and the second attack part to deal damage within that range (e.g. from the 25th to the 41st frame), then the first attack part will deal damage from the 1st to the 100th frame (as usual), but even if it hits, that second attack part can hurt the enemy as well during frames 25–41. Note that the second attack part must be executed within the first attack part&#039;s active &amp;quot;window&amp;quot;, otherwise it won&#039;t work.&lt;br /&gt;
:RealWorld&lt;br /&gt;
::It appears this flag was used to create a TRAM and an OBAN from one animation source. The OBAN is supposed to store pelvis rotations and positions, allowing a character to move over obstacles/gaps. The vast majority of them are used in cutscenes.&lt;br /&gt;
:DoAim&lt;br /&gt;
::Applies the aiming animation overlay (PIS/RIF) if the player has a weapon.&lt;br /&gt;
:DontAim&lt;br /&gt;
::An aiming overlay will not be applied.&lt;br /&gt;
:CanPickup&lt;br /&gt;
::Player can pick up an item during this animation if he intersects with one during his movement.&lt;br /&gt;
:Aim360&lt;br /&gt;
::Unknown.&lt;br /&gt;
:DisableShield&lt;br /&gt;
::If the player has an active supershield (chr_super &amp;quot;name&amp;quot; 1), this forces him to disable it (chr_super &amp;quot;name&amp;quot; 0)&lt;br /&gt;
:NoAIPickup&lt;br /&gt;
::AIs are not permitted to pick up items with this animation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Atomic&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Makes animation particle atomic?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Invulnerable&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Character will not take melee damage during a time frame defined by the Start and End frames.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| First frame of character being invulnerable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Last frame of character being invulnerable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Overlay&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;UsedBones&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|Simply contains &amp;quot;&amp;lt;UsedBones /&amp;gt;&amp;quot; if no bones are involved, otherwise:&lt;br /&gt;
:Pelvis&lt;br /&gt;
:LeftThigh&lt;br /&gt;
:LeftCalf&lt;br /&gt;
:LeftFoot&lt;br /&gt;
:RightThigh&lt;br /&gt;
:RightCalf&lt;br /&gt;
:RightFoot&lt;br /&gt;
:Mid&lt;br /&gt;
:Chest&lt;br /&gt;
:Neck&lt;br /&gt;
:Head&lt;br /&gt;
:LeftShoulder&lt;br /&gt;
:LeftArm&lt;br /&gt;
:LeftWrist&lt;br /&gt;
:LeftFist&lt;br /&gt;
:RightShoulder&lt;br /&gt;
:RightArm&lt;br /&gt;
:RightFist&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;ReplacedBones&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
| &amp;quot;&amp;lt;ReplacedBones /&amp;gt;&amp;quot; if unused, otherwise:&lt;br /&gt;
:Pelvis&lt;br /&gt;
:LeftThigh&lt;br /&gt;
:LeftCalf&lt;br /&gt;
:LeftFoot&lt;br /&gt;
:RightThigh&lt;br /&gt;
:RightCalf&lt;br /&gt;
:RightFoot&lt;br /&gt;
:Mid&lt;br /&gt;
:Chest&lt;br /&gt;
:Neck&lt;br /&gt;
:Head&lt;br /&gt;
:LeftShoulder&lt;br /&gt;
:LeftArm&lt;br /&gt;
:LeftWrist&lt;br /&gt;
:LeftFist&lt;br /&gt;
:RightShoulder&lt;br /&gt;
:RightArm&lt;br /&gt;
:RightFist&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;DirectAnimations&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Link&amp;gt;&lt;br /&gt;
| link&lt;br /&gt;
| First slot. &amp;quot;&amp;lt;Link /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Link&amp;gt;&lt;br /&gt;
| link&lt;br /&gt;
| Second slot. &amp;quot;&amp;lt;Link /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Pause&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Hard&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| In ticks. The Hard and Soft pause values are ignored if this animation has a direct link (above) to another animation.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Soft&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int16&lt;br /&gt;
| In ticks. As mentioned above, the player cannot enter new inputs during this pause unless this animation is part of a combo animation defined by &amp;lt;DirectAnimations&amp;gt;&amp;lt;Link&amp;gt;.&lt;br /&gt;
: Examples:&lt;br /&gt;
: COMcomb_p, (no pause) COMcomb_p_p&lt;br /&gt;
: COMcomb_p, (pause) COMcomb_k&lt;br /&gt;
&lt;br /&gt;
The difference between the hard and soft pause is that you can block during the soft pause and not the hard pause.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Interpolation&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;End&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int16&lt;br /&gt;
|&lt;br /&gt;
* interpolates first X frames of next animation&lt;br /&gt;
* if the first follow-up animation is too short, it can continue to play even further (not observed with vanilla anims)&lt;br /&gt;
&lt;br /&gt;
While interpolations with rotations are less noticeable, interpolations of different positions can cause an additional drift.&lt;br /&gt;
&lt;br /&gt;
This was especially observed for transitions of idle to movements and vice versa — basically any combination of animations with different accelerations at the start and end. By default, animations without a specified Shortcut interpolation get about 8 frames of interpolation. For moves starting or ending in idle, it&#039;s better not to use interpolation. Just give the start and end frames the same positions and rotation values as the idle. Interpolations should always be considered a &#039;&#039;last resort&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:TRAM interpolations - end interpolation bigger than next anim.jpg|thumb|400px|left|&amp;quot;End&amp;quot; interpolation covering multiple follow-up animations.]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Max&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| unused&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;FinalRotation&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| float&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| Ending rotation in degrees. (During an animation, the camera is detached rotation-wise. If this value matches the body&#039;s final rotation, it will prevent a &amp;quot;glitchy&amp;quot; re-attaching.)&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Direction&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
| Used by [[AI#Melee_combat_behaviors|AI melee system]].&lt;br /&gt;
:None&lt;br /&gt;
:Forward&lt;br /&gt;
:Backward&lt;br /&gt;
:Left&lt;br /&gt;
:Right&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Vocalization&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| ID of one of the [[XML:SNDD#Step_1:_Preparing_the_TRAM|SoundConstants in ONCC]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ActionFrame&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Frame number for any special events associated with this animation: weapon theft via disarm, weapon holstering, Mukade teleporting, items getting handed over to player, etc.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Impact&amp;gt;&lt;br /&gt;
| link&lt;br /&gt;
| &amp;quot;&amp;lt;Impact /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Particles&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
| serves as group element&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Particle&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
| holds individual particle data&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Start&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int&lt;br /&gt;
| frame number for particle to start&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;End&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int&lt;br /&gt;
| frame number for particle to end (if the number exceeds frame count of animation, the particle will simply die at the end of the animation)&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Bone&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: Pelvis &lt;br /&gt;
: LeftThigh &lt;br /&gt;
: LeftCalf &lt;br /&gt;
: LeftFoot &lt;br /&gt;
: RightThigh &lt;br /&gt;
: RightCalf &lt;br /&gt;
: RightFoot &lt;br /&gt;
: Mid &lt;br /&gt;
: Chest &lt;br /&gt;
: Neck &lt;br /&gt;
: Head &lt;br /&gt;
: LeftShoulder &lt;br /&gt;
: LeftArm &lt;br /&gt;
: LeftWrist &lt;br /&gt;
: LeftFist &lt;br /&gt;
: RightShoulder &lt;br /&gt;
: RightArm &lt;br /&gt;
: RightFist&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Name&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| link&lt;br /&gt;
| particle name in [[XML:ONCC#ONCP:_Oni_Character_Particle_.28Array.29|ONCC-ONCP]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| sequence element&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Bones&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: Pelvis &lt;br /&gt;
: LeftThigh &lt;br /&gt;
: LeftCalf &lt;br /&gt;
: LeftFoot &lt;br /&gt;
: RightThigh &lt;br /&gt;
: RightCalf &lt;br /&gt;
: RightFoot &lt;br /&gt;
: Mid &lt;br /&gt;
: Chest &lt;br /&gt;
: Neck &lt;br /&gt;
: Head &lt;br /&gt;
: LeftShoulder &lt;br /&gt;
: LeftArm &lt;br /&gt;
: LeftWrist &lt;br /&gt;
: LeftFist &lt;br /&gt;
: RightShoulder &lt;br /&gt;
: RightArm &lt;br /&gt;
: RightFist&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Start frame of motion blur sequence&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| End frame of motion blur sequence&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Lifetime&amp;gt;&lt;br /&gt;
| int8&lt;br /&gt;
| Lifetime of each &amp;quot;ghost&amp;quot; in frames. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Alpha&amp;gt;&lt;br /&gt;
| int8&lt;br /&gt;
| Transparency of &amp;quot;ghosts&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Interval&amp;gt;&lt;br /&gt;
| int8&lt;br /&gt;
| Frame interval between each rendered &amp;quot;ghost&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Footsteps&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Footstep&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Type&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: Left&lt;br /&gt;
: Right&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Sounds&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &amp;quot;&amp;lt;Sounds /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Sound&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Name&amp;gt;&lt;br /&gt;
| char[32]&lt;br /&gt;
| &amp;lt;font color=&amp;quot;#777777&amp;quot;&amp;gt;OSBD&amp;lt;/font&amp;gt;file&amp;lt;font color=&amp;quot;#777777&amp;quot;&amp;gt;.imp.oni&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#777777&amp;quot;&amp;gt;(don&#039;t use resource type&#039;s prefix or suffix)&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|The frame when the sound starts to play.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Heights&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Height&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
|Absolute position.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Velocities&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Velocity&amp;gt;&lt;br /&gt;
| 2 x float&lt;br /&gt;
|Relative positions (delta values); the numbers represent the change in position from one frame to another.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Rotations&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Bone&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|There are 19 bone tags, one for each [[TRIA#Bones|body part]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;EKey&amp;gt;&lt;br /&gt;
| int8 + 3 * float&lt;br /&gt;
|For normal animations. The first value is the number of frames for which the rotation is maintained; the sum of all of these first EKey components always equals the total number of frames for the animation.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;QKey&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int8 + 4 * float&lt;br /&gt;
|For overlay animations used by [[TRAS|TRAS]] aiming screens.&lt;br /&gt;
&lt;br /&gt;
OniSplit v0.9.54.0 produces &amp;lt;QKey&amp;gt;s (quaternions) instead of &amp;lt;EKey&amp;gt;s (Euler rotations) for normal animations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;PositionOffset&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &amp;lt;PositionOffset&amp;gt; and &amp;lt;Positions&amp;gt; belong together. In the [[OBD:TRAM/raw0x30|binaries]], they are written in place. &#039;&#039;&#039;Seems unused; changing them has no effect in-game.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;X&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Z&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Positions&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Position&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| seems to be unused (and when checking this with &amp;quot;chr_debug_sphere = 1&amp;quot;, the spheres remain unchanged)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Height&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| vertical extent&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;YOffset&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| Y offset of the vertical extent from character location &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ThrowSource&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &amp;quot;&amp;lt;ThrowSource /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;TargetAdjustment&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Used to position targets during throws, relative to the position of the character executing the throw.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Position&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| 3 * float&lt;br /&gt;
| Contains XYZ values, which position the target character:&lt;br /&gt;
*X - Side axis. Negative values move the target to the right and positive values move the target to the left.&lt;br /&gt;
*Y - Height axis. Negative values move the target downwards, but cannot make the target go below the floor. Positive values make the target go upwards — if the value is too big, the target will teleport upward and then immediately start falling, interrupting the target animation.&lt;br /&gt;
*Z - Forward axis. Negative values move the target backwards and positive values move the target forward.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Angle&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| In radians - adjusts the rotation of the target in Oni&#039;s Y axis; most of the time (if not always) it&#039;s set to &#039;&#039;3.14159274&#039;&#039; radians in vanilla anims, equaling 180 degrees - which effectively rotates the rotates by those 180 degrees; if it was set to 0, the target would face the throw source character with his back.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Distance&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| Activation distance. The throw can be triggered if it is within this range. However the value must be greater than the equivalent TRAM in the parent TRAC.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;TargetType&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
| The flags are part of the [[XML:StNA#Animation_types|animation type list]].&lt;br /&gt;
&lt;br /&gt;
(static throws)&lt;br /&gt;
: Thrown1 = ###COMthrow_fw_p_tgt&lt;br /&gt;
: Thrown2 = ###COMthrow_fw_k_tgt&lt;br /&gt;
: Thrown3 = ###COMthrow_bk_p_tgt&lt;br /&gt;
: Thrown4 = ###COMthrow_bk_k_tgt&lt;br /&gt;
(running throws)&lt;br /&gt;
: Thrown5 = ###COMrun_throw_fw_p_tgt&lt;br /&gt;
: Thrown6 = ###COMrun_throw_fw_p_tgt&lt;br /&gt;
: Thrown7 = ###COMrun_throw_bk_k_tgt&lt;br /&gt;
: Thrown8 = ###COMrun_throw_bk_k_tgt (not tested)&lt;br /&gt;
(tackle throw = catching)&lt;br /&gt;
: Thrown9 = ###COMrun_tkl_fw_p_tgt (not tested)&lt;br /&gt;
: Thrown10 = ###COMrun_tkl_bk_p_tgt&lt;br /&gt;
(pistol disarms)&lt;br /&gt;
: Thrown11 = ###PISthrow_fw_p_tgt&lt;br /&gt;
: Thrown12 = ###PISthrow_fw_k_tgt&lt;br /&gt;
: Thrown13 = ###PISthrow_bk_p_tgt&lt;br /&gt;
(rifle disarm)&lt;br /&gt;
: Thrown14 = ###PISthrow_bk_k_tgt (not tested)&lt;br /&gt;
: Thrown15 = ###RIFthrow_fw_p_tgt&lt;br /&gt;
: Thrown16 = ###RIFthrow_bk_p_tgt&lt;br /&gt;
: Thrown17 = ###RIF? = (not tested)&lt;br /&gt;
----&lt;br /&gt;
About the naming:&lt;br /&gt;
: &amp;quot;fw&amp;quot; = face-to-face throw&lt;br /&gt;
: &amp;quot;bk&amp;quot; = thrower is facing victim&#039;s back&lt;br /&gt;
: &amp;quot;throw&amp;quot; inside TRAM names is sometimes shortened to &amp;quot;thr&amp;quot;&lt;br /&gt;
: &amp;quot;p&amp;quot;/&amp;quot;k&amp;quot; = triggered by punch or kick button (&amp;quot;p&amp;quot; is sometimes omitted)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;SelfDamage&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&amp;quot;&amp;lt;SelfDamage /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
&lt;br /&gt;
Works only with specific, hardcoded AnimTypes (mainly ThrownX, it&#039;s unknown if any other types work - that remains to be investigated). Using SelfDamage on an AnimType that wasn&#039;t intended for it will cause the game to crash. (ToDo: Checked if &amp;lt;Flag&amp;gt;ThrowTarget is enough to explain this. Modify a simple kick? For more please link to and use talk page.)&lt;br /&gt;
&lt;br /&gt;
From a practical standpoint, this means SelfDamage can be used only on ThrowTarget animations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Damage&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| sequence element&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Points&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Damage taken by character.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Frame of the animation when damage is dealt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Attacks&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Attack&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
| Only 2 attack parts per file are allowed. Normally the target gets only one hit. But if the attack frame ranges of both attack parts are overlapping, then the target can be [http://oni.bungie.org/forum/viewtopic.php?pid=39787#p39787 hit by both of them].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| First frame where damage can be inflicted on an opponent.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Last frame where damage can be inflicted on an opponent.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Bones&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| The bones which can inflict damage.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Flags&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|These are flags on an attack part, inside an &amp;lt;Attacks&amp;gt;&amp;lt;Attack&amp;gt; element. See the previous &amp;lt;Flags&amp;gt; for general flags on the TRAM.&lt;br /&gt;
: Unblockable&lt;br /&gt;
: Low - Target of attack needs to crouch in order to block this attack.&lt;br /&gt;
: High - Blocker needs to stand; if both Low and High are set, blocker can block from both standing and crouching positions.&lt;br /&gt;
: HalfDamage - Blocker receives half of the normal damage.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Knockback&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| Target gets knocked back by this amount.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;HitPoints&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Damage points inflicted by attack.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;HitType&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Animation type for opponent&#039;s animation when the attack isn&#039;t blocked. The flags are part of the [[XML:StNA#Animation_types|animation type list]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;HitLength&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Number of frames that the target should remain in his hit animation state when he gets hit.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;StunLength&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Number of frames that the target should remain in his blocking animation state when he blocks the attack.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;StaggerLength&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Number of frames that the target should perform his stagger animation after a successful block.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Extents&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Explained below. Automatically calculated by OniSplit if there&#039;s a DAE file referenced in the XML.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Extent&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| One tag per attack frame. Number of &amp;lt;Extent&amp;gt; tags = &amp;lt;Attack&amp;gt;&amp;lt;End&amp;gt; - &amp;lt;Attack&amp;gt;&amp;lt;Start&amp;gt; + 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Angle&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| In degrees.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Length&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MinY&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MaxY&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;AttackRing&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|  parent tag&lt;br /&gt;
| Always contains 36 &amp;lt;Length&amp;gt; tags, explained below. Automatically calculated by OniSplit if there&#039;s a DAE file referenced in the XML. (AttackRing was formerly known as &amp;quot;horizontal extents&amp;quot; in older versions of OniSplit.)&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Length&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| float&lt;br /&gt;
| Horizontal extents, explained below. They create a &amp;quot;danger zone&amp;quot; around the attacker which the AI uses to try to dodge an attack.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Export==&lt;br /&gt;
TRAM files can be extracted &#039;&#039;&#039;A) as pure XML&#039;&#039;&#039; files or &#039;&#039;&#039;B) as a pair of XML and DAE&#039;&#039;&#039; files. For editing the actual animation, you will want to use method B. While exporting an ONCC, you might see errors such as:&lt;br /&gt;
&lt;br /&gt;
 Cannot find instance &#039;TRAMKONCOMthrow_rev&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONCOMthrow_rev&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONRIFturn_right&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONOKOlev18_ZomStand&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONOKOcorner_hide&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONPIScorner_hide&#039;&lt;br /&gt;
&lt;br /&gt;
Ignore them, as those files doesn&#039;t exist. (Someday we should remove them from the TRACs.)&lt;br /&gt;
&lt;br /&gt;
===Via command line===&lt;br /&gt;
To export a single TRAM:&lt;br /&gt;
 onisplit -extract:xml output_path -anim-body:path_to\TRBS_or_ONCCname.oni path_to\TRAMname.oni&lt;br /&gt;
&lt;br /&gt;
To export merged TRAMs:&lt;br /&gt;
 onisplit -extract:xml output_path &#039;&#039;&#039;-anim-merge&#039;&#039;&#039; -anim-body:path_to\TRBS_or_ONCCname.oni path_to\TRAMname1.oni  path_to\TRAMnameN.oni&lt;br /&gt;
&lt;br /&gt;
===Via Vago===&lt;br /&gt;
[[Image:Vago_xml_plus_dae_extraction.png|thumb|200px|right|Combined extraction of DAE and XML.]]&lt;br /&gt;
&lt;br /&gt;
Change to Characters tab and follow these steps.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 1:&#039;&#039;&#039; Select &amp;quot;TRAM ONI&amp;quot; as input format (&amp;quot;From&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 2:&#039;&#039;&#039; Select &amp;quot;XML / XML &amp;amp; DAE&amp;quot; as output format (&amp;quot;To&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 3:&#039;&#039;&#039; Tick checkbox &amp;quot;Extract with TRBS / ONCC&amp;quot;. It&#039;s important this is done before adding a TRAM file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 4:&#039;&#039;&#039; Set full path of ONCC or TRBS.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 5:&#039;&#039;&#039; Add TRAM file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 6:&#039;&#039;&#039; Click &amp;quot;Convert&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Via Simple OniSplit GUI===&lt;br /&gt;
There was a long-standing problem with combined ONCC/TRAM files where the textures would be missing.&amp;lt;!--[Iritscen: I don&#039;t understand this sentence; is it important to keep this historical note?] With an older method you couldn&#039;t export non-native TRAM which meant to the TRAM had to be registered in the TRAC the ONCC is using.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.paradox.oni2.net/programs/Simple_OniSplit_GUI.zip Simple OniSplit GUI]&#039;&#039;&#039; post-edits the DAE to fix missing textures. The character-related .oni files must be all in one folder. Usually the level0_Final folder does the trick.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 1:&#039;&#039;&#039; Drag and drop the TRAM and ONCC into the [http://www.paradox.oni2.net/images/simpleOniSplitGui.png big field.] (One by one or simultaneously; the order doesn&#039;t matter.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 2:&#039;&#039;&#039; Hit &amp;quot;Convert&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Editing 3D data==&lt;br /&gt;
===Blender===&lt;br /&gt;
See the [[Blender]] article for a general tutorial on using the free program to create animations for Oni. It also contains a Blender addon for automating certain tasks, troubleshooting advice, and links to an animation rig that makes animation much easier.&lt;br /&gt;
&lt;br /&gt;
===XSI===&lt;br /&gt;
In the past, the community&#039;s preferred tool for any 3D modeling and animation was {{ModTool}}. However, this free program was discontinued in 2014, and modders did not want to be tied to an aging (not to mention Windows-only) program. Thus, we have generally moved to using Blender (see next section). The following information is preserved for historical purposes.&lt;br /&gt;
----&lt;br /&gt;
For the correct Mod Tool settings, see [[Mod Tool#Animating|HERE]].&lt;br /&gt;
&lt;br /&gt;
Here are some hints for creating animations when there is no rigging available:&lt;br /&gt;
* Use the ONCC model in your 3D editor that will actually make use of the animations. This makes sure that the pelvis height will match and that the character&#039;s feet will not float in the air or go through the ground. &lt;br /&gt;
* The first frame and last frames should match the probable previous and follow-up animations. This will reduce the necessity for long interpolations.&lt;br /&gt;
* When setting keyframes, each body part should have moved. This rule of thumb will give a more natural-looking animation.&lt;br /&gt;
* The first body part to be animated is always the pelvis.&lt;br /&gt;
* Watch out for pelvis rotations so that the XYZ rotations don&#039;t overlap too much, otherwise you will get into a [[wp:Gimbal_lock|gimbal lock]].&lt;br /&gt;
&lt;br /&gt;
Also see our [http://oni.bungie.org/forum/viewtopic.php?id=1433 OCF thread].&lt;br /&gt;
&lt;br /&gt;
==Import==&lt;br /&gt;
 onisplit -create output_path path_to\TRAMname.xml&lt;br /&gt;
&lt;br /&gt;
==Common operations on animations by the community==&lt;br /&gt;
===Speeding up existing animations===&lt;br /&gt;
s10k has created an XmlTools script that allows the speed-up of any existing TRAM by removing frames. More information and download link [http://mods.oni2.net/node/354 here.]&lt;br /&gt;
&lt;br /&gt;
==Selected notes on animation types==&lt;br /&gt;
===Attacks===&lt;br /&gt;
====Extents and XML====&lt;br /&gt;
&#039;&#039;&#039;As a regular modder you don&#039;t need to know how the attack ring and the extents get calculated.&#039;&#039;&#039; If you just want to create an attack animation then add an appropriate &amp;lt;Attacks&amp;gt; code block to your XML as seen in the [[#Using OniSplit to calculate extents|section below]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;How attack ring (horizontal extents) and extents get calculated&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Ever wondered how the AI can recognize incoming attacks and block or dodge them? Extents (found by geyser and fully uncovered by Neo) are the key. Imagine the character looked at from above, and visualize a circle with this character being at the center of the circle. Now divide this circle into 10° segments, and those are the 36 units of horizontal extents (that is, the lateral reach of the attack). The 0° point is directly in front of the character and 180° is behind the character. The segments run clockwise around the character. So the first Extent tag is the horizontal reach on the 0° line, the second tag is for the line 10° clockwise, and so on. Note that a frontal attack like a simple kick could hit a target not only if he&#039;s standing at 0° (directly in front), but also at 10° or 20° to the right, and also at 340° and 350° (a bit to the left). When setting these manually, you should guess the inner and outer ranges of the reach of the attacker&#039;s bones that have damage attached to them. Test these values with an AI that blocks often. If you did it right, your attack will often be blocked, but if the extent length is too high, the AIs will react when too far from you, which does not look good.&lt;br /&gt;
&lt;br /&gt;
There are two types of extents:&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;Extents&amp;gt;&#039;&#039;&#039; stores this info:&lt;br /&gt;
::&amp;lt;Angle&amp;gt; at which this extent radiates from the character.&lt;br /&gt;
::&amp;lt;Length&amp;gt; of this extent.&lt;br /&gt;
::&amp;lt;MinY&amp;gt; minimum height of this extent.&lt;br /&gt;
::&amp;lt;MaxY&amp;gt; maximum height of this extent.&lt;br /&gt;
:Length, MinY and MaxY serve to create an invisible area in space which is &amp;quot;dangerous to be in&amp;quot;. If an AI intersects with this area and notices it (refer to the Notice field in [[MELE]]), it will attempt to block or dodge according to its modifiers in its MELE profile.&lt;br /&gt;
::The number of &amp;lt;Extent&amp;gt;s is equal to the number of attack frames: &amp;lt;End&amp;gt; minus &amp;lt;Start&amp;gt; plus one (because the start frame counts too). For example, for TRAMKONCOMkick_low1: &amp;lt;End&amp;gt;30&amp;lt;/End&amp;gt; minus &amp;lt;Start&amp;gt;22&amp;lt;/Start&amp;gt; plus 1 = 9 &amp;lt;Extent&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;AttackRing&amp;gt; (formerly known as &amp;lt;HorizontalExtents&amp;gt;&#039;&#039;&#039; stores this info:&lt;br /&gt;
::36 fields (exactly 36, otherwise it won&#039;t compile back into a .oni file), which correspond to areas in 10° intervals around the character as described above.&lt;br /&gt;
&lt;br /&gt;
====Using OniSplit to calculate extents====&lt;br /&gt;
Let&#039;s say that you want to convert a non-attack animation to a damage-dealing animation. Non-attack TRAMs do not have extents information used to notify the AIs about incoming attacks, so how do you generate this information from the animation?&lt;br /&gt;
:1. Export the animation to XML with a body attached. If you extract using just &amp;quot;-extract:xml dest_folder TRAMsomething.oni&amp;quot;, you&#039;ll get the 3D animation data inside the XML (namely, the tags Heights, Velocities, Rotations, PositionOffset, and Positions; for an attack animation, you&#039;ll also get Attacks and AttackRing, and inside Attacks&#039; elements, each Attack element will have Extents at the end of it).&lt;br /&gt;
:However, if you extract this same animation using &amp;quot;-extract:xml dest_folder TRAMsomething.oni &#039;&#039;&#039;-anim-body ONCCtramuser.oni&#039;&#039;&#039;&amp;quot;, the animation data will be placed in a DAE file along with the character model geometry. Be sure to pick a body with a size that&#039;s representative of the character classes that will actually use this TRAM, because the extents will be calculated from it. The XML file will be very short without the 3D data in it — this is how we want the non-attack TRAM to look. We do not know the extents information that should go in Extents or AttackRing, so we just want to add the part that distinguishes a DAE-extracted attack TRAM XML from a DAE-extracted non-attack TRAM XML. That part is the Attacks section, without the Extents under each Attack.&lt;br /&gt;
:2. First, consider whether the TRAM should have something added to its Flags section, like Attack or ThrowTarget.&lt;br /&gt;
:3. Now add to the XML of the non-attack TRAM data in the following format (after the &amp;lt;SelfDamage /&amp;gt; section, typically):&lt;br /&gt;
        &amp;lt;Attacks&amp;gt;&lt;br /&gt;
            &amp;lt;Attack&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;1&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;10&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;RightWrist RightFist&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Flags /&amp;gt;&lt;br /&gt;
                &amp;lt;Knockback&amp;gt;4&amp;lt;/Knockback&amp;gt;&lt;br /&gt;
                &amp;lt;HitPoints&amp;gt;10&amp;lt;/HitPoints&amp;gt;&lt;br /&gt;
                &amp;lt;HitType&amp;gt;KnockdownHead&amp;lt;/HitType&amp;gt;&lt;br /&gt;
                &amp;lt;HitLength&amp;gt;5&amp;lt;/HitLength&amp;gt;&lt;br /&gt;
                &amp;lt;StunLength&amp;gt;8&amp;lt;/StunLength&amp;gt;&lt;br /&gt;
                &amp;lt;StaggerLength&amp;gt;0&amp;lt;/StaggerLength&amp;gt;&lt;br /&gt;
            &amp;lt;/Attack&amp;gt;&lt;br /&gt;
        &amp;lt;/Attacks&amp;gt;&lt;br /&gt;
:Do not add an AttackRing section after Attacks.&lt;br /&gt;
:4. Import this with &amp;quot;-create dest_folder TRAMsomething.xml&amp;quot;. The Extents sections and the AttackRing will be calculated by OniSplit from the attached DAE.&lt;br /&gt;
:5. If you need this information for a patch mod, run &amp;quot;-extract:xml&amp;quot; on the TRAMsomething.oni you&#039;ve created &amp;lt;u&amp;gt;without&amp;lt;/u&amp;gt; using &amp;quot;-anim-body&amp;quot;. Now you can copy the Extents and AttackRing data to your XML patch. For an example of how the patch should look, see the [http://mods.oni2.net/node/311 Domino Knockdowns] mod.&lt;br /&gt;
&lt;br /&gt;
===Combos===&lt;br /&gt;
The type and order of player input for triggering a given animation type (such as PPK) is hardcoded, and new animation types cannot be created. That being said, Oni has unused combo animation types, such as PKP, PKK, KPK, KPP, etc. that work perfectly fine and can be used to create new combos. To assign an animation type to a specific combo attack, you set a corresponding value in &amp;lt;Lookup&amp;gt;&amp;lt;Type&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Setting a value in the &amp;lt;Link&amp;gt; of &#039;&#039;&#039;&amp;lt;DirectAnimations&amp;gt;&#039;&#039;&#039; will do two things:&lt;br /&gt;
# It will increase the time window for player input, meaning the next animation can be executed more easily. (In vanilla Oni, the Crescent Moon Kick has no link in KONCOMcomb_k_k_kfw and therefore is difficult to use.)&lt;br /&gt;
# It disables &amp;lt;Interpolation&amp;gt;&amp;lt;End&amp;gt; for the next combo anim.&lt;br /&gt;
# It enables &amp;lt;Pause&amp;gt;&amp;lt;Soft&amp;gt; and &amp;lt;Pause&amp;gt;&amp;lt;Hard&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Just Frame input===&lt;br /&gt;
Implemented by Delano762, inspired by the game series Tekken, a Just Frame (&amp;quot;JF&amp;quot;) move means that you have to press certain keys (W+K or W+P) at the exact same time, which is more difficult than it might sound. Delano&#039;s mod [http://mods.oni2.net/node/353 54000 New Combat Moves for Konoko] has a collection of animations which utilize existing animation states differently to create new moves.&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
* new forward kick = TRAMKONCOMkick_fw_JF &amp;lt;FromState&amp;gt;Standing&lt;br /&gt;
** key strokes: w + k&lt;br /&gt;
* old forward kick = TRAMKONCOMkick_fw &amp;lt;FromState&amp;gt;RunStart&lt;br /&gt;
** key strokes: w, k&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
* new forward punch = TRAMKONCOMpunch_fw_JF &amp;lt;FromState&amp;gt;Standing&lt;br /&gt;
** key strokes: w + p&lt;br /&gt;
* old forward punch = TRAMKONCOMpunch_fw &amp;lt;FromState&amp;gt;RunStart&lt;br /&gt;
** key strokes: w, p&lt;br /&gt;
&lt;br /&gt;
Note that these animations are referred to as JF moves, not JF combos. The Crescent Moon Kick, as mentioned above, is an unintentional JF combo found in vanilla Oni.&lt;br /&gt;
&lt;br /&gt;
===Throws===&lt;br /&gt;
: Todo: Add here throw pair table from talk page when it is complete.&lt;br /&gt;
&lt;br /&gt;
Throw target animations are registered in the TRAC of the throw initiator (AKA the throw source). Target animations are forced onto the other character, removing the need to have that animation in the target&#039;s TRAC. Throw target (TRAM*tgt) animations can only cover up to 256 frames (0-255).&lt;br /&gt;
&lt;br /&gt;
====Forward throws====&lt;br /&gt;
Scenario: You load two characters into Mod Tool and rotate (+/-180°) the throw target character because you need them to stand face to face as you work on an animation. When you are done animating, the target animation would need to be reversed again. This means multiplying the velocities by -1; the rotation also needs correcting. So it looks like you need *(-1) for the x rotation and -/+180° (depending on your initial change) for the Y rotation.&lt;br /&gt;
&lt;br /&gt;
=====BlenderOni Throw Adjust=====&lt;br /&gt;
There is a Blender script implemented within the BlenderOni addon for rotating and adding PositionOffset to a forward throw Target animation. It is capable of adjusting both forward and back throws. The script&#039;s old version can be accessed [[Blender/Obsolete_scripts#Script_for_adjusting_forward_throw_targets|HERE.]]&lt;br /&gt;
&lt;br /&gt;
====Excel macro====&lt;br /&gt;
[[Image:Animation_macro_v4.png|right|thumb]]&lt;br /&gt;
The Excel macro can be used to create any TRAM except overlays. [https://www.youtube.com/watch?v=vDTPYfvMf4M Demo vid here].&lt;br /&gt;
&lt;br /&gt;
The macro should be rewritten as a .NET framework or application because Excel is not freeware. However, the tool was made with XSI in mind (for getting animation pair-based information). As XSI is mostly considered obsolete by the community, research for doing the same with Blender will be needed.&lt;br /&gt;
&lt;br /&gt;
There was some development of a .NET-based &#039;&#039;&#039;[[TRAM setup assistant]]&#039;&#039;&#039; in 2016, but the work drifted into inactivity since the community showed no sign of demand for an updated tool.&lt;br /&gt;
&lt;br /&gt;
As of now there is a Blender script for creating throw target adjustment data. So instead of writing a new stand-alone app, at least the creation of header data might be better ported to the Blender script.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Macro usage:&#039;&#039;&#039;&lt;br /&gt;
* Put your files into the &amp;quot;input_and_output&amp;quot; folder.&lt;br /&gt;
* Disable macro security if you don&#039;t want to have to click on the &amp;quot;Enable Content&amp;quot; button every time.&lt;br /&gt;
* Close other worksheets before you run the macro.&lt;br /&gt;
* If you are not afraid of VBA code, you can enter the dev environment by hitting Alt+F11. If you want to extend the attack library with more screenshots and settings, search for &amp;quot;LibraryThrows&amp;quot;, &amp;quot;LibraryAttack&amp;quot;, &amp;quot;Picture&amp;quot;, and &amp;quot;CBAttackHelp.AddItem&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Run animations===&lt;br /&gt;
Here&#039;s a breakdown of the Striker&#039;s run animations, meant as an illustration for what would be needed to make new run TRAMs.&lt;br /&gt;
&lt;br /&gt;
Run cancel:&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
* STRIKErun1stepa&lt;br /&gt;
* STRIKErun1stepb&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
&lt;br /&gt;
Run – &#039;&#039;a minimal cycle&#039;&#039;:&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
* STRIKErun1stepa&lt;br /&gt;
* STRIKErunstart&lt;br /&gt;
* STRIKErun_rt&lt;br /&gt;
* STRIKErun_lt (optional)&lt;br /&gt;
* STRIKErunstop&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
&lt;br /&gt;
Follow the images below from right to left.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:XML_TRAM_STRIKErunstop.png|STRIKErunstop&lt;br /&gt;
Image:XML_TRAM_STRIKErun_lt.png|STRIKErun_lt&lt;br /&gt;
Image:XML_TRAM_STRIKErun_rt.png|STRIKErun_rt&lt;br /&gt;
Image:XML_TRAM_STRIKErunstart.png|STRIKErunstart&lt;br /&gt;
Image:XML_TRAM_STRIKErun1stepa.png|STRIKErun1stepa&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of unused animations==&lt;br /&gt;
Here are all the known unused animations. These could be recycled in a new mod.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;From the original game&#039;&#039;&#039;&lt;br /&gt;
* KONOKOconsole_punch: What the name says (the engine can use that animation depending on the console&#039;s configuration, see [[OBD:BINA/OBJC/CONS|CONS]]) .&lt;br /&gt;
* KONOKOlev3_intro: Looks like she&#039;s placing something (bomb?) and then running away.&lt;br /&gt;
* KONOKOlev4_undress: From an aborted clothes-changing cutscene.&lt;br /&gt;
* KONOKOlev16_bomb: Planting a bomb.&lt;br /&gt;
* KONCOMsuper_kick: Now used in [[OTA]] as a spawn event, and by the fan-made character [[Shinatama Evolved]].&lt;br /&gt;
* KONCOMsuper_punch: KONCOMpunch_heavy but without the shouted attack name, has HalfDamage flag, and does 10 less damage in its first attack part.&lt;br /&gt;
* COMPISidle_special1: Comguy checking environment and his gun; meant for a feature that would visually depict an elevation in the AI&#039;s level of alertness after, say, hearing a noise.&lt;br /&gt;
* STRPISidle_special1: Striker checking his his gun and communicating with an ally (another unused alertness-elevation animation).&lt;br /&gt;
* THUGlev1_direct: Thug probably directing a truck driver.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;From modders&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Image:female_stun.jpg|right|thumb|Char A and Char B performing stun animations.]]&lt;br /&gt;
&lt;br /&gt;
* http://mods.oni2.net/node/376&lt;br /&gt;
** StrikerKneeStepKickThrow.zip&lt;br /&gt;
** REDCOMjump_fw_crouch--double_flip--dae.zip&lt;br /&gt;
** KONprone_getup--dae.zip&lt;br /&gt;
** KONRIF_k_bk_throw.zip&lt;br /&gt;
** female_stun--dae.zip&lt;br /&gt;
&lt;br /&gt;
==Special effects==&lt;br /&gt;
If the scene is overloaded by too many particles (including motion blur), these effects will cease being rendered. So don&#039;t overuse effects.&lt;br /&gt;
&lt;br /&gt;
===Color trails===&lt;br /&gt;
Open the XML-accompanied TRAM, search for the &amp;quot;Particles&amp;quot; tag, and insert your markup.&lt;br /&gt;
&lt;br /&gt;
First example: TRAMSTRCOMcomb_p_p.xml&lt;br /&gt;
&lt;br /&gt;
[[Image:Colorful_contrail_added.png|right|thumb]]&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Particles&amp;gt;&lt;br /&gt;
            &amp;lt;Particle&amp;gt;&lt;br /&gt;
                &amp;lt;StartFrame&amp;gt;0&amp;lt;/StartFrame&amp;gt;&lt;br /&gt;
                &amp;lt;EndFrame&amp;gt;12&amp;lt;/EndFrame&amp;gt;&lt;br /&gt;
                &amp;lt;Bone&amp;gt;LeftFist&amp;lt;/Bone&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;contrail&amp;lt;/Name&amp;gt;&lt;br /&gt;
            &amp;lt;/Particle&amp;gt;&lt;br /&gt;
        &amp;lt;/Particles&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;contrail&amp;quot; is looked up by the character class (ONCC) that emits the actual particle; here it is &amp;quot;h2h_strtrail_e01&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This second example is about creating two different contrails in a TRAM at the same time. The animation is &amp;quot;TRAMSTRCOMpunch_heavy.xml&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Different_contrails_in_attack.png|right|thumb]]&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Particles&amp;gt;&lt;br /&gt;
            &amp;lt;Particle&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;0&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;54&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Bone&amp;gt;RightWrist&amp;lt;/Bone&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;contrail&amp;lt;/Name&amp;gt;&lt;br /&gt;
            &amp;lt;/Particle&amp;gt;&lt;br /&gt;
            &amp;lt;Particle&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;0&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;54&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Bone&amp;gt;LeftWrist&amp;lt;/Bone&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;&#039;&#039;&#039;contrail_2&#039;&#039;&#039;&amp;lt;/Name&amp;gt;&lt;br /&gt;
            &amp;lt;/Particle&amp;gt;&lt;br /&gt;
        &amp;lt;/Particles&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that you need to register the second contrail in the ONCC as well. Using your own contrail particle is also possible; just insert its name between the &amp;lt;Type&amp;gt; tags.&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;ONCPParticle&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;contrail&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Type&amp;gt;h2h_strtrail_e01&amp;lt;/Type&amp;gt;&lt;br /&gt;
                &amp;lt;BodyPart&amp;gt;-1&amp;lt;/BodyPart&amp;gt;&lt;br /&gt;
            &amp;lt;/ONCPParticle&amp;gt;&lt;br /&gt;
            &amp;lt;ONCPParticle&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;&#039;&#039;&#039;contrail_2&#039;&#039;&#039;&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Type&amp;gt;&#039;&#039;&#039;h2h_murtrail_e01&#039;&#039;&#039;&amp;lt;/Type&amp;gt;&lt;br /&gt;
                &amp;lt;BodyPart&amp;gt;-1&amp;lt;/BodyPart&amp;gt;&lt;br /&gt;
            &amp;lt;/ONCPParticle&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Motion blur===&lt;br /&gt;
[[Image:XML_TRAM_willow_kick_with_motion_blur.jpg|thumb|200px]]&lt;br /&gt;
Motion blur in Oni works much like ghosting/onion skinning features in any animation software: In the frame range specified by &amp;lt;Start&amp;gt; and &amp;lt;End&amp;gt; an additional instance of body parts specified in &amp;lt;Bones&amp;gt; are rendered for additional extra frames specified by &amp;lt;Lifetime&amp;gt;, with transparency set by &amp;lt;Alpha&amp;gt;, and every &amp;lt;Interval&amp;gt; frames within the frame range.&lt;br /&gt;
Example snippet from KONCOMcomb_p_p_k:&lt;br /&gt;
        &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
            &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;RightThigh RightCalf RightFoot&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;20&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;28&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Lifetime&amp;gt;4&amp;lt;/Lifetime&amp;gt;&lt;br /&gt;
                &amp;lt;Alpha&amp;gt;127&amp;lt;/Alpha&amp;gt;&lt;br /&gt;
                &amp;lt;Interval&amp;gt;1&amp;lt;/Interval&amp;gt;&lt;br /&gt;
            &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
        &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The one noteworthy thing is that you can have multiple motion blur sequences. If you wanted to add an extra motion blur to the above animation, you could do something like this:&lt;br /&gt;
        &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
            &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;LeftThigh LeftCalf LeftFoot&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;10&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;18&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Lifetime&amp;gt;4&amp;lt;/Lifetime&amp;gt;&lt;br /&gt;
                &amp;lt;Alpha&amp;gt;127&amp;lt;/Alpha&amp;gt;&lt;br /&gt;
                &amp;lt;Interval&amp;gt;1&amp;lt;/Interval&amp;gt;&lt;br /&gt;
            &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
            &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;RightThigh RightCalf RightFoot&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;20&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;28&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Lifetime&amp;gt;4&amp;lt;/Lifetime&amp;gt;&lt;br /&gt;
                &amp;lt;Alpha&amp;gt;127&amp;lt;/Alpha&amp;gt;&lt;br /&gt;
                &amp;lt;Interval&amp;gt;1&amp;lt;/Interval&amp;gt;&lt;br /&gt;
            &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
        &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Impact effect===&lt;br /&gt;
[[Image:XML_TRAM_KONCOMkick_fw_with_ninflash1.jpg|thumb|200px]]&lt;br /&gt;
&lt;br /&gt;
See also [[XML:ONCC]].&lt;br /&gt;
&lt;br /&gt;
{{XML}}&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=XML:TRAM&amp;diff=41213</id>
		<title>XML:TRAM</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=XML:TRAM&amp;diff=41213"/>
		<updated>2023-10-08T13:33:45Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Blender */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{XML_File_Header | prev=TRAC | type=TRAM | next=TRAS | name=Totoro Animation}}&lt;br /&gt;
{{update}}&lt;br /&gt;
{{TOCfloat|side=right}}&lt;br /&gt;
==General information==&lt;br /&gt;
TRAM files — animation data for characters — are basically made of three chunks:&lt;br /&gt;
* Metadata or &amp;quot;header&amp;quot;: animation type, state, flags, particle, sounds, etc.&lt;br /&gt;
* Animation data: &#039;&#039;&#039;pelvis heights, pelvis velocities (root motion)&#039;&#039;&#039;, bone rotations&lt;br /&gt;
* Attack data: damage, self-damage, extents (danger zones for AI awareness) and throws&lt;br /&gt;
&lt;br /&gt;
Root motion: a character moves by changing the position of its root bone (pelvis). The animated legs just create the &#039;&#039;&#039;illusion for the player&#039;&#039;&#039; that they are responsible for the motion.&lt;br /&gt;
&lt;br /&gt;
Bones: Each character has &#039;&#039;&#039;19 separate body parts&#039;&#039;&#039; which get animated (rotated) relative to each other. Compared to modern games Oni&#039;s bone system is [[wp:Deprecation|deprecated]]. The body doesn&#039;t get deformed by following animated bones. Oni modders often use the terms mesh and bone interchangeably. Only the pelvis has &#039;&#039;&#039;translation&#039;&#039;&#039; data (heights and velocities) besides rotations. The hierarchy of the body parts (or bones) is determined by [[XML:TRBS#Standard_TRIA_hierarchy|TRIA]].&lt;br /&gt;
&lt;br /&gt;
The term &#039;&#039;&#039;animation&#039;&#039;&#039; is often shortened to &#039;&#039;&#039;anim&#039;&#039;&#039; by modders, following the naming of commands in BSL: chr_wait_animstate, chr_wait_animtype, env_anim, etc.&lt;br /&gt;
&lt;br /&gt;
TRAMs used in Oni follow a naming pattern. A list of all combat TRAMs in-game and their naming can be found [[Combat moves|here.]]&lt;br /&gt;
&lt;br /&gt;
==Decision path of animation lookup==&lt;br /&gt;
* First the game builds a pool of anims a character can use. They are loaded from the TRAC file registered in [[ONCC]], including parent TRACs.&lt;br /&gt;
* Anims from a child TRAC override those of the parent if their combination of state, type and variant is exactly the same.&lt;br /&gt;
* Child TRACs usually omit some anims. For example, Elite Strikers don&#039;t have their own run anims, so they use the parent anims of normal Strikers. See [[XML:TRAC|TRAC]] page for details.&lt;br /&gt;
* A character always possesses a single animation state. This term derives from state machines, but you only need to know that states are the first point in the decision path determining what anims are actually allowed to play at a given moment.&lt;br /&gt;
* Here is the full decision path:&lt;br /&gt;
** anim &#039;&#039;&#039;state&#039;&#039;&#039; check&lt;br /&gt;
** event (user input, or engine input for the AI) -&amp;gt; [[XML_talk:StNA|context check]] -&amp;gt; anim &#039;&#039;&#039;type&#039;&#039;&#039; check&lt;br /&gt;
** anim &#039;&#039;&#039;variant&#039;&#039;&#039; check&lt;br /&gt;
** TRAC &#039;&#039;&#039;weight&#039;&#039;&#039; check&lt;br /&gt;
&lt;br /&gt;
Detailed example: Let&#039;s say that we shapeshifted to a Ninja ONCC, we are in the state Standing, and we hit the action key to perform a taunt. The engine recognizes the context (a hostile character to interact with) and looks up anims of type Taunt. Since we are in combat mode, the next anim must be of variant Combat if possible. These lookups boil down to two valid possible anims: NINCOMtaunt1 and NINCOMtaunt2. If there are multiple anims available at this point, the engine picks one of them randomly.&lt;br /&gt;
&lt;br /&gt;
However, NINCOMtaunt1 has a TRAC Weight (probability) of 100 while NINCOMtaunt2 has a TRAC Weight value of just 5. So the chances are quite high that we will not see the Moon Walk taunt.&lt;br /&gt;
&lt;br /&gt;
Keep in mind that if the engine cannot find an anim of a specific variant, it will fall back to a non-variant anim instead.&lt;br /&gt;
&lt;br /&gt;
Confused by how Weights work? Apparently, the Weight value is only one part of the equation — otherwise NINCOMtaunt2 would never execute. If there is only one anim to choose from, it will always play no matter what its Weight, even if it is zero. When it comes to multiple anims being a valid choice, the calculation seems to be: weight / sum of all weights. For NINCOMtaunt2, this means 5 / 105 = 0.047 (4.7%).&lt;br /&gt;
&lt;br /&gt;
==List of tags, types, and flags==&lt;br /&gt;
Use the search function in your browser to quickly find a tag.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=100%&lt;br /&gt;
|width=120px| &#039;&#039;&#039;tag&#039;&#039;&#039;&lt;br /&gt;
|width=100px| &#039;&#039;&#039;type&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Lookup&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Type&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_types|HERE]]. The pool of valid TRAMs (animations a character can choose from) is built from the TRAC files registered in the ONCC. Most of the anim types are connected to player inputs.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;AimingType&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_types|HERE]]. The pool of valid TRAMs, and therefore TRASs (aiming screens a character can choose from) is built from the TRSC files registered in the ONCC.&lt;br /&gt;
:&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;FromState&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
| [[Image:chr_debug_characters_shows_interpolated_animations.jpg|thumb|400px|right|Primary &amp;lt;FromState&amp;gt; in &amp;lt;Lookup&amp;gt; uses about 8 interpolating frames by default. Use Shortcut&#039;s &amp;lt;FromState&amp;gt; to override this frame number.]]&lt;br /&gt;
&lt;br /&gt;
Look them up over [[XML:StNA#Animation_states|HERE]].&lt;br /&gt;
: When FromState is set to None, some default behaviors are ignored and are replaced by Shortcuts.&lt;br /&gt;
: Shortcuts extend the number of states from which an animation can be played and under what conditions (replacing this atomic yes/no).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ToState&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_states|HERE]].&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Varient&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|(misspelled because Oni misspells it) If unused, the tag will simply be &amp;quot;&amp;lt;Varient /&amp;gt;&amp;quot;, such as for non-combat animations. Otherwise it contains one of these values:&lt;br /&gt;
: Combat&lt;br /&gt;
: LeftPistol&lt;br /&gt;
: LeftRifle&lt;br /&gt;
: Panic&lt;br /&gt;
: RightPistol&lt;br /&gt;
: RightRifle&lt;br /&gt;
: Sprint&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;FirstLevel&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|Number of first level in which move becomes available to the player (&amp;quot;0&amp;quot; to make it available from the start).&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Shortcuts&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
|&lt;br /&gt;
Works as an &#039;&#039;&#039;alternative FromState&#039;&#039;&#039; collection.&lt;br /&gt;
&lt;br /&gt;
Shortcuts are accepted if their &amp;lt;Shortcut&amp;gt;&amp;lt;FromState&amp;gt; value differs from the &amp;quot;primary&amp;quot; &amp;lt;Lookup&amp;gt;&amp;lt;FromState&amp;gt; value. In other words, if you want to make a &#039;&#039;&#039;Shortcut&#039;&#039;&#039; that uses the &#039;&#039;&#039;same FromState&#039;&#039;&#039; value then you have to set &#039;&#039;&#039;primary FromState&#039;&#039;&#039; value to &#039;&#039;&#039;None&#039;&#039;&#039;. By doing that, the hardcoded interpolation frame length of about 8 frames can be overridden.&lt;br /&gt;
&lt;br /&gt;
In the following example, the new interpolation length is 0. This will require the animation to match perfectly with the previous one. For a smooth transition to the next animation, set a suitable value at &amp;lt;Interpolation&amp;gt;&amp;lt;End&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Lookup&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
            &amp;lt;FromState&amp;gt;None&amp;lt;/FromState&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
            &amp;lt;Shortcuts&amp;gt;&lt;br /&gt;
                &amp;lt;Shortcut&amp;gt;&lt;br /&gt;
                    &amp;lt;FromState&amp;gt;Standing&amp;lt;/FromState&amp;gt;&lt;br /&gt;
                    &amp;lt;Length&amp;gt;0&amp;lt;/Length&amp;gt;&lt;br /&gt;
                    &amp;lt;ReplaceAtomic&amp;gt;no&amp;lt;/ReplaceAtomic&amp;gt;&lt;br /&gt;
                &amp;lt;/Shortcut&amp;gt;&lt;br /&gt;
            &amp;lt;/Shortcuts&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:TRAM interpolation - standard case.jpg|thumb|400px|left|Scenario A: hardcoded interpolation of 8 frames. Scenario B: changeable interpolation frame number.]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Shortcut&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;FromState&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_types|HERE]].&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Length&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int16&lt;br /&gt;
|Amount of interpolating frames. While interpolations of rotation are less noticeable, interpolations of different positions can cause drift (i.e. sliding).&lt;br /&gt;
&lt;br /&gt;
This is especially observed for transitions from idle to movements and vice versa — basically any combination of animations with different accelerations at start and end. By default, animations without specified Shortcut interpolation give about 8 frames of interpolation. For moves starting or ending in idle, it&#039;s better not to use interpolation. Just give the start and end frames the same positions and rotation values as the idle. Interpolations should always be considered a &#039;&#039;last resort&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
This drift can be observed even in vanilla animations — most prominently in Konoko&#039;s comb_k. Konoko&#039;s left foot should be in a fixed position as the animation starts from from Konoko&#039;s idle pose. However, the interpolation is causing her left foot to drift noticeably to the right and a bit forward.&lt;br /&gt;
&lt;br /&gt;
The reason this happens is because the interpolation &amp;quot;mixes&amp;quot; two animations. When one animation transitions into another via interpolation, part of the animation system continues playing the initial animation, and part of it is playing the follow-up animation, with all the rotations and positions getting linearly interpolated.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;ReplaceAtomic&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: yes&lt;br /&gt;
: no&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Flags&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|These are top-level flags on the whole animation. See the other &amp;lt;Flags&amp;gt; for flags on an attack part.&lt;br /&gt;
:RuntimeLoaded&lt;br /&gt;
::(This bit is not stored on disk; it is used at runtime to mark that the animation was loaded.)&lt;br /&gt;
:Invulnerable&lt;br /&gt;
::While playing this animation, the player is invulnerable to melee damage and also cannot be thrown. Damage from particles and fall damage still hurt.&lt;br /&gt;
:BlockHigh&lt;br /&gt;
::While playing this animation, the player is invulnerable to high or undefined attacks within some arc in front of him. If you set this flag on an animation where the player character is spinning, then the character can still be kicked in the back or thrown.&lt;br /&gt;
:BlockLow&lt;br /&gt;
::Same as above, only it can block low or undefined attacks.&lt;br /&gt;
:Attack&lt;br /&gt;
::Animations with an attack part have this turned on. It&#039;s unclear what it does, but it may enable the melee soft-lock (where the character turns a bit during the animation to face a nearby enemy).&lt;br /&gt;
:DropWeapon&lt;br /&gt;
::If the player is armed, he drops his weapon when this animation plays.&lt;br /&gt;
:InAir&lt;br /&gt;
::Something to do with jumps; not investigated.&lt;br /&gt;
:Atomic&lt;br /&gt;
::The whole animation must be played; player cannot interrupt it once it starts.&lt;br /&gt;
:NoTurn&lt;br /&gt;
:::Player cannot turn by mouse while performing this animation.&lt;br /&gt;
:AttackForward&lt;br /&gt;
::Unknown, but it looks like this is a hint for the AI about where an attack is aiming, from the player&#039;s point of view.&lt;br /&gt;
:AttackLeft&lt;br /&gt;
::Same as above.&lt;br /&gt;
:AttackRight&lt;br /&gt;
::Same as above.&lt;br /&gt;
:AttackBackward&lt;br /&gt;
::Same as above.&lt;br /&gt;
:Overlay&lt;br /&gt;
::Not a standalone animation; it just overwrites part of an already-playing one, e.g. the weapon-holstering animation.&lt;br /&gt;
:DontInterpolateVelocity&lt;br /&gt;
::Unknown, but maybe it has something to do with {x,y,z} velocities and the fact that directional jumps, for example, take information about their direction vector from the {x,z} velocity part of the TRAM (the vertical Y component is in the ONCC).&lt;br /&gt;
:ThrowSource&lt;br /&gt;
::Unknown, but throws use it.&lt;br /&gt;
::: Probably a developer relic. Throws work in animation pairs: whenever a throw source is played, the other character must perform the throw target animation. See throw(n) types:&lt;br /&gt;
:::: TRAM &amp;lt;TargetType&amp;gt;&lt;br /&gt;
:::: [[XML:StNA#Animation_types|StNA]] (First &amp;lt;u&amp;gt;used&amp;lt;/u&amp;gt; throw starts at #96.)&lt;br /&gt;
::: Characters have only their own pool of animations available. And since enemy&#039;s TRAC might not contain the necessary animation the information must be provided by the throw source TRAC. &lt;br /&gt;
::: Since every throw animation must have a throw animation type the ThrowSource flag is actually redundant.&lt;br /&gt;
:ThrowTarget&lt;br /&gt;
::Animation can hurt anybody with its attack part, including teammates. The player can even hurt himself with the TRAM&#039;s damage part (whereas a player cannot hurt himself with his own animation&#039;s attack part). It also allows two attack parts to be executed instead of only one (maybe a bug? more than two will result in a crash).&lt;br /&gt;
:::If you set the first attack part to be able to deal damage from the 1st to the 100th frame of the TRAM, and the second attack part to deal damage within that range (e.g. from the 25th to the 41st frame), then the first attack part will deal damage from the 1st to the 100th frame (as usual), but even if it hits, that second attack part can hurt the enemy as well during frames 25–41. Note that the second attack part must be executed within the first attack part&#039;s active &amp;quot;window&amp;quot;, otherwise it won&#039;t work.&lt;br /&gt;
:RealWorld&lt;br /&gt;
::It appears this flag was used to create a TRAM and an OBAN from one animation source. The OBAN is supposed to store pelvis rotations and positions, allowing a character to move over obstacles/gaps. The vast majority of them are used in cutscenes.&lt;br /&gt;
:DoAim&lt;br /&gt;
::Applies the aiming animation overlay (PIS/RIF) if the player has a weapon.&lt;br /&gt;
:DontAim&lt;br /&gt;
::An aiming overlay will not be applied.&lt;br /&gt;
:CanPickup&lt;br /&gt;
::Player can pick up an item during this animation if he intersects with one during his movement.&lt;br /&gt;
:Aim360&lt;br /&gt;
::Unknown.&lt;br /&gt;
:DisableShield&lt;br /&gt;
::If the player has an active supershield (chr_super &amp;quot;name&amp;quot; 1), this forces him to disable it (chr_super &amp;quot;name&amp;quot; 0)&lt;br /&gt;
:NoAIPickup&lt;br /&gt;
::AIs are not permitted to pick up items with this animation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Atomic&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Makes animation particle atomic?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Invulnerable&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Character will not take melee damage during a time frame defined by the Start and End frames.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| First frame of character being invulnerable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Last frame of character being invulnerable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Overlay&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;UsedBones&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|Simply contains &amp;quot;&amp;lt;UsedBones /&amp;gt;&amp;quot; if no bones are involved, otherwise:&lt;br /&gt;
:Pelvis&lt;br /&gt;
:LeftThigh&lt;br /&gt;
:LeftCalf&lt;br /&gt;
:LeftFoot&lt;br /&gt;
:RightThigh&lt;br /&gt;
:RightCalf&lt;br /&gt;
:RightFoot&lt;br /&gt;
:Mid&lt;br /&gt;
:Chest&lt;br /&gt;
:Neck&lt;br /&gt;
:Head&lt;br /&gt;
:LeftShoulder&lt;br /&gt;
:LeftArm&lt;br /&gt;
:LeftWrist&lt;br /&gt;
:LeftFist&lt;br /&gt;
:RightShoulder&lt;br /&gt;
:RightArm&lt;br /&gt;
:RightFist&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;ReplacedBones&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
| &amp;quot;&amp;lt;ReplacedBones /&amp;gt;&amp;quot; if unused, otherwise:&lt;br /&gt;
:Pelvis&lt;br /&gt;
:LeftThigh&lt;br /&gt;
:LeftCalf&lt;br /&gt;
:LeftFoot&lt;br /&gt;
:RightThigh&lt;br /&gt;
:RightCalf&lt;br /&gt;
:RightFoot&lt;br /&gt;
:Mid&lt;br /&gt;
:Chest&lt;br /&gt;
:Neck&lt;br /&gt;
:Head&lt;br /&gt;
:LeftShoulder&lt;br /&gt;
:LeftArm&lt;br /&gt;
:LeftWrist&lt;br /&gt;
:LeftFist&lt;br /&gt;
:RightShoulder&lt;br /&gt;
:RightArm&lt;br /&gt;
:RightFist&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;DirectAnimations&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Link&amp;gt;&lt;br /&gt;
| link&lt;br /&gt;
| First slot. &amp;quot;&amp;lt;Link /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Link&amp;gt;&lt;br /&gt;
| link&lt;br /&gt;
| Second slot. &amp;quot;&amp;lt;Link /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Pause&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Hard&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| In ticks. The Hard and Soft pause values are ignored if this animation has a direct link (above) to another animation.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Soft&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int16&lt;br /&gt;
| In ticks. As mentioned above, the player cannot enter new inputs during this pause unless this animation is part of a combo animation defined by &amp;lt;DirectAnimations&amp;gt;&amp;lt;Link&amp;gt;.&lt;br /&gt;
: Examples:&lt;br /&gt;
: COMcomb_p, (no pause) COMcomb_p_p&lt;br /&gt;
: COMcomb_p, (pause) COMcomb_k&lt;br /&gt;
&lt;br /&gt;
The difference between the hard and soft pause is that you can block during the soft pause and not the hard pause.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Interpolation&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;End&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int16&lt;br /&gt;
|&lt;br /&gt;
* interpolates first X frames of next animation&lt;br /&gt;
* if the first follow-up animation is too short, it can continue to play even further (not observed with vanilla anims)&lt;br /&gt;
&lt;br /&gt;
While interpolations with rotations are less noticeable, interpolations of different positions can cause an additional drift.&lt;br /&gt;
&lt;br /&gt;
This was especially observed for transitions of idle to movements and vice versa — basically any combination of animations with different accelerations at the start and end. By default, animations without a specified Shortcut interpolation get about 8 frames of interpolation. For moves starting or ending in idle, it&#039;s better not to use interpolation. Just give the start and end frames the same positions and rotation values as the idle. Interpolations should always be considered a &#039;&#039;last resort&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:TRAM interpolations - end interpolation bigger than next anim.jpg|thumb|400px|left|&amp;quot;End&amp;quot; interpolation covering multiple follow-up animations.]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Max&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| unused&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;FinalRotation&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| float&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| Ending rotation in degrees. (During an animation, the camera is detached rotation-wise. If this value matches the body&#039;s final rotation, it will prevent a &amp;quot;glitchy&amp;quot; re-attaching.)&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Direction&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
| Used by [[AI#Melee_combat_behaviors|AI melee system]].&lt;br /&gt;
:None&lt;br /&gt;
:Forward&lt;br /&gt;
:Backward&lt;br /&gt;
:Left&lt;br /&gt;
:Right&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Vocalization&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| ID of one of the [[XML:SNDD#Step_1:_Preparing_the_TRAM|SoundConstants in ONCC]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ActionFrame&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Frame number for any special events associated with this animation: weapon theft via disarm, weapon holstering, Mukade teleporting, items getting handed over to player, etc.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Impact&amp;gt;&lt;br /&gt;
| link&lt;br /&gt;
| &amp;quot;&amp;lt;Impact /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Particles&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
| serves as group element&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Particle&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
| holds individual particle data&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Start&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int&lt;br /&gt;
| frame number for particle to start&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;End&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int&lt;br /&gt;
| frame number for particle to end (if the number exceeds frame count of animation, the particle will simply die at the end of the animation)&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Bone&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: Pelvis &lt;br /&gt;
: LeftThigh &lt;br /&gt;
: LeftCalf &lt;br /&gt;
: LeftFoot &lt;br /&gt;
: RightThigh &lt;br /&gt;
: RightCalf &lt;br /&gt;
: RightFoot &lt;br /&gt;
: Mid &lt;br /&gt;
: Chest &lt;br /&gt;
: Neck &lt;br /&gt;
: Head &lt;br /&gt;
: LeftShoulder &lt;br /&gt;
: LeftArm &lt;br /&gt;
: LeftWrist &lt;br /&gt;
: LeftFist &lt;br /&gt;
: RightShoulder &lt;br /&gt;
: RightArm &lt;br /&gt;
: RightFist&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Name&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| link&lt;br /&gt;
| particle name in [[XML:ONCC#ONCP:_Oni_Character_Particle_.28Array.29|ONCC-ONCP]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| sequence element&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Bones&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: Pelvis &lt;br /&gt;
: LeftThigh &lt;br /&gt;
: LeftCalf &lt;br /&gt;
: LeftFoot &lt;br /&gt;
: RightThigh &lt;br /&gt;
: RightCalf &lt;br /&gt;
: RightFoot &lt;br /&gt;
: Mid &lt;br /&gt;
: Chest &lt;br /&gt;
: Neck &lt;br /&gt;
: Head &lt;br /&gt;
: LeftShoulder &lt;br /&gt;
: LeftArm &lt;br /&gt;
: LeftWrist &lt;br /&gt;
: LeftFist &lt;br /&gt;
: RightShoulder &lt;br /&gt;
: RightArm &lt;br /&gt;
: RightFist&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Start frame of motion blur sequence&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| End frame of motion blur sequence&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Lifetime&amp;gt;&lt;br /&gt;
| int8&lt;br /&gt;
| Lifetime of each &amp;quot;ghost&amp;quot; in frames. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Alpha&amp;gt;&lt;br /&gt;
| int8&lt;br /&gt;
| Transparency of &amp;quot;ghosts&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Interval&amp;gt;&lt;br /&gt;
| int8&lt;br /&gt;
| Frame interval between each rendered &amp;quot;ghost&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Footsteps&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Footstep&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Type&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: Left&lt;br /&gt;
: Right&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Sounds&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &amp;quot;&amp;lt;Sounds /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Sound&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Name&amp;gt;&lt;br /&gt;
| char[32]&lt;br /&gt;
| &amp;lt;font color=&amp;quot;#777777&amp;quot;&amp;gt;OSBD&amp;lt;/font&amp;gt;file&amp;lt;font color=&amp;quot;#777777&amp;quot;&amp;gt;.imp.oni&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#777777&amp;quot;&amp;gt;(don&#039;t use resource type&#039;s prefix or suffix)&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|The frame when the sound starts to play.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Heights&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Height&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
|Absolute position.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Velocities&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Velocity&amp;gt;&lt;br /&gt;
| 2 x float&lt;br /&gt;
|Relative positions (delta values); the numbers represent the change in position from one frame to another.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Rotations&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Bone&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|There are 19 bone tags, one for each [[TRIA#Bones|body part]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;EKey&amp;gt;&lt;br /&gt;
| int8 + 3 * float&lt;br /&gt;
|For normal animations. The first value is the number of frames for which the rotation is maintained; the sum of all of these first EKey components always equals the total number of frames for the animation.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;QKey&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int8 + 4 * float&lt;br /&gt;
|For overlay animations used by [[TRAS|TRAS]] aiming screens.&lt;br /&gt;
&lt;br /&gt;
OniSplit v0.9.54.0 produces &amp;lt;QKey&amp;gt;s (quaternions) instead of &amp;lt;EKey&amp;gt;s (Euler rotations) for normal animations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;PositionOffset&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &amp;lt;PositionOffset&amp;gt; and &amp;lt;Positions&amp;gt; belong together. In the [[OBD:TRAM/raw0x30|binaries]], they are written in place. &#039;&#039;&#039;Seems unused; changing them has no effect in-game.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;X&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Z&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Positions&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Position&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| seems to be unused (and when checking this with &amp;quot;chr_debug_sphere = 1&amp;quot;, the spheres remain unchanged)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Height&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| vertical extent&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;YOffset&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| Y offset of the vertical extent from character location &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ThrowSource&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &amp;quot;&amp;lt;ThrowSource /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;TargetAdjustment&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Used to position targets during throws, relative to the position of the character executing the throw.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Position&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| 3 * float&lt;br /&gt;
| Contains XYZ values, which position the target character:&lt;br /&gt;
*X - Side axis. Negative values move the target to the right and positive values move the target to the left.&lt;br /&gt;
*Y - Height axis. Negative values move the target downwards, but cannot make the target go below the floor. Positive values make the target go upwards — if the value is too big, the target will teleport upward and then immediately start falling, interrupting the target animation.&lt;br /&gt;
*Z - Forward axis. Negative values move the target backwards and positive values move the target forward.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Angle&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| In radians - adjusts the rotation of the target in Oni&#039;s Y axis; most of the time (if not always) it&#039;s set to &#039;&#039;3.14159274&#039;&#039; radians in vanilla anims, equaling 180 degrees - which effectively rotates the rotates by those 180 degrees; if it was set to 0, the target would face the throw source character with his back.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Distance&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| Activation distance. The throw can be triggered if it is within this range. However the value must be greater than the equivalent TRAM in the parent TRAC.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;TargetType&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
| The flags are part of the [[XML:StNA#Animation_types|animation type list]].&lt;br /&gt;
&lt;br /&gt;
(static throws)&lt;br /&gt;
: Thrown1 = ###COMthrow_fw_p_tgt&lt;br /&gt;
: Thrown2 = ###COMthrow_fw_k_tgt&lt;br /&gt;
: Thrown3 = ###COMthrow_bk_p_tgt&lt;br /&gt;
: Thrown4 = ###COMthrow_bk_k_tgt&lt;br /&gt;
(running throws)&lt;br /&gt;
: Thrown5 = ###COMrun_throw_fw_p_tgt&lt;br /&gt;
: Thrown6 = ###COMrun_throw_fw_p_tgt&lt;br /&gt;
: Thrown7 = ###COMrun_throw_bk_k_tgt&lt;br /&gt;
: Thrown8 = ###COMrun_throw_bk_k_tgt (not tested)&lt;br /&gt;
(tackle throw = catching)&lt;br /&gt;
: Thrown9 = ###COMrun_tkl_fw_p_tgt (not tested)&lt;br /&gt;
: Thrown10 = ###COMrun_tkl_bk_p_tgt&lt;br /&gt;
(pistol disarms)&lt;br /&gt;
: Thrown11 = ###PISthrow_fw_p_tgt&lt;br /&gt;
: Thrown12 = ###PISthrow_fw_k_tgt&lt;br /&gt;
: Thrown13 = ###PISthrow_bk_p_tgt&lt;br /&gt;
(rifle disarm)&lt;br /&gt;
: Thrown14 = ###PISthrow_bk_k_tgt (not tested)&lt;br /&gt;
: Thrown15 = ###RIFthrow_fw_p_tgt&lt;br /&gt;
: Thrown16 = ###RIFthrow_bk_p_tgt&lt;br /&gt;
: Thrown17 = ###RIF? = (not tested)&lt;br /&gt;
----&lt;br /&gt;
About the naming:&lt;br /&gt;
: &amp;quot;fw&amp;quot; = face-to-face throw&lt;br /&gt;
: &amp;quot;bk&amp;quot; = thrower is facing victim&#039;s back&lt;br /&gt;
: &amp;quot;throw&amp;quot; inside TRAM names is sometimes shortened to &amp;quot;thr&amp;quot;&lt;br /&gt;
: &amp;quot;p&amp;quot;/&amp;quot;k&amp;quot; = triggered by punch or kick button (&amp;quot;p&amp;quot; is sometimes omitted)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;SelfDamage&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&amp;quot;&amp;lt;SelfDamage /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
&lt;br /&gt;
Works only with specific, hardcoded AnimTypes (mainly ThrownX, it&#039;s unknown if any other types work - that remains to be investigated). Using SelfDamage on an AnimType that wasn&#039;t intended for it will cause the game to crash. (ToDo: Checked if &amp;lt;Flag&amp;gt;ThrowTarget is enough to explain this. Modify a simple kick? For more please link to and use talk page.)&lt;br /&gt;
&lt;br /&gt;
From a practical standpoint, this means SelfDamage can be used only on ThrowTarget animations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Damage&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| sequence element&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Points&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Damage taken by character.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Frame of the animation when damage is dealt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Attacks&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Attack&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
| Only 2 attack parts per file are allowed. Normally the target gets only one hit. But if the attack frame ranges of both attack parts are overlapping, then the target can be [http://oni.bungie.org/forum/viewtopic.php?pid=39787#p39787 hit by both of them].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| First frame where damage can be inflicted on an opponent.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Last frame where damage can be inflicted on an opponent.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Bones&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| The bones which can inflict damage.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Flags&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|These are flags on an attack part, inside an &amp;lt;Attacks&amp;gt;&amp;lt;Attack&amp;gt; element. See the previous &amp;lt;Flags&amp;gt; for general flags on the TRAM.&lt;br /&gt;
: Unblockable&lt;br /&gt;
: Low - Target of attack needs to crouch in order to block this attack.&lt;br /&gt;
: High - Blocker needs to stand; if both Low and High are set, blocker can block from both standing and crouching positions.&lt;br /&gt;
: HalfDamage - Blocker receives half of the normal damage.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Knockback&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| Target gets knocked back by this amount.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;HitPoints&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Damage points inflicted by attack.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;HitType&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Animation type for opponent&#039;s animation when the attack isn&#039;t blocked. The flags are part of the [[XML:StNA#Animation_types|animation type list]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;HitLength&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Number of frames that the target should remain in his hit animation state when he gets hit.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;StunLength&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Number of frames that the target should remain in his blocking animation state when he blocks the attack.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;StaggerLength&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Number of frames that the target should perform his stagger animation after a successful block.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Extents&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Explained below. Automatically calculated by OniSplit if there&#039;s a DAE file referenced in the XML.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Extent&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| One tag per attack frame. Number of &amp;lt;Extent&amp;gt; tags = &amp;lt;Attack&amp;gt;&amp;lt;End&amp;gt; - &amp;lt;Attack&amp;gt;&amp;lt;Start&amp;gt; + 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Angle&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| In degrees.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Length&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MinY&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MaxY&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;AttackRing&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|  parent tag&lt;br /&gt;
| Always contains 36 &amp;lt;Length&amp;gt; tags, explained below. Automatically calculated by OniSplit if there&#039;s a DAE file referenced in the XML. (AttackRing was formerly known as &amp;quot;horizontal extents&amp;quot; in older versions of OniSplit.)&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Length&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| float&lt;br /&gt;
| Horizontal extents, explained below. They create a &amp;quot;danger zone&amp;quot; around the attacker which the AI uses to try to dodge an attack.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Export==&lt;br /&gt;
TRAM files can be extracted &#039;&#039;&#039;A) as pure XML&#039;&#039;&#039; files or &#039;&#039;&#039;B) as a pair of XML and DAE&#039;&#039;&#039; files. For editing the actual animation, you will want to use method B. While exporting an ONCC, you might see errors such as:&lt;br /&gt;
&lt;br /&gt;
 Cannot find instance &#039;TRAMKONCOMthrow_rev&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONCOMthrow_rev&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONRIFturn_right&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONOKOlev18_ZomStand&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONOKOcorner_hide&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONPIScorner_hide&#039;&lt;br /&gt;
&lt;br /&gt;
Ignore them, as those files doesn&#039;t exist. (Someday we should remove them from the TRACs.)&lt;br /&gt;
&lt;br /&gt;
===Via command line===&lt;br /&gt;
To export a single TRAM:&lt;br /&gt;
 onisplit -extract:xml output_path -anim-body:path_to\TRBS_or_ONCCname.oni path_to\TRAMname.oni&lt;br /&gt;
&lt;br /&gt;
To export merged TRAMs:&lt;br /&gt;
 onisplit -extract:xml output_path &#039;&#039;&#039;-anim-merge&#039;&#039;&#039; -anim-body:path_to\TRBS_or_ONCCname.oni path_to\TRAMname1.oni  path_to\TRAMnameN.oni&lt;br /&gt;
&lt;br /&gt;
===Via Vago===&lt;br /&gt;
[[Image:Vago_xml_plus_dae_extraction.png|thumb|200px|right|Combined extraction of DAE and XML.]]&lt;br /&gt;
&lt;br /&gt;
Change to Characters tab and follow these steps.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 1:&#039;&#039;&#039; Select &amp;quot;TRAM ONI&amp;quot; as input format (&amp;quot;From&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 2:&#039;&#039;&#039; Select &amp;quot;XML / XML &amp;amp; DAE&amp;quot; as output format (&amp;quot;To&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 3:&#039;&#039;&#039; Tick checkbox &amp;quot;Extract with TRBS / ONCC&amp;quot;. It&#039;s important this is done before adding a TRAM file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 4:&#039;&#039;&#039; Set full path of ONCC or TRBS.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 5:&#039;&#039;&#039; Add TRAM file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 6:&#039;&#039;&#039; Click &amp;quot;Convert&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Via Simple OniSplit GUI===&lt;br /&gt;
There was a long-standing problem with combined ONCC/TRAM files where the textures would be missing.&amp;lt;!--[Iritscen: I don&#039;t understand this sentence; is it important to keep this historical note?] With an older method you couldn&#039;t export non-native TRAM which meant to the TRAM had to be registered in the TRAC the ONCC is using.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.paradox.oni2.net/programs/Simple_OniSplit_GUI.zip Simple OniSplit GUI]&#039;&#039;&#039; post-edits the DAE to fix missing textures. The character-related .oni files must be all in one folder. Usually the level0_Final folder does the trick.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 1:&#039;&#039;&#039; Drag and drop the TRAM and ONCC into the [http://www.paradox.oni2.net/images/simpleOniSplitGui.png big field.] (One by one or simultaneously; the order doesn&#039;t matter.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 2:&#039;&#039;&#039; Hit &amp;quot;Convert&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Editing 3D data==&lt;br /&gt;
===Blender===&lt;br /&gt;
See the [[Blender]] article for a general tutorial on using the free program to create animations for Oni. It also contains a Blender addon for automating certain tasks, troubleshooting advice, and links to an animation rig that makes animation much easier.&lt;br /&gt;
&lt;br /&gt;
===XSI===&lt;br /&gt;
In the past, the community&#039;s preferred tool for any 3D modeling and animation was {{ModTool}}. However, this free program was discontinued in 2014, and modders did not want to be tied to an aging (not to mention Windows-only) program. Thus, we have generally moved to using Blender (see next section). The following information is preserved for historical purposes.&lt;br /&gt;
----&lt;br /&gt;
For the correct Mod Tool settings, see [[Mod Tool#Animating|HERE]].&lt;br /&gt;
&lt;br /&gt;
Here are some hints for creating animations when there is no rigging available:&lt;br /&gt;
* Use the ONCC model in your 3D editor that will actually make use of the animations. This makes sure that the pelvis height will match and that the character&#039;s feet will not float in the air or go through the ground. &lt;br /&gt;
* The first frame and last frames should match the probable previous and follow-up animations. This will reduce the necessity for long interpolations.&lt;br /&gt;
* When setting keyframes, each body part should have moved. This rule of thumb will give a more natural-looking animation.&lt;br /&gt;
* The first body part to be animated is always the pelvis.&lt;br /&gt;
* Watch out for pelvis rotations so that the XYZ rotations don&#039;t overlap too much, otherwise you will get into a [[wp:Gimbal_lock|gimbal lock]].&lt;br /&gt;
&lt;br /&gt;
Also see our [http://oni.bungie.org/forum/viewtopic.php?id=1433 OCF thread].&lt;br /&gt;
&lt;br /&gt;
==Import==&lt;br /&gt;
 onisplit -create output_path path_to\TRAMname.xml&lt;br /&gt;
&lt;br /&gt;
==Common operations on animations by the community==&lt;br /&gt;
===Speeding up existing animations===&lt;br /&gt;
s10k has created an XmlTools script that allows the speed-up of any existing TRAM by removing frames. More information and download link [http://mods.oni2.net/node/354 here.]&lt;br /&gt;
&lt;br /&gt;
==Selected notes on animation types==&lt;br /&gt;
===Attacks===&lt;br /&gt;
====Extents and XML====&lt;br /&gt;
&#039;&#039;&#039;As a regular modder you don&#039;t need to know how the attack ring and the extents get calculated.&#039;&#039;&#039; If you just want to create an attack animation then add an appropriate &amp;lt;Attacks&amp;gt; code block to your XML as seen in the [[#Using OniSplit to calculate extents|section below]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;How attack ring (horizontal extents) and extents get calculated&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Ever wondered how the AI can recognize incoming attacks and block or dodge them? Extents (found by geyser and fully uncovered by Neo) are the key. Imagine the character looked at from above, and visualize a circle with this character being at the center of the circle. Now divide this circle into 10° segments, and those are the 36 units of horizontal extents (that is, the lateral reach of the attack). The 0° point is directly in front of the character and 180° is behind the character. The segments run clockwise around the character. So the first Extent tag is the horizontal reach on the 0° line, the second tag is for the line 10° clockwise, and so on. Note that a frontal attack like a simple kick could hit a target not only if he&#039;s standing at 0° (directly in front), but also at 10° or 20° to the right, and also at 340° and 350° (a bit to the left). When setting these manually, you should guess the inner and outer ranges of the reach of the attacker&#039;s bones that have damage attached to them. Test these values with an AI that blocks often. If you did it right, your attack will often be blocked, but if the extent length is too high, the AIs will react when too far from you, which does not look good.&lt;br /&gt;
&lt;br /&gt;
There are two types of extents:&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;Extents&amp;gt;&#039;&#039;&#039; stores this info:&lt;br /&gt;
::&amp;lt;Angle&amp;gt; at which this extent radiates from the character.&lt;br /&gt;
::&amp;lt;Length&amp;gt; of this extent.&lt;br /&gt;
::&amp;lt;MinY&amp;gt; minimum height of this extent.&lt;br /&gt;
::&amp;lt;MaxY&amp;gt; maximum height of this extent.&lt;br /&gt;
:Length, MinY and MaxY serve to create an invisible area in space which is &amp;quot;dangerous to be in&amp;quot;. If an AI intersects with this area and notices it (refer to the Notice field in [[MELE]]), it will attempt to block or dodge according to its modifiers in its MELE profile.&lt;br /&gt;
::The number of &amp;lt;Extent&amp;gt;s is equal to the number of attack frames: &amp;lt;End&amp;gt; minus &amp;lt;Start&amp;gt; plus one (because the start frame counts too). For example, for TRAMKONCOMkick_low1: &amp;lt;End&amp;gt;30&amp;lt;/End&amp;gt; minus &amp;lt;Start&amp;gt;22&amp;lt;/Start&amp;gt; plus 1 = 9 &amp;lt;Extent&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;AttackRing&amp;gt; (formerly known as &amp;lt;HorizontalExtents&amp;gt;&#039;&#039;&#039; stores this info:&lt;br /&gt;
::36 fields (exactly 36, otherwise it won&#039;t compile back into a .oni file), which correspond to areas in 10° intervals around the character as described above.&lt;br /&gt;
&lt;br /&gt;
====Using OniSplit to calculate extents====&lt;br /&gt;
Let&#039;s say that you want to convert a non-attack animation to a damage-dealing animation. Non-attack TRAMs do not have extents information used to notify the AIs about incoming attacks, so how do you generate this information from the animation?&lt;br /&gt;
:1. Export the animation to XML with a body attached. If you extract using just &amp;quot;-extract:xml dest_folder TRAMsomething.oni&amp;quot;, you&#039;ll get the 3D animation data inside the XML (namely, the tags Heights, Velocities, Rotations, PositionOffset, and Positions; for an attack animation, you&#039;ll also get Attacks and AttackRing, and inside Attacks&#039; elements, each Attack element will have Extents at the end of it).&lt;br /&gt;
:However, if you extract this same animation using &amp;quot;-extract:xml dest_folder TRAMsomething.oni &#039;&#039;&#039;-anim-body ONCCtramuser.oni&#039;&#039;&#039;&amp;quot;, the animation data will be placed in a DAE file along with the character model geometry. Be sure to pick a body with a size that&#039;s representative of the character classes that will actually use this TRAM, because the extents will be calculated from it. The XML file will be very short without the 3D data in it — this is how we want the non-attack TRAM to look. We do not know the extents information that should go in Extents or AttackRing, so we just want to add the part that distinguishes a DAE-extracted attack TRAM XML from a DAE-extracted non-attack TRAM XML. That part is the Attacks section, without the Extents under each Attack.&lt;br /&gt;
:2. First, consider whether the TRAM should have something added to its Flags section, like Attack or ThrowTarget.&lt;br /&gt;
:3. Now add to the XML of the non-attack TRAM data in the following format (after the &amp;lt;SelfDamage /&amp;gt; section, typically):&lt;br /&gt;
        &amp;lt;Attacks&amp;gt;&lt;br /&gt;
            &amp;lt;Attack&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;1&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;10&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;RightWrist RightFist&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Flags /&amp;gt;&lt;br /&gt;
                &amp;lt;Knockback&amp;gt;4&amp;lt;/Knockback&amp;gt;&lt;br /&gt;
                &amp;lt;HitPoints&amp;gt;10&amp;lt;/HitPoints&amp;gt;&lt;br /&gt;
                &amp;lt;HitType&amp;gt;KnockdownHead&amp;lt;/HitType&amp;gt;&lt;br /&gt;
                &amp;lt;HitLength&amp;gt;5&amp;lt;/HitLength&amp;gt;&lt;br /&gt;
                &amp;lt;StunLength&amp;gt;8&amp;lt;/StunLength&amp;gt;&lt;br /&gt;
                &amp;lt;StaggerLength&amp;gt;0&amp;lt;/StaggerLength&amp;gt;&lt;br /&gt;
            &amp;lt;/Attack&amp;gt;&lt;br /&gt;
        &amp;lt;/Attacks&amp;gt;&lt;br /&gt;
:Do not add an AttackRing section after Attacks.&lt;br /&gt;
:4. Import this with &amp;quot;-create dest_folder TRAMsomething.xml&amp;quot;. The Extents sections and the AttackRing will be calculated by OniSplit from the attached DAE.&lt;br /&gt;
:5. If you need this information for a patch mod, run &amp;quot;-extract:xml&amp;quot; on the TRAMsomething.oni you&#039;ve created &amp;lt;u&amp;gt;without&amp;lt;/u&amp;gt; using &amp;quot;-anim-body&amp;quot;. Now you can copy the Extents and AttackRing data to your XML patch. For an example of how the patch should look, see the [http://mods.oni2.net/node/311 Domino Knockdowns] mod.&lt;br /&gt;
&lt;br /&gt;
===Combos===&lt;br /&gt;
The type and order of player input for triggering a given animation type (such as PPK) is hardcoded, and new animation types cannot be created. To assign an animation type to a specific combo attack, you set a corresponding value in &amp;lt;Lookup&amp;gt;&amp;lt;Type&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Setting a value in the &amp;lt;Link&amp;gt; of &#039;&#039;&#039;&amp;lt;DirectAnimations&amp;gt;&#039;&#039;&#039; will do two things:&lt;br /&gt;
# It will increase the time window for player input, meaning the next animation can be executed more easily. (In vanilla Oni, the Crescent Moon Kick has no link in KONCOMcomb_k_k_kfw and therefore is difficult to use.)&lt;br /&gt;
# It disables &amp;lt;Interpolation&amp;gt;&amp;lt;End&amp;gt; for the next combo anim.&lt;br /&gt;
# It enables &amp;lt;Pause&amp;gt;&amp;lt;Soft&amp;gt; and &amp;lt;Pause&amp;gt;&amp;lt;Hard&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Just Frame input===&lt;br /&gt;
Implemented by Delano762, inspired by the game series Tekken, a Just Frame (&amp;quot;JF&amp;quot;) move means that you have to press certain keys (W+K or W+P) at the exact same time, which is more difficult than it might sound. Delano&#039;s mod [http://mods.oni2.net/node/353 54000 New Combat Moves for Konoko] has a collection of animations which utilize existing animation states differently to create new moves.&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
* new forward kick = TRAMKONCOMkick_fw_JF &amp;lt;FromState&amp;gt;Standing&lt;br /&gt;
** key strokes: w + k&lt;br /&gt;
* old forward kick = TRAMKONCOMkick_fw &amp;lt;FromState&amp;gt;RunStart&lt;br /&gt;
** key strokes: w, k&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
* new forward punch = TRAMKONCOMpunch_fw_JF &amp;lt;FromState&amp;gt;Standing&lt;br /&gt;
** key strokes: w + p&lt;br /&gt;
* old forward punch = TRAMKONCOMpunch_fw &amp;lt;FromState&amp;gt;RunStart&lt;br /&gt;
** key strokes: w, p&lt;br /&gt;
&lt;br /&gt;
Note that these animations are referred to as JF moves, not JF combos. The Crescent Moon Kick, as mentioned above, is an unintentional JF combo found in vanilla Oni.&lt;br /&gt;
&lt;br /&gt;
===Throws===&lt;br /&gt;
: Todo: Add here throw pair table from talk page when it is complete.&lt;br /&gt;
&lt;br /&gt;
Throw target animations are registered in the TRAC of the throw initiator (AKA the throw source). Target animations are forced onto the other character, removing the need to have that animation in the target&#039;s TRAC. Throw target (TRAM*tgt) animations can only cover up to 256 frames (0-255).&lt;br /&gt;
&lt;br /&gt;
====Forward throws====&lt;br /&gt;
Scenario: You load two characters into Mod Tool and rotate (+/-180°) the throw target character because you need them to stand face to face as you work on an animation. When you are done animating, the target animation would need to be reversed again. This means multiplying the velocities by -1; the rotation also needs correcting. So it looks like you need *(-1) for the x rotation and -/+180° (depending on your initial change) for the Y rotation.&lt;br /&gt;
&lt;br /&gt;
=====BlenderOni Throw Adjust=====&lt;br /&gt;
There is a Blender script implemented within the BlenderOni addon for rotating and adding PositionOffset to a forward throw Target animation. It is capable of adjusting both forward and back throws. The script&#039;s old version can be accessed [[Blender/Obsolete_scripts#Script_for_adjusting_forward_throw_targets|HERE.]]&lt;br /&gt;
&lt;br /&gt;
====Excel macro====&lt;br /&gt;
[[Image:Animation_macro_v4.png|right|thumb]]&lt;br /&gt;
The Excel macro can be used to create any TRAM except overlays. [https://www.youtube.com/watch?v=vDTPYfvMf4M Demo vid here].&lt;br /&gt;
&lt;br /&gt;
The macro should be rewritten as a .NET framework or application because Excel is not freeware. However, the tool was made with XSI in mind (for getting animation pair-based information). As XSI is mostly considered obsolete by the community, research for doing the same with Blender will be needed.&lt;br /&gt;
&lt;br /&gt;
There was some development of a .NET-based &#039;&#039;&#039;[[TRAM setup assistant]]&#039;&#039;&#039; in 2016, but the work drifted into inactivity since the community showed no sign of demand for an updated tool.&lt;br /&gt;
&lt;br /&gt;
As of now there is a Blender script for creating throw target adjustment data. So instead of writing a new stand-alone app, at least the creation of header data might be better ported to the Blender script.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Macro usage:&#039;&#039;&#039;&lt;br /&gt;
* Put your files into the &amp;quot;input_and_output&amp;quot; folder.&lt;br /&gt;
* Disable macro security if you don&#039;t want to have to click on the &amp;quot;Enable Content&amp;quot; button every time.&lt;br /&gt;
* Close other worksheets before you run the macro.&lt;br /&gt;
* If you are not afraid of VBA code, you can enter the dev environment by hitting Alt+F11. If you want to extend the attack library with more screenshots and settings, search for &amp;quot;LibraryThrows&amp;quot;, &amp;quot;LibraryAttack&amp;quot;, &amp;quot;Picture&amp;quot;, and &amp;quot;CBAttackHelp.AddItem&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Run animations===&lt;br /&gt;
Here&#039;s a breakdown of the Striker&#039;s run animations, meant as an illustration for what would be needed to make new run TRAMs.&lt;br /&gt;
&lt;br /&gt;
Run cancel:&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
* STRIKErun1stepa&lt;br /&gt;
* STRIKErun1stepb&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
&lt;br /&gt;
Run – &#039;&#039;a minimal cycle&#039;&#039;:&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
* STRIKErun1stepa&lt;br /&gt;
* STRIKErunstart&lt;br /&gt;
* STRIKErun_rt&lt;br /&gt;
* STRIKErun_lt (optional)&lt;br /&gt;
* STRIKErunstop&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
&lt;br /&gt;
Follow the images below from right to left.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:XML_TRAM_STRIKErunstop.png|STRIKErunstop&lt;br /&gt;
Image:XML_TRAM_STRIKErun_lt.png|STRIKErun_lt&lt;br /&gt;
Image:XML_TRAM_STRIKErun_rt.png|STRIKErun_rt&lt;br /&gt;
Image:XML_TRAM_STRIKErunstart.png|STRIKErunstart&lt;br /&gt;
Image:XML_TRAM_STRIKErun1stepa.png|STRIKErun1stepa&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of unused animations==&lt;br /&gt;
Here are all the known unused animations. These could be recycled in a new mod.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;From the original game&#039;&#039;&#039;&lt;br /&gt;
* KONOKOconsole_punch: What the name says (the engine can use that animation depending on the console&#039;s configuration, see [[OBD:BINA/OBJC/CONS|CONS]]) .&lt;br /&gt;
* KONOKOlev3_intro: Looks like she&#039;s placing something (bomb?) and then running away.&lt;br /&gt;
* KONOKOlev4_undress: From an aborted clothes-changing cutscene.&lt;br /&gt;
* KONOKOlev16_bomb: Planting a bomb.&lt;br /&gt;
* KONCOMsuper_kick: Now used in [[OTA]] as a spawn event, and by the fan-made character [[Shinatama Evolved]].&lt;br /&gt;
* KONCOMsuper_punch: KONCOMpunch_heavy but without the shouted attack name, has HalfDamage flag, and does 10 less damage in its first attack part.&lt;br /&gt;
* COMPISidle_special1: Comguy checking environment and his gun; meant for a feature that would visually depict an elevation in the AI&#039;s level of alertness after, say, hearing a noise.&lt;br /&gt;
* STRPISidle_special1: Striker checking his his gun and communicating with an ally (another unused alertness-elevation animation).&lt;br /&gt;
* THUGlev1_direct: Thug probably directing a truck driver.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;From modders&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Image:female_stun.jpg|right|thumb|Char A and Char B performing stun animations.]]&lt;br /&gt;
&lt;br /&gt;
* http://mods.oni2.net/node/376&lt;br /&gt;
** StrikerKneeStepKickThrow.zip&lt;br /&gt;
** REDCOMjump_fw_crouch--double_flip--dae.zip&lt;br /&gt;
** KONprone_getup--dae.zip&lt;br /&gt;
** KONRIF_k_bk_throw.zip&lt;br /&gt;
** female_stun--dae.zip&lt;br /&gt;
&lt;br /&gt;
==Special effects==&lt;br /&gt;
If the scene is overloaded by too many particles (including motion blur), these effects will cease being rendered. So don&#039;t overuse effects.&lt;br /&gt;
&lt;br /&gt;
===Color trails===&lt;br /&gt;
Open the XML-accompanied TRAM, search for the &amp;quot;Particles&amp;quot; tag, and insert your markup.&lt;br /&gt;
&lt;br /&gt;
First example: TRAMSTRCOMcomb_p_p.xml&lt;br /&gt;
&lt;br /&gt;
[[Image:Colorful_contrail_added.png|right|thumb]]&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Particles&amp;gt;&lt;br /&gt;
            &amp;lt;Particle&amp;gt;&lt;br /&gt;
                &amp;lt;StartFrame&amp;gt;0&amp;lt;/StartFrame&amp;gt;&lt;br /&gt;
                &amp;lt;EndFrame&amp;gt;12&amp;lt;/EndFrame&amp;gt;&lt;br /&gt;
                &amp;lt;Bone&amp;gt;LeftFist&amp;lt;/Bone&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;contrail&amp;lt;/Name&amp;gt;&lt;br /&gt;
            &amp;lt;/Particle&amp;gt;&lt;br /&gt;
        &amp;lt;/Particles&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;contrail&amp;quot; is looked up by the character class (ONCC) that emits the actual particle; here it is &amp;quot;h2h_strtrail_e01&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This second example is about creating two different contrails in a TRAM at the same time. The animation is &amp;quot;TRAMSTRCOMpunch_heavy.xml&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Different_contrails_in_attack.png|right|thumb]]&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Particles&amp;gt;&lt;br /&gt;
            &amp;lt;Particle&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;0&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;54&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Bone&amp;gt;RightWrist&amp;lt;/Bone&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;contrail&amp;lt;/Name&amp;gt;&lt;br /&gt;
            &amp;lt;/Particle&amp;gt;&lt;br /&gt;
            &amp;lt;Particle&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;0&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;54&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Bone&amp;gt;LeftWrist&amp;lt;/Bone&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;&#039;&#039;&#039;contrail_2&#039;&#039;&#039;&amp;lt;/Name&amp;gt;&lt;br /&gt;
            &amp;lt;/Particle&amp;gt;&lt;br /&gt;
        &amp;lt;/Particles&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that you need to register the second contrail in the ONCC as well. Using your own contrail particle is also possible; just insert its name between the &amp;lt;Type&amp;gt; tags.&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;ONCPParticle&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;contrail&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Type&amp;gt;h2h_strtrail_e01&amp;lt;/Type&amp;gt;&lt;br /&gt;
                &amp;lt;BodyPart&amp;gt;-1&amp;lt;/BodyPart&amp;gt;&lt;br /&gt;
            &amp;lt;/ONCPParticle&amp;gt;&lt;br /&gt;
            &amp;lt;ONCPParticle&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;&#039;&#039;&#039;contrail_2&#039;&#039;&#039;&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Type&amp;gt;&#039;&#039;&#039;h2h_murtrail_e01&#039;&#039;&#039;&amp;lt;/Type&amp;gt;&lt;br /&gt;
                &amp;lt;BodyPart&amp;gt;-1&amp;lt;/BodyPart&amp;gt;&lt;br /&gt;
            &amp;lt;/ONCPParticle&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Motion blur===&lt;br /&gt;
[[Image:XML_TRAM_willow_kick_with_motion_blur.jpg|thumb|200px]]&lt;br /&gt;
Motion blur in Oni works much like ghosting/onion skinning features in any animation software: In the frame range specified by &amp;lt;Start&amp;gt; and &amp;lt;End&amp;gt; an additional instance of body parts specified in &amp;lt;Bones&amp;gt; are rendered for additional extra frames specified by &amp;lt;Lifetime&amp;gt;, with transparency set by &amp;lt;Alpha&amp;gt;, and every &amp;lt;Interval&amp;gt; frames within the frame range.&lt;br /&gt;
Example snippet from KONCOMcomb_p_p_k:&lt;br /&gt;
        &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
            &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;RightThigh RightCalf RightFoot&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;20&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;28&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Lifetime&amp;gt;4&amp;lt;/Lifetime&amp;gt;&lt;br /&gt;
                &amp;lt;Alpha&amp;gt;127&amp;lt;/Alpha&amp;gt;&lt;br /&gt;
                &amp;lt;Interval&amp;gt;1&amp;lt;/Interval&amp;gt;&lt;br /&gt;
            &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
        &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The one noteworthy thing is that you can have multiple motion blur sequences. If you wanted to add an extra motion blur to the above animation, you could do something like this:&lt;br /&gt;
        &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
            &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;LeftThigh LeftCalf LeftFoot&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;10&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;18&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Lifetime&amp;gt;4&amp;lt;/Lifetime&amp;gt;&lt;br /&gt;
                &amp;lt;Alpha&amp;gt;127&amp;lt;/Alpha&amp;gt;&lt;br /&gt;
                &amp;lt;Interval&amp;gt;1&amp;lt;/Interval&amp;gt;&lt;br /&gt;
            &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
            &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;RightThigh RightCalf RightFoot&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;20&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;28&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Lifetime&amp;gt;4&amp;lt;/Lifetime&amp;gt;&lt;br /&gt;
                &amp;lt;Alpha&amp;gt;127&amp;lt;/Alpha&amp;gt;&lt;br /&gt;
                &amp;lt;Interval&amp;gt;1&amp;lt;/Interval&amp;gt;&lt;br /&gt;
            &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
        &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Impact effect===&lt;br /&gt;
[[Image:XML_TRAM_KONCOMkick_fw_with_ninflash1.jpg|thumb|200px]]&lt;br /&gt;
&lt;br /&gt;
See also [[XML:ONCC]].&lt;br /&gt;
&lt;br /&gt;
{{XML}}&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=XML:TRAM&amp;diff=41212</id>
		<title>XML:TRAM</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=XML:TRAM&amp;diff=41212"/>
		<updated>2023-10-08T13:13:55Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Motion blur */ Explained how motion blur works and added info on how you can have multiple sequences, which is about the only thing you can make any tutorial on, in this otherwise self-explanatory part&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{XML_File_Header | prev=TRAC | type=TRAM | next=TRAS | name=Totoro Animation}}&lt;br /&gt;
{{update}}&lt;br /&gt;
{{TOCfloat|side=right}}&lt;br /&gt;
==General information==&lt;br /&gt;
TRAM files — animation data for characters — are basically made of three chunks:&lt;br /&gt;
* Metadata or &amp;quot;header&amp;quot;: animation type, state, flags, particle, sounds, etc.&lt;br /&gt;
* Animation data: &#039;&#039;&#039;pelvis heights, pelvis velocities (root motion)&#039;&#039;&#039;, bone rotations&lt;br /&gt;
* Attack data: damage, self-damage, extents (danger zones for AI awareness) and throws&lt;br /&gt;
&lt;br /&gt;
Root motion: a character moves by changing the position of its root bone (pelvis). The animated legs just create the &#039;&#039;&#039;illusion for the player&#039;&#039;&#039; that they are responsible for the motion.&lt;br /&gt;
&lt;br /&gt;
Bones: Each character has &#039;&#039;&#039;19 separate body parts&#039;&#039;&#039; which get animated (rotated) relative to each other. Compared to modern games Oni&#039;s bone system is [[wp:Deprecation|deprecated]]. The body doesn&#039;t get deformed by following animated bones. Oni modders often use the terms mesh and bone interchangeably. Only the pelvis has &#039;&#039;&#039;translation&#039;&#039;&#039; data (heights and velocities) besides rotations. The hierarchy of the body parts (or bones) is determined by [[XML:TRBS#Standard_TRIA_hierarchy|TRIA]].&lt;br /&gt;
&lt;br /&gt;
The term &#039;&#039;&#039;animation&#039;&#039;&#039; is often shortened to &#039;&#039;&#039;anim&#039;&#039;&#039; by modders, following the naming of commands in BSL: chr_wait_animstate, chr_wait_animtype, env_anim, etc.&lt;br /&gt;
&lt;br /&gt;
TRAMs used in Oni follow a naming pattern. A list of all combat TRAMs in-game and their naming can be found [[Combat moves|here.]]&lt;br /&gt;
&lt;br /&gt;
==Decision path of animation lookup==&lt;br /&gt;
* First the game builds a pool of anims a character can use. They are loaded from the TRAC file registered in [[ONCC]], including parent TRACs.&lt;br /&gt;
* Anims from a child TRAC override those of the parent if their combination of state, type and variant is exactly the same.&lt;br /&gt;
* Child TRACs usually omit some anims. For example, Elite Strikers don&#039;t have their own run anims, so they use the parent anims of normal Strikers. See [[XML:TRAC|TRAC]] page for details.&lt;br /&gt;
* A character always possesses a single animation state. This term derives from state machines, but you only need to know that states are the first point in the decision path determining what anims are actually allowed to play at a given moment.&lt;br /&gt;
* Here is the full decision path:&lt;br /&gt;
** anim &#039;&#039;&#039;state&#039;&#039;&#039; check&lt;br /&gt;
** event (user input, or engine input for the AI) -&amp;gt; [[XML_talk:StNA|context check]] -&amp;gt; anim &#039;&#039;&#039;type&#039;&#039;&#039; check&lt;br /&gt;
** anim &#039;&#039;&#039;variant&#039;&#039;&#039; check&lt;br /&gt;
** TRAC &#039;&#039;&#039;weight&#039;&#039;&#039; check&lt;br /&gt;
&lt;br /&gt;
Detailed example: Let&#039;s say that we shapeshifted to a Ninja ONCC, we are in the state Standing, and we hit the action key to perform a taunt. The engine recognizes the context (a hostile character to interact with) and looks up anims of type Taunt. Since we are in combat mode, the next anim must be of variant Combat if possible. These lookups boil down to two valid possible anims: NINCOMtaunt1 and NINCOMtaunt2. If there are multiple anims available at this point, the engine picks one of them randomly.&lt;br /&gt;
&lt;br /&gt;
However, NINCOMtaunt1 has a TRAC Weight (probability) of 100 while NINCOMtaunt2 has a TRAC Weight value of just 5. So the chances are quite high that we will not see the Moon Walk taunt.&lt;br /&gt;
&lt;br /&gt;
Keep in mind that if the engine cannot find an anim of a specific variant, it will fall back to a non-variant anim instead.&lt;br /&gt;
&lt;br /&gt;
Confused by how Weights work? Apparently, the Weight value is only one part of the equation — otherwise NINCOMtaunt2 would never execute. If there is only one anim to choose from, it will always play no matter what its Weight, even if it is zero. When it comes to multiple anims being a valid choice, the calculation seems to be: weight / sum of all weights. For NINCOMtaunt2, this means 5 / 105 = 0.047 (4.7%).&lt;br /&gt;
&lt;br /&gt;
==List of tags, types, and flags==&lt;br /&gt;
Use the search function in your browser to quickly find a tag.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=100%&lt;br /&gt;
|width=120px| &#039;&#039;&#039;tag&#039;&#039;&#039;&lt;br /&gt;
|width=100px| &#039;&#039;&#039;type&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Lookup&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Type&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_types|HERE]]. The pool of valid TRAMs (animations a character can choose from) is built from the TRAC files registered in the ONCC. Most of the anim types are connected to player inputs.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;AimingType&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_types|HERE]]. The pool of valid TRAMs, and therefore TRASs (aiming screens a character can choose from) is built from the TRSC files registered in the ONCC.&lt;br /&gt;
:&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;FromState&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
| [[Image:chr_debug_characters_shows_interpolated_animations.jpg|thumb|400px|right|Primary &amp;lt;FromState&amp;gt; in &amp;lt;Lookup&amp;gt; uses about 8 interpolating frames by default. Use Shortcut&#039;s &amp;lt;FromState&amp;gt; to override this frame number.]]&lt;br /&gt;
&lt;br /&gt;
Look them up over [[XML:StNA#Animation_states|HERE]].&lt;br /&gt;
: When FromState is set to None, some default behaviors are ignored and are replaced by Shortcuts.&lt;br /&gt;
: Shortcuts extend the number of states from which an animation can be played and under what conditions (replacing this atomic yes/no).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ToState&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_states|HERE]].&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Varient&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|(misspelled because Oni misspells it) If unused, the tag will simply be &amp;quot;&amp;lt;Varient /&amp;gt;&amp;quot;, such as for non-combat animations. Otherwise it contains one of these values:&lt;br /&gt;
: Combat&lt;br /&gt;
: LeftPistol&lt;br /&gt;
: LeftRifle&lt;br /&gt;
: Panic&lt;br /&gt;
: RightPistol&lt;br /&gt;
: RightRifle&lt;br /&gt;
: Sprint&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;FirstLevel&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|Number of first level in which move becomes available to the player (&amp;quot;0&amp;quot; to make it available from the start).&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Shortcuts&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
|&lt;br /&gt;
Works as an &#039;&#039;&#039;alternative FromState&#039;&#039;&#039; collection.&lt;br /&gt;
&lt;br /&gt;
Shortcuts are accepted if their &amp;lt;Shortcut&amp;gt;&amp;lt;FromState&amp;gt; value differs from the &amp;quot;primary&amp;quot; &amp;lt;Lookup&amp;gt;&amp;lt;FromState&amp;gt; value. In other words, if you want to make a &#039;&#039;&#039;Shortcut&#039;&#039;&#039; that uses the &#039;&#039;&#039;same FromState&#039;&#039;&#039; value then you have to set &#039;&#039;&#039;primary FromState&#039;&#039;&#039; value to &#039;&#039;&#039;None&#039;&#039;&#039;. By doing that, the hardcoded interpolation frame length of about 8 frames can be overridden.&lt;br /&gt;
&lt;br /&gt;
In the following example, the new interpolation length is 0. This will require the animation to match perfectly with the previous one. For a smooth transition to the next animation, set a suitable value at &amp;lt;Interpolation&amp;gt;&amp;lt;End&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Lookup&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
            &amp;lt;FromState&amp;gt;None&amp;lt;/FromState&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
            &amp;lt;Shortcuts&amp;gt;&lt;br /&gt;
                &amp;lt;Shortcut&amp;gt;&lt;br /&gt;
                    &amp;lt;FromState&amp;gt;Standing&amp;lt;/FromState&amp;gt;&lt;br /&gt;
                    &amp;lt;Length&amp;gt;0&amp;lt;/Length&amp;gt;&lt;br /&gt;
                    &amp;lt;ReplaceAtomic&amp;gt;no&amp;lt;/ReplaceAtomic&amp;gt;&lt;br /&gt;
                &amp;lt;/Shortcut&amp;gt;&lt;br /&gt;
            &amp;lt;/Shortcuts&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:TRAM interpolation - standard case.jpg|thumb|400px|left|Scenario A: hardcoded interpolation of 8 frames. Scenario B: changeable interpolation frame number.]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Shortcut&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;FromState&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_types|HERE]].&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Length&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int16&lt;br /&gt;
|Amount of interpolating frames. While interpolations of rotation are less noticeable, interpolations of different positions can cause drift (i.e. sliding).&lt;br /&gt;
&lt;br /&gt;
This is especially observed for transitions from idle to movements and vice versa — basically any combination of animations with different accelerations at start and end. By default, animations without specified Shortcut interpolation give about 8 frames of interpolation. For moves starting or ending in idle, it&#039;s better not to use interpolation. Just give the start and end frames the same positions and rotation values as the idle. Interpolations should always be considered a &#039;&#039;last resort&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
This drift can be observed even in vanilla animations — most prominently in Konoko&#039;s comb_k. Konoko&#039;s left foot should be in a fixed position as the animation starts from from Konoko&#039;s idle pose. However, the interpolation is causing her left foot to drift noticeably to the right and a bit forward.&lt;br /&gt;
&lt;br /&gt;
The reason this happens is because the interpolation &amp;quot;mixes&amp;quot; two animations. When one animation transitions into another via interpolation, part of the animation system continues playing the initial animation, and part of it is playing the follow-up animation, with all the rotations and positions getting linearly interpolated.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;ReplaceAtomic&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: yes&lt;br /&gt;
: no&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Flags&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|These are top-level flags on the whole animation. See the other &amp;lt;Flags&amp;gt; for flags on an attack part.&lt;br /&gt;
:RuntimeLoaded&lt;br /&gt;
::(This bit is not stored on disk; it is used at runtime to mark that the animation was loaded.)&lt;br /&gt;
:Invulnerable&lt;br /&gt;
::While playing this animation, the player is invulnerable to melee damage and also cannot be thrown. Damage from particles and fall damage still hurt.&lt;br /&gt;
:BlockHigh&lt;br /&gt;
::While playing this animation, the player is invulnerable to high or undefined attacks within some arc in front of him. If you set this flag on an animation where the player character is spinning, then the character can still be kicked in the back or thrown.&lt;br /&gt;
:BlockLow&lt;br /&gt;
::Same as above, only it can block low or undefined attacks.&lt;br /&gt;
:Attack&lt;br /&gt;
::Animations with an attack part have this turned on. It&#039;s unclear what it does, but it may enable the melee soft-lock (where the character turns a bit during the animation to face a nearby enemy).&lt;br /&gt;
:DropWeapon&lt;br /&gt;
::If the player is armed, he drops his weapon when this animation plays.&lt;br /&gt;
:InAir&lt;br /&gt;
::Something to do with jumps; not investigated.&lt;br /&gt;
:Atomic&lt;br /&gt;
::The whole animation must be played; player cannot interrupt it once it starts.&lt;br /&gt;
:NoTurn&lt;br /&gt;
:::Player cannot turn by mouse while performing this animation.&lt;br /&gt;
:AttackForward&lt;br /&gt;
::Unknown, but it looks like this is a hint for the AI about where an attack is aiming, from the player&#039;s point of view.&lt;br /&gt;
:AttackLeft&lt;br /&gt;
::Same as above.&lt;br /&gt;
:AttackRight&lt;br /&gt;
::Same as above.&lt;br /&gt;
:AttackBackward&lt;br /&gt;
::Same as above.&lt;br /&gt;
:Overlay&lt;br /&gt;
::Not a standalone animation; it just overwrites part of an already-playing one, e.g. the weapon-holstering animation.&lt;br /&gt;
:DontInterpolateVelocity&lt;br /&gt;
::Unknown, but maybe it has something to do with {x,y,z} velocities and the fact that directional jumps, for example, take information about their direction vector from the {x,z} velocity part of the TRAM (the vertical Y component is in the ONCC).&lt;br /&gt;
:ThrowSource&lt;br /&gt;
::Unknown, but throws use it.&lt;br /&gt;
::: Probably a developer relic. Throws work in animation pairs: whenever a throw source is played, the other character must perform the throw target animation. See throw(n) types:&lt;br /&gt;
:::: TRAM &amp;lt;TargetType&amp;gt;&lt;br /&gt;
:::: [[XML:StNA#Animation_types|StNA]] (First &amp;lt;u&amp;gt;used&amp;lt;/u&amp;gt; throw starts at #96.)&lt;br /&gt;
::: Characters have only their own pool of animations available. And since enemy&#039;s TRAC might not contain the necessary animation the information must be provided by the throw source TRAC. &lt;br /&gt;
::: Since every throw animation must have a throw animation type the ThrowSource flag is actually redundant.&lt;br /&gt;
:ThrowTarget&lt;br /&gt;
::Animation can hurt anybody with its attack part, including teammates. The player can even hurt himself with the TRAM&#039;s damage part (whereas a player cannot hurt himself with his own animation&#039;s attack part). It also allows two attack parts to be executed instead of only one (maybe a bug? more than two will result in a crash).&lt;br /&gt;
:::If you set the first attack part to be able to deal damage from the 1st to the 100th frame of the TRAM, and the second attack part to deal damage within that range (e.g. from the 25th to the 41st frame), then the first attack part will deal damage from the 1st to the 100th frame (as usual), but even if it hits, that second attack part can hurt the enemy as well during frames 25–41. Note that the second attack part must be executed within the first attack part&#039;s active &amp;quot;window&amp;quot;, otherwise it won&#039;t work.&lt;br /&gt;
:RealWorld&lt;br /&gt;
::It appears this flag was used to create a TRAM and an OBAN from one animation source. The OBAN is supposed to store pelvis rotations and positions, allowing a character to move over obstacles/gaps. The vast majority of them are used in cutscenes.&lt;br /&gt;
:DoAim&lt;br /&gt;
::Applies the aiming animation overlay (PIS/RIF) if the player has a weapon.&lt;br /&gt;
:DontAim&lt;br /&gt;
::An aiming overlay will not be applied.&lt;br /&gt;
:CanPickup&lt;br /&gt;
::Player can pick up an item during this animation if he intersects with one during his movement.&lt;br /&gt;
:Aim360&lt;br /&gt;
::Unknown.&lt;br /&gt;
:DisableShield&lt;br /&gt;
::If the player has an active supershield (chr_super &amp;quot;name&amp;quot; 1), this forces him to disable it (chr_super &amp;quot;name&amp;quot; 0)&lt;br /&gt;
:NoAIPickup&lt;br /&gt;
::AIs are not permitted to pick up items with this animation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Atomic&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Makes animation particle atomic?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Invulnerable&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Character will not take melee damage during a time frame defined by the Start and End frames.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| First frame of character being invulnerable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Last frame of character being invulnerable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Overlay&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;UsedBones&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|Simply contains &amp;quot;&amp;lt;UsedBones /&amp;gt;&amp;quot; if no bones are involved, otherwise:&lt;br /&gt;
:Pelvis&lt;br /&gt;
:LeftThigh&lt;br /&gt;
:LeftCalf&lt;br /&gt;
:LeftFoot&lt;br /&gt;
:RightThigh&lt;br /&gt;
:RightCalf&lt;br /&gt;
:RightFoot&lt;br /&gt;
:Mid&lt;br /&gt;
:Chest&lt;br /&gt;
:Neck&lt;br /&gt;
:Head&lt;br /&gt;
:LeftShoulder&lt;br /&gt;
:LeftArm&lt;br /&gt;
:LeftWrist&lt;br /&gt;
:LeftFist&lt;br /&gt;
:RightShoulder&lt;br /&gt;
:RightArm&lt;br /&gt;
:RightFist&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;ReplacedBones&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
| &amp;quot;&amp;lt;ReplacedBones /&amp;gt;&amp;quot; if unused, otherwise:&lt;br /&gt;
:Pelvis&lt;br /&gt;
:LeftThigh&lt;br /&gt;
:LeftCalf&lt;br /&gt;
:LeftFoot&lt;br /&gt;
:RightThigh&lt;br /&gt;
:RightCalf&lt;br /&gt;
:RightFoot&lt;br /&gt;
:Mid&lt;br /&gt;
:Chest&lt;br /&gt;
:Neck&lt;br /&gt;
:Head&lt;br /&gt;
:LeftShoulder&lt;br /&gt;
:LeftArm&lt;br /&gt;
:LeftWrist&lt;br /&gt;
:LeftFist&lt;br /&gt;
:RightShoulder&lt;br /&gt;
:RightArm&lt;br /&gt;
:RightFist&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;DirectAnimations&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Link&amp;gt;&lt;br /&gt;
| link&lt;br /&gt;
| First slot. &amp;quot;&amp;lt;Link /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Link&amp;gt;&lt;br /&gt;
| link&lt;br /&gt;
| Second slot. &amp;quot;&amp;lt;Link /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Pause&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Hard&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| In ticks. The Hard and Soft pause values are ignored if this animation has a direct link (above) to another animation.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Soft&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int16&lt;br /&gt;
| In ticks. As mentioned above, the player cannot enter new inputs during this pause unless this animation is part of a combo animation defined by &amp;lt;DirectAnimations&amp;gt;&amp;lt;Link&amp;gt;.&lt;br /&gt;
: Examples:&lt;br /&gt;
: COMcomb_p, (no pause) COMcomb_p_p&lt;br /&gt;
: COMcomb_p, (pause) COMcomb_k&lt;br /&gt;
&lt;br /&gt;
The difference between the hard and soft pause is that you can block during the soft pause and not the hard pause.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Interpolation&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;End&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int16&lt;br /&gt;
|&lt;br /&gt;
* interpolates first X frames of next animation&lt;br /&gt;
* if the first follow-up animation is too short, it can continue to play even further (not observed with vanilla anims)&lt;br /&gt;
&lt;br /&gt;
While interpolations with rotations are less noticeable, interpolations of different positions can cause an additional drift.&lt;br /&gt;
&lt;br /&gt;
This was especially observed for transitions of idle to movements and vice versa — basically any combination of animations with different accelerations at the start and end. By default, animations without a specified Shortcut interpolation get about 8 frames of interpolation. For moves starting or ending in idle, it&#039;s better not to use interpolation. Just give the start and end frames the same positions and rotation values as the idle. Interpolations should always be considered a &#039;&#039;last resort&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:TRAM interpolations - end interpolation bigger than next anim.jpg|thumb|400px|left|&amp;quot;End&amp;quot; interpolation covering multiple follow-up animations.]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Max&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| unused&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;FinalRotation&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| float&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| Ending rotation in degrees. (During an animation, the camera is detached rotation-wise. If this value matches the body&#039;s final rotation, it will prevent a &amp;quot;glitchy&amp;quot; re-attaching.)&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Direction&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
| Used by [[AI#Melee_combat_behaviors|AI melee system]].&lt;br /&gt;
:None&lt;br /&gt;
:Forward&lt;br /&gt;
:Backward&lt;br /&gt;
:Left&lt;br /&gt;
:Right&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Vocalization&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| ID of one of the [[XML:SNDD#Step_1:_Preparing_the_TRAM|SoundConstants in ONCC]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ActionFrame&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Frame number for any special events associated with this animation: weapon theft via disarm, weapon holstering, Mukade teleporting, items getting handed over to player, etc.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Impact&amp;gt;&lt;br /&gt;
| link&lt;br /&gt;
| &amp;quot;&amp;lt;Impact /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Particles&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
| serves as group element&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Particle&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
| holds individual particle data&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Start&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int&lt;br /&gt;
| frame number for particle to start&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;End&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int&lt;br /&gt;
| frame number for particle to end (if the number exceeds frame count of animation, the particle will simply die at the end of the animation)&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Bone&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: Pelvis &lt;br /&gt;
: LeftThigh &lt;br /&gt;
: LeftCalf &lt;br /&gt;
: LeftFoot &lt;br /&gt;
: RightThigh &lt;br /&gt;
: RightCalf &lt;br /&gt;
: RightFoot &lt;br /&gt;
: Mid &lt;br /&gt;
: Chest &lt;br /&gt;
: Neck &lt;br /&gt;
: Head &lt;br /&gt;
: LeftShoulder &lt;br /&gt;
: LeftArm &lt;br /&gt;
: LeftWrist &lt;br /&gt;
: LeftFist &lt;br /&gt;
: RightShoulder &lt;br /&gt;
: RightArm &lt;br /&gt;
: RightFist&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Name&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| link&lt;br /&gt;
| particle name in [[XML:ONCC#ONCP:_Oni_Character_Particle_.28Array.29|ONCC-ONCP]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| sequence element&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Bones&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: Pelvis &lt;br /&gt;
: LeftThigh &lt;br /&gt;
: LeftCalf &lt;br /&gt;
: LeftFoot &lt;br /&gt;
: RightThigh &lt;br /&gt;
: RightCalf &lt;br /&gt;
: RightFoot &lt;br /&gt;
: Mid &lt;br /&gt;
: Chest &lt;br /&gt;
: Neck &lt;br /&gt;
: Head &lt;br /&gt;
: LeftShoulder &lt;br /&gt;
: LeftArm &lt;br /&gt;
: LeftWrist &lt;br /&gt;
: LeftFist &lt;br /&gt;
: RightShoulder &lt;br /&gt;
: RightArm &lt;br /&gt;
: RightFist&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Start frame of motion blur sequence&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| End frame of motion blur sequence&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Lifetime&amp;gt;&lt;br /&gt;
| int8&lt;br /&gt;
| Lifetime of each &amp;quot;ghost&amp;quot; in frames. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Alpha&amp;gt;&lt;br /&gt;
| int8&lt;br /&gt;
| Transparency of &amp;quot;ghosts&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Interval&amp;gt;&lt;br /&gt;
| int8&lt;br /&gt;
| Frame interval between each rendered &amp;quot;ghost&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Footsteps&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Footstep&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Type&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: Left&lt;br /&gt;
: Right&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Sounds&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &amp;quot;&amp;lt;Sounds /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Sound&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Name&amp;gt;&lt;br /&gt;
| char[32]&lt;br /&gt;
| &amp;lt;font color=&amp;quot;#777777&amp;quot;&amp;gt;OSBD&amp;lt;/font&amp;gt;file&amp;lt;font color=&amp;quot;#777777&amp;quot;&amp;gt;.imp.oni&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#777777&amp;quot;&amp;gt;(don&#039;t use resource type&#039;s prefix or suffix)&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|The frame when the sound starts to play.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Heights&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Height&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
|Absolute position.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Velocities&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Velocity&amp;gt;&lt;br /&gt;
| 2 x float&lt;br /&gt;
|Relative positions (delta values); the numbers represent the change in position from one frame to another.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Rotations&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Bone&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|There are 19 bone tags, one for each [[TRIA#Bones|body part]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;EKey&amp;gt;&lt;br /&gt;
| int8 + 3 * float&lt;br /&gt;
|For normal animations. The first value is the number of frames for which the rotation is maintained; the sum of all of these first EKey components always equals the total number of frames for the animation.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;QKey&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int8 + 4 * float&lt;br /&gt;
|For overlay animations used by [[TRAS|TRAS]] aiming screens.&lt;br /&gt;
&lt;br /&gt;
OniSplit v0.9.54.0 produces &amp;lt;QKey&amp;gt;s (quaternions) instead of &amp;lt;EKey&amp;gt;s (Euler rotations) for normal animations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;PositionOffset&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &amp;lt;PositionOffset&amp;gt; and &amp;lt;Positions&amp;gt; belong together. In the [[OBD:TRAM/raw0x30|binaries]], they are written in place. &#039;&#039;&#039;Seems unused; changing them has no effect in-game.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;X&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Z&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Positions&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Position&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| seems to be unused (and when checking this with &amp;quot;chr_debug_sphere = 1&amp;quot;, the spheres remain unchanged)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Height&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| vertical extent&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;YOffset&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| Y offset of the vertical extent from character location &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ThrowSource&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &amp;quot;&amp;lt;ThrowSource /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;TargetAdjustment&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Used to position targets during throws, relative to the position of the character executing the throw.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Position&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| 3 * float&lt;br /&gt;
| Contains XYZ values, which position the target character:&lt;br /&gt;
*X - Side axis. Negative values move the target to the right and positive values move the target to the left.&lt;br /&gt;
*Y - Height axis. Negative values move the target downwards, but cannot make the target go below the floor. Positive values make the target go upwards — if the value is too big, the target will teleport upward and then immediately start falling, interrupting the target animation.&lt;br /&gt;
*Z - Forward axis. Negative values move the target backwards and positive values move the target forward.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Angle&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| In radians - adjusts the rotation of the target in Oni&#039;s Y axis; most of the time (if not always) it&#039;s set to &#039;&#039;3.14159274&#039;&#039; radians in vanilla anims, equaling 180 degrees - which effectively rotates the rotates by those 180 degrees; if it was set to 0, the target would face the throw source character with his back.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Distance&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| Activation distance. The throw can be triggered if it is within this range. However the value must be greater than the equivalent TRAM in the parent TRAC.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;TargetType&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
| The flags are part of the [[XML:StNA#Animation_types|animation type list]].&lt;br /&gt;
&lt;br /&gt;
(static throws)&lt;br /&gt;
: Thrown1 = ###COMthrow_fw_p_tgt&lt;br /&gt;
: Thrown2 = ###COMthrow_fw_k_tgt&lt;br /&gt;
: Thrown3 = ###COMthrow_bk_p_tgt&lt;br /&gt;
: Thrown4 = ###COMthrow_bk_k_tgt&lt;br /&gt;
(running throws)&lt;br /&gt;
: Thrown5 = ###COMrun_throw_fw_p_tgt&lt;br /&gt;
: Thrown6 = ###COMrun_throw_fw_p_tgt&lt;br /&gt;
: Thrown7 = ###COMrun_throw_bk_k_tgt&lt;br /&gt;
: Thrown8 = ###COMrun_throw_bk_k_tgt (not tested)&lt;br /&gt;
(tackle throw = catching)&lt;br /&gt;
: Thrown9 = ###COMrun_tkl_fw_p_tgt (not tested)&lt;br /&gt;
: Thrown10 = ###COMrun_tkl_bk_p_tgt&lt;br /&gt;
(pistol disarms)&lt;br /&gt;
: Thrown11 = ###PISthrow_fw_p_tgt&lt;br /&gt;
: Thrown12 = ###PISthrow_fw_k_tgt&lt;br /&gt;
: Thrown13 = ###PISthrow_bk_p_tgt&lt;br /&gt;
(rifle disarm)&lt;br /&gt;
: Thrown14 = ###PISthrow_bk_k_tgt (not tested)&lt;br /&gt;
: Thrown15 = ###RIFthrow_fw_p_tgt&lt;br /&gt;
: Thrown16 = ###RIFthrow_bk_p_tgt&lt;br /&gt;
: Thrown17 = ###RIF? = (not tested)&lt;br /&gt;
----&lt;br /&gt;
About the naming:&lt;br /&gt;
: &amp;quot;fw&amp;quot; = face-to-face throw&lt;br /&gt;
: &amp;quot;bk&amp;quot; = thrower is facing victim&#039;s back&lt;br /&gt;
: &amp;quot;throw&amp;quot; inside TRAM names is sometimes shortened to &amp;quot;thr&amp;quot;&lt;br /&gt;
: &amp;quot;p&amp;quot;/&amp;quot;k&amp;quot; = triggered by punch or kick button (&amp;quot;p&amp;quot; is sometimes omitted)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;SelfDamage&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&amp;quot;&amp;lt;SelfDamage /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
&lt;br /&gt;
Works only with specific, hardcoded AnimTypes (mainly ThrownX, it&#039;s unknown if any other types work - that remains to be investigated). Using SelfDamage on an AnimType that wasn&#039;t intended for it will cause the game to crash. (ToDo: Checked if &amp;lt;Flag&amp;gt;ThrowTarget is enough to explain this. Modify a simple kick? For more please link to and use talk page.)&lt;br /&gt;
&lt;br /&gt;
From a practical standpoint, this means SelfDamage can be used only on ThrowTarget animations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Damage&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| sequence element&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Points&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Damage taken by character.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Frame of the animation when damage is dealt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Attacks&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Attack&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
| Only 2 attack parts per file are allowed. Normally the target gets only one hit. But if the attack frame ranges of both attack parts are overlapping, then the target can be [http://oni.bungie.org/forum/viewtopic.php?pid=39787#p39787 hit by both of them].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| First frame where damage can be inflicted on an opponent.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Last frame where damage can be inflicted on an opponent.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Bones&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| The bones which can inflict damage.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Flags&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|These are flags on an attack part, inside an &amp;lt;Attacks&amp;gt;&amp;lt;Attack&amp;gt; element. See the previous &amp;lt;Flags&amp;gt; for general flags on the TRAM.&lt;br /&gt;
: Unblockable&lt;br /&gt;
: Low - Target of attack needs to crouch in order to block this attack.&lt;br /&gt;
: High - Blocker needs to stand; if both Low and High are set, blocker can block from both standing and crouching positions.&lt;br /&gt;
: HalfDamage - Blocker receives half of the normal damage.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Knockback&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| Target gets knocked back by this amount.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;HitPoints&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Damage points inflicted by attack.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;HitType&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Animation type for opponent&#039;s animation when the attack isn&#039;t blocked. The flags are part of the [[XML:StNA#Animation_types|animation type list]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;HitLength&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Number of frames that the target should remain in his hit animation state when he gets hit.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;StunLength&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Number of frames that the target should remain in his blocking animation state when he blocks the attack.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;StaggerLength&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Number of frames that the target should perform his stagger animation after a successful block.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Extents&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Explained below. Automatically calculated by OniSplit if there&#039;s a DAE file referenced in the XML.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Extent&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| One tag per attack frame. Number of &amp;lt;Extent&amp;gt; tags = &amp;lt;Attack&amp;gt;&amp;lt;End&amp;gt; - &amp;lt;Attack&amp;gt;&amp;lt;Start&amp;gt; + 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Angle&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| In degrees.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Length&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MinY&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MaxY&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;AttackRing&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|  parent tag&lt;br /&gt;
| Always contains 36 &amp;lt;Length&amp;gt; tags, explained below. Automatically calculated by OniSplit if there&#039;s a DAE file referenced in the XML. (AttackRing was formerly known as &amp;quot;horizontal extents&amp;quot; in older versions of OniSplit.)&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Length&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| float&lt;br /&gt;
| Horizontal extents, explained below. They create a &amp;quot;danger zone&amp;quot; around the attacker which the AI uses to try to dodge an attack.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Export==&lt;br /&gt;
TRAM files can be extracted &#039;&#039;&#039;A) as pure XML&#039;&#039;&#039; files or &#039;&#039;&#039;B) as a pair of XML and DAE&#039;&#039;&#039; files. For editing the actual animation, you will want to use method B. While exporting an ONCC, you might see errors such as:&lt;br /&gt;
&lt;br /&gt;
 Cannot find instance &#039;TRAMKONCOMthrow_rev&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONCOMthrow_rev&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONRIFturn_right&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONOKOlev18_ZomStand&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONOKOcorner_hide&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONPIScorner_hide&#039;&lt;br /&gt;
&lt;br /&gt;
Ignore them, as those files doesn&#039;t exist. (Someday we should remove them from the TRACs.)&lt;br /&gt;
&lt;br /&gt;
===Via command line===&lt;br /&gt;
To export a single TRAM:&lt;br /&gt;
 onisplit -extract:xml output_path -anim-body:path_to\TRBS_or_ONCCname.oni path_to\TRAMname.oni&lt;br /&gt;
&lt;br /&gt;
To export merged TRAMs:&lt;br /&gt;
 onisplit -extract:xml output_path &#039;&#039;&#039;-anim-merge&#039;&#039;&#039; -anim-body:path_to\TRBS_or_ONCCname.oni path_to\TRAMname1.oni  path_to\TRAMnameN.oni&lt;br /&gt;
&lt;br /&gt;
===Via Vago===&lt;br /&gt;
[[Image:Vago_xml_plus_dae_extraction.png|thumb|200px|right|Combined extraction of DAE and XML.]]&lt;br /&gt;
&lt;br /&gt;
Change to Characters tab and follow these steps.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 1:&#039;&#039;&#039; Select &amp;quot;TRAM ONI&amp;quot; as input format (&amp;quot;From&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 2:&#039;&#039;&#039; Select &amp;quot;XML / XML &amp;amp; DAE&amp;quot; as output format (&amp;quot;To&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 3:&#039;&#039;&#039; Tick checkbox &amp;quot;Extract with TRBS / ONCC&amp;quot;. It&#039;s important this is done before adding a TRAM file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 4:&#039;&#039;&#039; Set full path of ONCC or TRBS.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 5:&#039;&#039;&#039; Add TRAM file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 6:&#039;&#039;&#039; Click &amp;quot;Convert&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Via Simple OniSplit GUI===&lt;br /&gt;
There was a long-standing problem with combined ONCC/TRAM files where the textures would be missing.&amp;lt;!--[Iritscen: I don&#039;t understand this sentence; is it important to keep this historical note?] With an older method you couldn&#039;t export non-native TRAM which meant to the TRAM had to be registered in the TRAC the ONCC is using.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.paradox.oni2.net/programs/Simple_OniSplit_GUI.zip Simple OniSplit GUI]&#039;&#039;&#039; post-edits the DAE to fix missing textures. The character-related .oni files must be all in one folder. Usually the level0_Final folder does the trick.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 1:&#039;&#039;&#039; Drag and drop the TRAM and ONCC into the [http://www.paradox.oni2.net/images/simpleOniSplitGui.png big field.] (One by one or simultaneously; the order doesn&#039;t matter.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 2:&#039;&#039;&#039; Hit &amp;quot;Convert&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Editing 3D data==&lt;br /&gt;
===Blender===&lt;br /&gt;
See the [[Blender]] article for a general tutorial on using the free program to create animations for Oni. It also contains code snippets for automating certain tasks, troubleshooting advice, and links to an IK rig that makes animation much easier.&lt;br /&gt;
&lt;br /&gt;
===XSI===&lt;br /&gt;
In the past, the community&#039;s preferred tool for any 3D modeling and animation was {{ModTool}}. However, this free program was discontinued in 2014, and modders did not want to be tied to an aging (not to mention Windows-only) program. Thus, we have generally moved to using Blender (see next section). The following information is preserved for historical purposes.&lt;br /&gt;
----&lt;br /&gt;
For the correct Mod Tool settings, see [[Mod Tool#Animating|HERE]].&lt;br /&gt;
&lt;br /&gt;
Here are some hints for creating animations when there is no rigging available:&lt;br /&gt;
* Use the ONCC model in your 3D editor that will actually make use of the animations. This makes sure that the pelvis height will match and that the character&#039;s feet will not float in the air or go through the ground. &lt;br /&gt;
* The first frame and last frames should match the probable previous and follow-up animations. This will reduce the necessity for long interpolations.&lt;br /&gt;
* When setting keyframes, each body part should have moved. This rule of thumb will give a more natural-looking animation.&lt;br /&gt;
* The first body part to be animated is always the pelvis.&lt;br /&gt;
* Watch out for pelvis rotations so that the XYZ rotations don&#039;t overlap too much, otherwise you will get into a [[wp:Gimbal_lock|gimbal lock]].&lt;br /&gt;
&lt;br /&gt;
Also see our [http://oni.bungie.org/forum/viewtopic.php?id=1433 OCF thread].&lt;br /&gt;
&lt;br /&gt;
==Import==&lt;br /&gt;
 onisplit -create output_path path_to\TRAMname.xml&lt;br /&gt;
&lt;br /&gt;
==Common operations on animations by the community==&lt;br /&gt;
===Speeding up existing animations===&lt;br /&gt;
s10k has created an XmlTools script that allows the speed-up of any existing TRAM by removing frames. More information and download link [http://mods.oni2.net/node/354 here.]&lt;br /&gt;
&lt;br /&gt;
==Selected notes on animation types==&lt;br /&gt;
===Attacks===&lt;br /&gt;
====Extents and XML====&lt;br /&gt;
&#039;&#039;&#039;As a regular modder you don&#039;t need to know how the attack ring and the extents get calculated.&#039;&#039;&#039; If you just want to create an attack animation then add an appropriate &amp;lt;Attacks&amp;gt; code block to your XML as seen in the [[#Using OniSplit to calculate extents|section below]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;How attack ring (horizontal extents) and extents get calculated&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Ever wondered how the AI can recognize incoming attacks and block or dodge them? Extents (found by geyser and fully uncovered by Neo) are the key. Imagine the character looked at from above, and visualize a circle with this character being at the center of the circle. Now divide this circle into 10° segments, and those are the 36 units of horizontal extents (that is, the lateral reach of the attack). The 0° point is directly in front of the character and 180° is behind the character. The segments run clockwise around the character. So the first Extent tag is the horizontal reach on the 0° line, the second tag is for the line 10° clockwise, and so on. Note that a frontal attack like a simple kick could hit a target not only if he&#039;s standing at 0° (directly in front), but also at 10° or 20° to the right, and also at 340° and 350° (a bit to the left). When setting these manually, you should guess the inner and outer ranges of the reach of the attacker&#039;s bones that have damage attached to them. Test these values with an AI that blocks often. If you did it right, your attack will often be blocked, but if the extent length is too high, the AIs will react when too far from you, which does not look good.&lt;br /&gt;
&lt;br /&gt;
There are two types of extents:&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;Extents&amp;gt;&#039;&#039;&#039; stores this info:&lt;br /&gt;
::&amp;lt;Angle&amp;gt; at which this extent radiates from the character.&lt;br /&gt;
::&amp;lt;Length&amp;gt; of this extent.&lt;br /&gt;
::&amp;lt;MinY&amp;gt; minimum height of this extent.&lt;br /&gt;
::&amp;lt;MaxY&amp;gt; maximum height of this extent.&lt;br /&gt;
:Length, MinY and MaxY serve to create an invisible area in space which is &amp;quot;dangerous to be in&amp;quot;. If an AI intersects with this area and notices it (refer to the Notice field in [[MELE]]), it will attempt to block or dodge according to its modifiers in its MELE profile.&lt;br /&gt;
::The number of &amp;lt;Extent&amp;gt;s is equal to the number of attack frames: &amp;lt;End&amp;gt; minus &amp;lt;Start&amp;gt; plus one (because the start frame counts too). For example, for TRAMKONCOMkick_low1: &amp;lt;End&amp;gt;30&amp;lt;/End&amp;gt; minus &amp;lt;Start&amp;gt;22&amp;lt;/Start&amp;gt; plus 1 = 9 &amp;lt;Extent&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;AttackRing&amp;gt; (formerly known as &amp;lt;HorizontalExtents&amp;gt;&#039;&#039;&#039; stores this info:&lt;br /&gt;
::36 fields (exactly 36, otherwise it won&#039;t compile back into a .oni file), which correspond to areas in 10° intervals around the character as described above.&lt;br /&gt;
&lt;br /&gt;
====Using OniSplit to calculate extents====&lt;br /&gt;
Let&#039;s say that you want to convert a non-attack animation to a damage-dealing animation. Non-attack TRAMs do not have extents information used to notify the AIs about incoming attacks, so how do you generate this information from the animation?&lt;br /&gt;
:1. Export the animation to XML with a body attached. If you extract using just &amp;quot;-extract:xml dest_folder TRAMsomething.oni&amp;quot;, you&#039;ll get the 3D animation data inside the XML (namely, the tags Heights, Velocities, Rotations, PositionOffset, and Positions; for an attack animation, you&#039;ll also get Attacks and AttackRing, and inside Attacks&#039; elements, each Attack element will have Extents at the end of it).&lt;br /&gt;
:However, if you extract this same animation using &amp;quot;-extract:xml dest_folder TRAMsomething.oni &#039;&#039;&#039;-anim-body ONCCtramuser.oni&#039;&#039;&#039;&amp;quot;, the animation data will be placed in a DAE file along with the character model geometry. Be sure to pick a body with a size that&#039;s representative of the character classes that will actually use this TRAM, because the extents will be calculated from it. The XML file will be very short without the 3D data in it — this is how we want the non-attack TRAM to look. We do not know the extents information that should go in Extents or AttackRing, so we just want to add the part that distinguishes a DAE-extracted attack TRAM XML from a DAE-extracted non-attack TRAM XML. That part is the Attacks section, without the Extents under each Attack.&lt;br /&gt;
:2. First, consider whether the TRAM should have something added to its Flags section, like Attack or ThrowTarget.&lt;br /&gt;
:3. Now add to the XML of the non-attack TRAM data in the following format (after the &amp;lt;SelfDamage /&amp;gt; section, typically):&lt;br /&gt;
        &amp;lt;Attacks&amp;gt;&lt;br /&gt;
            &amp;lt;Attack&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;1&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;10&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;RightWrist RightFist&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Flags /&amp;gt;&lt;br /&gt;
                &amp;lt;Knockback&amp;gt;4&amp;lt;/Knockback&amp;gt;&lt;br /&gt;
                &amp;lt;HitPoints&amp;gt;10&amp;lt;/HitPoints&amp;gt;&lt;br /&gt;
                &amp;lt;HitType&amp;gt;KnockdownHead&amp;lt;/HitType&amp;gt;&lt;br /&gt;
                &amp;lt;HitLength&amp;gt;5&amp;lt;/HitLength&amp;gt;&lt;br /&gt;
                &amp;lt;StunLength&amp;gt;8&amp;lt;/StunLength&amp;gt;&lt;br /&gt;
                &amp;lt;StaggerLength&amp;gt;0&amp;lt;/StaggerLength&amp;gt;&lt;br /&gt;
            &amp;lt;/Attack&amp;gt;&lt;br /&gt;
        &amp;lt;/Attacks&amp;gt;&lt;br /&gt;
:Do not add an AttackRing section after Attacks.&lt;br /&gt;
:4. Import this with &amp;quot;-create dest_folder TRAMsomething.xml&amp;quot;. The Extents sections and the AttackRing will be calculated by OniSplit from the attached DAE.&lt;br /&gt;
:5. If you need this information for a patch mod, run &amp;quot;-extract:xml&amp;quot; on the TRAMsomething.oni you&#039;ve created &amp;lt;u&amp;gt;without&amp;lt;/u&amp;gt; using &amp;quot;-anim-body&amp;quot;. Now you can copy the Extents and AttackRing data to your XML patch. For an example of how the patch should look, see the [http://mods.oni2.net/node/311 Domino Knockdowns] mod.&lt;br /&gt;
&lt;br /&gt;
===Combos===&lt;br /&gt;
The type and order of player input for triggering a given animation type (such as PPK) is hardcoded, and new animation types cannot be created. To assign an animation type to a specific combo attack, you set a corresponding value in &amp;lt;Lookup&amp;gt;&amp;lt;Type&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Setting a value in the &amp;lt;Link&amp;gt; of &#039;&#039;&#039;&amp;lt;DirectAnimations&amp;gt;&#039;&#039;&#039; will do two things:&lt;br /&gt;
# It will increase the time window for player input, meaning the next animation can be executed more easily. (In vanilla Oni, the Crescent Moon Kick has no link in KONCOMcomb_k_k_kfw and therefore is difficult to use.)&lt;br /&gt;
# It disables &amp;lt;Interpolation&amp;gt;&amp;lt;End&amp;gt; for the next combo anim.&lt;br /&gt;
# It enables &amp;lt;Pause&amp;gt;&amp;lt;Soft&amp;gt; and &amp;lt;Pause&amp;gt;&amp;lt;Hard&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Just Frame input===&lt;br /&gt;
Implemented by Delano762, inspired by the game series Tekken, a Just Frame (&amp;quot;JF&amp;quot;) move means that you have to press certain keys (W+K or W+P) at the exact same time, which is more difficult than it might sound. Delano&#039;s mod [http://mods.oni2.net/node/353 54000 New Combat Moves for Konoko] has a collection of animations which utilize existing animation states differently to create new moves.&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
* new forward kick = TRAMKONCOMkick_fw_JF &amp;lt;FromState&amp;gt;Standing&lt;br /&gt;
** key strokes: w + k&lt;br /&gt;
* old forward kick = TRAMKONCOMkick_fw &amp;lt;FromState&amp;gt;RunStart&lt;br /&gt;
** key strokes: w, k&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
* new forward punch = TRAMKONCOMpunch_fw_JF &amp;lt;FromState&amp;gt;Standing&lt;br /&gt;
** key strokes: w + p&lt;br /&gt;
* old forward punch = TRAMKONCOMpunch_fw &amp;lt;FromState&amp;gt;RunStart&lt;br /&gt;
** key strokes: w, p&lt;br /&gt;
&lt;br /&gt;
Note that these animations are referred to as JF moves, not JF combos. The Crescent Moon Kick, as mentioned above, is an unintentional JF combo found in vanilla Oni.&lt;br /&gt;
&lt;br /&gt;
===Throws===&lt;br /&gt;
: Todo: Add here throw pair table from talk page when it is complete.&lt;br /&gt;
&lt;br /&gt;
Throw target animations are registered in the TRAC of the throw initiator (AKA the throw source). Target animations are forced onto the other character, removing the need to have that animation in the target&#039;s TRAC. Throw target (TRAM*tgt) animations can only cover up to 256 frames (0-255).&lt;br /&gt;
&lt;br /&gt;
====Forward throws====&lt;br /&gt;
Scenario: You load two characters into Mod Tool and rotate (+/-180°) the throw target character because you need them to stand face to face as you work on an animation. When you are done animating, the target animation would need to be reversed again. This means multiplying the velocities by -1; the rotation also needs correcting. So it looks like you need *(-1) for the x rotation and -/+180° (depending on your initial change) for the Y rotation.&lt;br /&gt;
&lt;br /&gt;
=====BlenderOni Throw Adjust=====&lt;br /&gt;
There is a Blender script implemented within the BlenderOni addon for rotating and adding PositionOffset to a forward throw Target animation. It is capable of adjusting both forward and back throws. The script&#039;s old version can be accessed [[Blender/Obsolete_scripts#Script_for_adjusting_forward_throw_targets|HERE.]]&lt;br /&gt;
&lt;br /&gt;
====Excel macro====&lt;br /&gt;
[[Image:Animation_macro_v4.png|right|thumb]]&lt;br /&gt;
The Excel macro can be used to create any TRAM except overlays. [https://www.youtube.com/watch?v=vDTPYfvMf4M Demo vid here].&lt;br /&gt;
&lt;br /&gt;
The macro should be rewritten as a .NET framework or application because Excel is not freeware. However, the tool was made with XSI in mind (for getting animation pair-based information). As XSI is mostly considered obsolete by the community, research for doing the same with Blender will be needed.&lt;br /&gt;
&lt;br /&gt;
There was some development of a .NET-based &#039;&#039;&#039;[[TRAM setup assistant]]&#039;&#039;&#039; in 2016, but the work drifted into inactivity since the community showed no sign of demand for an updated tool.&lt;br /&gt;
&lt;br /&gt;
As of now there is a Blender script for creating throw target adjustment data. So instead of writing a new stand-alone app, at least the creation of header data might be better ported to the Blender script.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Macro usage:&#039;&#039;&#039;&lt;br /&gt;
* Put your files into the &amp;quot;input_and_output&amp;quot; folder.&lt;br /&gt;
* Disable macro security if you don&#039;t want to have to click on the &amp;quot;Enable Content&amp;quot; button every time.&lt;br /&gt;
* Close other worksheets before you run the macro.&lt;br /&gt;
* If you are not afraid of VBA code, you can enter the dev environment by hitting Alt+F11. If you want to extend the attack library with more screenshots and settings, search for &amp;quot;LibraryThrows&amp;quot;, &amp;quot;LibraryAttack&amp;quot;, &amp;quot;Picture&amp;quot;, and &amp;quot;CBAttackHelp.AddItem&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Run animations===&lt;br /&gt;
Here&#039;s a breakdown of the Striker&#039;s run animations, meant as an illustration for what would be needed to make new run TRAMs.&lt;br /&gt;
&lt;br /&gt;
Run cancel:&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
* STRIKErun1stepa&lt;br /&gt;
* STRIKErun1stepb&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
&lt;br /&gt;
Run – &#039;&#039;a minimal cycle&#039;&#039;:&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
* STRIKErun1stepa&lt;br /&gt;
* STRIKErunstart&lt;br /&gt;
* STRIKErun_rt&lt;br /&gt;
* STRIKErun_lt (optional)&lt;br /&gt;
* STRIKErunstop&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
&lt;br /&gt;
Follow the images below from right to left.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:XML_TRAM_STRIKErunstop.png|STRIKErunstop&lt;br /&gt;
Image:XML_TRAM_STRIKErun_lt.png|STRIKErun_lt&lt;br /&gt;
Image:XML_TRAM_STRIKErun_rt.png|STRIKErun_rt&lt;br /&gt;
Image:XML_TRAM_STRIKErunstart.png|STRIKErunstart&lt;br /&gt;
Image:XML_TRAM_STRIKErun1stepa.png|STRIKErun1stepa&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of unused animations==&lt;br /&gt;
Here are all the known unused animations. These could be recycled in a new mod.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;From the original game&#039;&#039;&#039;&lt;br /&gt;
* KONOKOconsole_punch: What the name says (the engine can use that animation depending on the console&#039;s configuration, see [[OBD:BINA/OBJC/CONS|CONS]]) .&lt;br /&gt;
* KONOKOlev3_intro: Looks like she&#039;s placing something (bomb?) and then running away.&lt;br /&gt;
* KONOKOlev4_undress: From an aborted clothes-changing cutscene.&lt;br /&gt;
* KONOKOlev16_bomb: Planting a bomb.&lt;br /&gt;
* KONCOMsuper_kick: Now used in [[OTA]] as a spawn event, and by the fan-made character [[Shinatama Evolved]].&lt;br /&gt;
* KONCOMsuper_punch: KONCOMpunch_heavy but without the shouted attack name, has HalfDamage flag, and does 10 less damage in its first attack part.&lt;br /&gt;
* COMPISidle_special1: Comguy checking environment and his gun; meant for a feature that would visually depict an elevation in the AI&#039;s level of alertness after, say, hearing a noise.&lt;br /&gt;
* STRPISidle_special1: Striker checking his his gun and communicating with an ally (another unused alertness-elevation animation).&lt;br /&gt;
* THUGlev1_direct: Thug probably directing a truck driver.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;From modders&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Image:female_stun.jpg|right|thumb|Char A and Char B performing stun animations.]]&lt;br /&gt;
&lt;br /&gt;
* http://mods.oni2.net/node/376&lt;br /&gt;
** StrikerKneeStepKickThrow.zip&lt;br /&gt;
** REDCOMjump_fw_crouch--double_flip--dae.zip&lt;br /&gt;
** KONprone_getup--dae.zip&lt;br /&gt;
** KONRIF_k_bk_throw.zip&lt;br /&gt;
** female_stun--dae.zip&lt;br /&gt;
&lt;br /&gt;
==Special effects==&lt;br /&gt;
If the scene is overloaded by too many particles (including motion blur), these effects will cease being rendered. So don&#039;t overuse effects.&lt;br /&gt;
&lt;br /&gt;
===Color trails===&lt;br /&gt;
Open the XML-accompanied TRAM, search for the &amp;quot;Particles&amp;quot; tag, and insert your markup.&lt;br /&gt;
&lt;br /&gt;
First example: TRAMSTRCOMcomb_p_p.xml&lt;br /&gt;
&lt;br /&gt;
[[Image:Colorful_contrail_added.png|right|thumb]]&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Particles&amp;gt;&lt;br /&gt;
            &amp;lt;Particle&amp;gt;&lt;br /&gt;
                &amp;lt;StartFrame&amp;gt;0&amp;lt;/StartFrame&amp;gt;&lt;br /&gt;
                &amp;lt;EndFrame&amp;gt;12&amp;lt;/EndFrame&amp;gt;&lt;br /&gt;
                &amp;lt;Bone&amp;gt;LeftFist&amp;lt;/Bone&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;contrail&amp;lt;/Name&amp;gt;&lt;br /&gt;
            &amp;lt;/Particle&amp;gt;&lt;br /&gt;
        &amp;lt;/Particles&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;contrail&amp;quot; is looked up by the character class (ONCC) that emits the actual particle; here it is &amp;quot;h2h_strtrail_e01&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This second example is about creating two different contrails in a TRAM at the same time. The animation is &amp;quot;TRAMSTRCOMpunch_heavy.xml&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Different_contrails_in_attack.png|right|thumb]]&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Particles&amp;gt;&lt;br /&gt;
            &amp;lt;Particle&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;0&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;54&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Bone&amp;gt;RightWrist&amp;lt;/Bone&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;contrail&amp;lt;/Name&amp;gt;&lt;br /&gt;
            &amp;lt;/Particle&amp;gt;&lt;br /&gt;
            &amp;lt;Particle&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;0&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;54&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Bone&amp;gt;LeftWrist&amp;lt;/Bone&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;&#039;&#039;&#039;contrail_2&#039;&#039;&#039;&amp;lt;/Name&amp;gt;&lt;br /&gt;
            &amp;lt;/Particle&amp;gt;&lt;br /&gt;
        &amp;lt;/Particles&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that you need to register the second contrail in the ONCC as well. Using your own contrail particle is also possible; just insert its name between the &amp;lt;Type&amp;gt; tags.&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;ONCPParticle&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;contrail&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Type&amp;gt;h2h_strtrail_e01&amp;lt;/Type&amp;gt;&lt;br /&gt;
                &amp;lt;BodyPart&amp;gt;-1&amp;lt;/BodyPart&amp;gt;&lt;br /&gt;
            &amp;lt;/ONCPParticle&amp;gt;&lt;br /&gt;
            &amp;lt;ONCPParticle&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;&#039;&#039;&#039;contrail_2&#039;&#039;&#039;&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Type&amp;gt;&#039;&#039;&#039;h2h_murtrail_e01&#039;&#039;&#039;&amp;lt;/Type&amp;gt;&lt;br /&gt;
                &amp;lt;BodyPart&amp;gt;-1&amp;lt;/BodyPart&amp;gt;&lt;br /&gt;
            &amp;lt;/ONCPParticle&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Motion blur===&lt;br /&gt;
[[Image:XML_TRAM_willow_kick_with_motion_blur.jpg|thumb|200px]]&lt;br /&gt;
Motion blur in Oni works much like ghosting/onion skinning features in any animation software: In the frame range specified by &amp;lt;Start&amp;gt; and &amp;lt;End&amp;gt; an additional instance of body parts specified in &amp;lt;Bones&amp;gt; are rendered for additional extra frames specified by &amp;lt;Lifetime&amp;gt;, with transparency set by &amp;lt;Alpha&amp;gt;, and every &amp;lt;Interval&amp;gt; frames within the frame range.&lt;br /&gt;
Example snippet from KONCOMcomb_p_p_k:&lt;br /&gt;
        &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
            &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;RightThigh RightCalf RightFoot&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;20&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;28&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Lifetime&amp;gt;4&amp;lt;/Lifetime&amp;gt;&lt;br /&gt;
                &amp;lt;Alpha&amp;gt;127&amp;lt;/Alpha&amp;gt;&lt;br /&gt;
                &amp;lt;Interval&amp;gt;1&amp;lt;/Interval&amp;gt;&lt;br /&gt;
            &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
        &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The one noteworthy thing is that you can have multiple motion blur sequences. If you wanted to add an extra motion blur to the above animation, you could do something like this:&lt;br /&gt;
        &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
            &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;LeftThigh LeftCalf LeftFoot&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;10&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;18&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Lifetime&amp;gt;4&amp;lt;/Lifetime&amp;gt;&lt;br /&gt;
                &amp;lt;Alpha&amp;gt;127&amp;lt;/Alpha&amp;gt;&lt;br /&gt;
                &amp;lt;Interval&amp;gt;1&amp;lt;/Interval&amp;gt;&lt;br /&gt;
            &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
            &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;RightThigh RightCalf RightFoot&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;20&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;28&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Lifetime&amp;gt;4&amp;lt;/Lifetime&amp;gt;&lt;br /&gt;
                &amp;lt;Alpha&amp;gt;127&amp;lt;/Alpha&amp;gt;&lt;br /&gt;
                &amp;lt;Interval&amp;gt;1&amp;lt;/Interval&amp;gt;&lt;br /&gt;
            &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
        &amp;lt;/MotionBlur&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Impact effect===&lt;br /&gt;
[[Image:XML_TRAM_KONCOMkick_fw_with_ninflash1.jpg|thumb|200px]]&lt;br /&gt;
&lt;br /&gt;
See also [[XML:ONCC]].&lt;br /&gt;
&lt;br /&gt;
{{XML}}&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=XML:TRAM&amp;diff=41211</id>
		<title>XML:TRAM</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=XML:TRAM&amp;diff=41211"/>
		<updated>2023-10-08T12:34:45Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* List of tags, types, and flags */ Explained motion blur tags based on info in https://wiki.oni2.net/OBD:TRAM/raw0x1C&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{XML_File_Header | prev=TRAC | type=TRAM | next=TRAS | name=Totoro Animation}}&lt;br /&gt;
{{update}}&lt;br /&gt;
{{TOCfloat|side=right}}&lt;br /&gt;
==General information==&lt;br /&gt;
TRAM files — animation data for characters — are basically made of three chunks:&lt;br /&gt;
* Metadata or &amp;quot;header&amp;quot;: animation type, state, flags, particle, sounds, etc.&lt;br /&gt;
* Animation data: &#039;&#039;&#039;pelvis heights, pelvis velocities (root motion)&#039;&#039;&#039;, bone rotations&lt;br /&gt;
* Attack data: damage, self-damage, extents (danger zones for AI awareness) and throws&lt;br /&gt;
&lt;br /&gt;
Root motion: a character moves by changing the position of its root bone (pelvis). The animated legs just create the &#039;&#039;&#039;illusion for the player&#039;&#039;&#039; that they are responsible for the motion.&lt;br /&gt;
&lt;br /&gt;
Bones: Each character has &#039;&#039;&#039;19 separate body parts&#039;&#039;&#039; which get animated (rotated) relative to each other. Compared to modern games Oni&#039;s bone system is [[wp:Deprecation|deprecated]]. The body doesn&#039;t get deformed by following animated bones. Oni modders often use the terms mesh and bone interchangeably. Only the pelvis has &#039;&#039;&#039;translation&#039;&#039;&#039; data (heights and velocities) besides rotations. The hierarchy of the body parts (or bones) is determined by [[XML:TRBS#Standard_TRIA_hierarchy|TRIA]].&lt;br /&gt;
&lt;br /&gt;
The term &#039;&#039;&#039;animation&#039;&#039;&#039; is often shortened to &#039;&#039;&#039;anim&#039;&#039;&#039; by modders, following the naming of commands in BSL: chr_wait_animstate, chr_wait_animtype, env_anim, etc.&lt;br /&gt;
&lt;br /&gt;
TRAMs used in Oni follow a naming pattern. A list of all combat TRAMs in-game and their naming can be found [[Combat moves|here.]]&lt;br /&gt;
&lt;br /&gt;
==Decision path of animation lookup==&lt;br /&gt;
* First the game builds a pool of anims a character can use. They are loaded from the TRAC file registered in [[ONCC]], including parent TRACs.&lt;br /&gt;
* Anims from a child TRAC override those of the parent if their combination of state, type and variant is exactly the same.&lt;br /&gt;
* Child TRACs usually omit some anims. For example, Elite Strikers don&#039;t have their own run anims, so they use the parent anims of normal Strikers. See [[XML:TRAC|TRAC]] page for details.&lt;br /&gt;
* A character always possesses a single animation state. This term derives from state machines, but you only need to know that states are the first point in the decision path determining what anims are actually allowed to play at a given moment.&lt;br /&gt;
* Here is the full decision path:&lt;br /&gt;
** anim &#039;&#039;&#039;state&#039;&#039;&#039; check&lt;br /&gt;
** event (user input, or engine input for the AI) -&amp;gt; [[XML_talk:StNA|context check]] -&amp;gt; anim &#039;&#039;&#039;type&#039;&#039;&#039; check&lt;br /&gt;
** anim &#039;&#039;&#039;variant&#039;&#039;&#039; check&lt;br /&gt;
** TRAC &#039;&#039;&#039;weight&#039;&#039;&#039; check&lt;br /&gt;
&lt;br /&gt;
Detailed example: Let&#039;s say that we shapeshifted to a Ninja ONCC, we are in the state Standing, and we hit the action key to perform a taunt. The engine recognizes the context (a hostile character to interact with) and looks up anims of type Taunt. Since we are in combat mode, the next anim must be of variant Combat if possible. These lookups boil down to two valid possible anims: NINCOMtaunt1 and NINCOMtaunt2. If there are multiple anims available at this point, the engine picks one of them randomly.&lt;br /&gt;
&lt;br /&gt;
However, NINCOMtaunt1 has a TRAC Weight (probability) of 100 while NINCOMtaunt2 has a TRAC Weight value of just 5. So the chances are quite high that we will not see the Moon Walk taunt.&lt;br /&gt;
&lt;br /&gt;
Keep in mind that if the engine cannot find an anim of a specific variant, it will fall back to a non-variant anim instead.&lt;br /&gt;
&lt;br /&gt;
Confused by how Weights work? Apparently, the Weight value is only one part of the equation — otherwise NINCOMtaunt2 would never execute. If there is only one anim to choose from, it will always play no matter what its Weight, even if it is zero. When it comes to multiple anims being a valid choice, the calculation seems to be: weight / sum of all weights. For NINCOMtaunt2, this means 5 / 105 = 0.047 (4.7%).&lt;br /&gt;
&lt;br /&gt;
==List of tags, types, and flags==&lt;br /&gt;
Use the search function in your browser to quickly find a tag.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=100%&lt;br /&gt;
|width=120px| &#039;&#039;&#039;tag&#039;&#039;&#039;&lt;br /&gt;
|width=100px| &#039;&#039;&#039;type&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Lookup&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Type&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_types|HERE]]. The pool of valid TRAMs (animations a character can choose from) is built from the TRAC files registered in the ONCC. Most of the anim types are connected to player inputs.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;AimingType&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_types|HERE]]. The pool of valid TRAMs, and therefore TRASs (aiming screens a character can choose from) is built from the TRSC files registered in the ONCC.&lt;br /&gt;
:&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;FromState&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
| [[Image:chr_debug_characters_shows_interpolated_animations.jpg|thumb|400px|right|Primary &amp;lt;FromState&amp;gt; in &amp;lt;Lookup&amp;gt; uses about 8 interpolating frames by default. Use Shortcut&#039;s &amp;lt;FromState&amp;gt; to override this frame number.]]&lt;br /&gt;
&lt;br /&gt;
Look them up over [[XML:StNA#Animation_states|HERE]].&lt;br /&gt;
: When FromState is set to None, some default behaviors are ignored and are replaced by Shortcuts.&lt;br /&gt;
: Shortcuts extend the number of states from which an animation can be played and under what conditions (replacing this atomic yes/no).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ToState&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_states|HERE]].&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Varient&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|(misspelled because Oni misspells it) If unused, the tag will simply be &amp;quot;&amp;lt;Varient /&amp;gt;&amp;quot;, such as for non-combat animations. Otherwise it contains one of these values:&lt;br /&gt;
: Combat&lt;br /&gt;
: LeftPistol&lt;br /&gt;
: LeftRifle&lt;br /&gt;
: Panic&lt;br /&gt;
: RightPistol&lt;br /&gt;
: RightRifle&lt;br /&gt;
: Sprint&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;FirstLevel&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|Number of first level in which move becomes available to the player (&amp;quot;0&amp;quot; to make it available from the start).&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Shortcuts&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
|&lt;br /&gt;
Works as an &#039;&#039;&#039;alternative FromState&#039;&#039;&#039; collection.&lt;br /&gt;
&lt;br /&gt;
Shortcuts are accepted if their &amp;lt;Shortcut&amp;gt;&amp;lt;FromState&amp;gt; value differs from the &amp;quot;primary&amp;quot; &amp;lt;Lookup&amp;gt;&amp;lt;FromState&amp;gt; value. In other words, if you want to make a &#039;&#039;&#039;Shortcut&#039;&#039;&#039; that uses the &#039;&#039;&#039;same FromState&#039;&#039;&#039; value then you have to set &#039;&#039;&#039;primary FromState&#039;&#039;&#039; value to &#039;&#039;&#039;None&#039;&#039;&#039;. By doing that, the hardcoded interpolation frame length of about 8 frames can be overridden.&lt;br /&gt;
&lt;br /&gt;
In the following example, the new interpolation length is 0. This will require the animation to match perfectly with the previous one. For a smooth transition to the next animation, set a suitable value at &amp;lt;Interpolation&amp;gt;&amp;lt;End&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Lookup&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
            &amp;lt;FromState&amp;gt;None&amp;lt;/FromState&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
            &amp;lt;Shortcuts&amp;gt;&lt;br /&gt;
                &amp;lt;Shortcut&amp;gt;&lt;br /&gt;
                    &amp;lt;FromState&amp;gt;Standing&amp;lt;/FromState&amp;gt;&lt;br /&gt;
                    &amp;lt;Length&amp;gt;0&amp;lt;/Length&amp;gt;&lt;br /&gt;
                    &amp;lt;ReplaceAtomic&amp;gt;no&amp;lt;/ReplaceAtomic&amp;gt;&lt;br /&gt;
                &amp;lt;/Shortcut&amp;gt;&lt;br /&gt;
            &amp;lt;/Shortcuts&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:TRAM interpolation - standard case.jpg|thumb|400px|left|Scenario A: hardcoded interpolation of 8 frames. Scenario B: changeable interpolation frame number.]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Shortcut&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;FromState&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Look them up over [[XML:StNA#Animation_types|HERE]].&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Length&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int16&lt;br /&gt;
|Amount of interpolating frames. While interpolations of rotation are less noticeable, interpolations of different positions can cause drift (i.e. sliding).&lt;br /&gt;
&lt;br /&gt;
This is especially observed for transitions from idle to movements and vice versa — basically any combination of animations with different accelerations at start and end. By default, animations without specified Shortcut interpolation give about 8 frames of interpolation. For moves starting or ending in idle, it&#039;s better not to use interpolation. Just give the start and end frames the same positions and rotation values as the idle. Interpolations should always be considered a &#039;&#039;last resort&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
This drift can be observed even in vanilla animations — most prominently in Konoko&#039;s comb_k. Konoko&#039;s left foot should be in a fixed position as the animation starts from from Konoko&#039;s idle pose. However, the interpolation is causing her left foot to drift noticeably to the right and a bit forward.&lt;br /&gt;
&lt;br /&gt;
The reason this happens is because the interpolation &amp;quot;mixes&amp;quot; two animations. When one animation transitions into another via interpolation, part of the animation system continues playing the initial animation, and part of it is playing the follow-up animation, with all the rotations and positions getting linearly interpolated.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;ReplaceAtomic&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: yes&lt;br /&gt;
: no&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Flags&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|These are top-level flags on the whole animation. See the other &amp;lt;Flags&amp;gt; for flags on an attack part.&lt;br /&gt;
:RuntimeLoaded&lt;br /&gt;
::(This bit is not stored on disk; it is used at runtime to mark that the animation was loaded.)&lt;br /&gt;
:Invulnerable&lt;br /&gt;
::While playing this animation, the player is invulnerable to melee damage and also cannot be thrown. Damage from particles and fall damage still hurt.&lt;br /&gt;
:BlockHigh&lt;br /&gt;
::While playing this animation, the player is invulnerable to high or undefined attacks within some arc in front of him. If you set this flag on an animation where the player character is spinning, then the character can still be kicked in the back or thrown.&lt;br /&gt;
:BlockLow&lt;br /&gt;
::Same as above, only it can block low or undefined attacks.&lt;br /&gt;
:Attack&lt;br /&gt;
::Animations with an attack part have this turned on. It&#039;s unclear what it does, but it may enable the melee soft-lock (where the character turns a bit during the animation to face a nearby enemy).&lt;br /&gt;
:DropWeapon&lt;br /&gt;
::If the player is armed, he drops his weapon when this animation plays.&lt;br /&gt;
:InAir&lt;br /&gt;
::Something to do with jumps; not investigated.&lt;br /&gt;
:Atomic&lt;br /&gt;
::The whole animation must be played; player cannot interrupt it once it starts.&lt;br /&gt;
:NoTurn&lt;br /&gt;
:::Player cannot turn by mouse while performing this animation.&lt;br /&gt;
:AttackForward&lt;br /&gt;
::Unknown, but it looks like this is a hint for the AI about where an attack is aiming, from the player&#039;s point of view.&lt;br /&gt;
:AttackLeft&lt;br /&gt;
::Same as above.&lt;br /&gt;
:AttackRight&lt;br /&gt;
::Same as above.&lt;br /&gt;
:AttackBackward&lt;br /&gt;
::Same as above.&lt;br /&gt;
:Overlay&lt;br /&gt;
::Not a standalone animation; it just overwrites part of an already-playing one, e.g. the weapon-holstering animation.&lt;br /&gt;
:DontInterpolateVelocity&lt;br /&gt;
::Unknown, but maybe it has something to do with {x,y,z} velocities and the fact that directional jumps, for example, take information about their direction vector from the {x,z} velocity part of the TRAM (the vertical Y component is in the ONCC).&lt;br /&gt;
:ThrowSource&lt;br /&gt;
::Unknown, but throws use it.&lt;br /&gt;
::: Probably a developer relic. Throws work in animation pairs: whenever a throw source is played, the other character must perform the throw target animation. See throw(n) types:&lt;br /&gt;
:::: TRAM &amp;lt;TargetType&amp;gt;&lt;br /&gt;
:::: [[XML:StNA#Animation_types|StNA]] (First &amp;lt;u&amp;gt;used&amp;lt;/u&amp;gt; throw starts at #96.)&lt;br /&gt;
::: Characters have only their own pool of animations available. And since enemy&#039;s TRAC might not contain the necessary animation the information must be provided by the throw source TRAC. &lt;br /&gt;
::: Since every throw animation must have a throw animation type the ThrowSource flag is actually redundant.&lt;br /&gt;
:ThrowTarget&lt;br /&gt;
::Animation can hurt anybody with its attack part, including teammates. The player can even hurt himself with the TRAM&#039;s damage part (whereas a player cannot hurt himself with his own animation&#039;s attack part). It also allows two attack parts to be executed instead of only one (maybe a bug? more than two will result in a crash).&lt;br /&gt;
:::If you set the first attack part to be able to deal damage from the 1st to the 100th frame of the TRAM, and the second attack part to deal damage within that range (e.g. from the 25th to the 41st frame), then the first attack part will deal damage from the 1st to the 100th frame (as usual), but even if it hits, that second attack part can hurt the enemy as well during frames 25–41. Note that the second attack part must be executed within the first attack part&#039;s active &amp;quot;window&amp;quot;, otherwise it won&#039;t work.&lt;br /&gt;
:RealWorld&lt;br /&gt;
::It appears this flag was used to create a TRAM and an OBAN from one animation source. The OBAN is supposed to store pelvis rotations and positions, allowing a character to move over obstacles/gaps. The vast majority of them are used in cutscenes.&lt;br /&gt;
:DoAim&lt;br /&gt;
::Applies the aiming animation overlay (PIS/RIF) if the player has a weapon.&lt;br /&gt;
:DontAim&lt;br /&gt;
::An aiming overlay will not be applied.&lt;br /&gt;
:CanPickup&lt;br /&gt;
::Player can pick up an item during this animation if he intersects with one during his movement.&lt;br /&gt;
:Aim360&lt;br /&gt;
::Unknown.&lt;br /&gt;
:DisableShield&lt;br /&gt;
::If the player has an active supershield (chr_super &amp;quot;name&amp;quot; 1), this forces him to disable it (chr_super &amp;quot;name&amp;quot; 0)&lt;br /&gt;
:NoAIPickup&lt;br /&gt;
::AIs are not permitted to pick up items with this animation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Atomic&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Makes animation particle atomic?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Invulnerable&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Character will not take melee damage during a time frame defined by the Start and End frames.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| First frame of character being invulnerable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Last frame of character being invulnerable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Overlay&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;UsedBones&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|Simply contains &amp;quot;&amp;lt;UsedBones /&amp;gt;&amp;quot; if no bones are involved, otherwise:&lt;br /&gt;
:Pelvis&lt;br /&gt;
:LeftThigh&lt;br /&gt;
:LeftCalf&lt;br /&gt;
:LeftFoot&lt;br /&gt;
:RightThigh&lt;br /&gt;
:RightCalf&lt;br /&gt;
:RightFoot&lt;br /&gt;
:Mid&lt;br /&gt;
:Chest&lt;br /&gt;
:Neck&lt;br /&gt;
:Head&lt;br /&gt;
:LeftShoulder&lt;br /&gt;
:LeftArm&lt;br /&gt;
:LeftWrist&lt;br /&gt;
:LeftFist&lt;br /&gt;
:RightShoulder&lt;br /&gt;
:RightArm&lt;br /&gt;
:RightFist&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;ReplacedBones&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
| &amp;quot;&amp;lt;ReplacedBones /&amp;gt;&amp;quot; if unused, otherwise:&lt;br /&gt;
:Pelvis&lt;br /&gt;
:LeftThigh&lt;br /&gt;
:LeftCalf&lt;br /&gt;
:LeftFoot&lt;br /&gt;
:RightThigh&lt;br /&gt;
:RightCalf&lt;br /&gt;
:RightFoot&lt;br /&gt;
:Mid&lt;br /&gt;
:Chest&lt;br /&gt;
:Neck&lt;br /&gt;
:Head&lt;br /&gt;
:LeftShoulder&lt;br /&gt;
:LeftArm&lt;br /&gt;
:LeftWrist&lt;br /&gt;
:LeftFist&lt;br /&gt;
:RightShoulder&lt;br /&gt;
:RightArm&lt;br /&gt;
:RightFist&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;DirectAnimations&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Link&amp;gt;&lt;br /&gt;
| link&lt;br /&gt;
| First slot. &amp;quot;&amp;lt;Link /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Link&amp;gt;&lt;br /&gt;
| link&lt;br /&gt;
| Second slot. &amp;quot;&amp;lt;Link /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Pause&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Hard&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| In ticks. The Hard and Soft pause values are ignored if this animation has a direct link (above) to another animation.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Soft&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int16&lt;br /&gt;
| In ticks. As mentioned above, the player cannot enter new inputs during this pause unless this animation is part of a combo animation defined by &amp;lt;DirectAnimations&amp;gt;&amp;lt;Link&amp;gt;.&lt;br /&gt;
: Examples:&lt;br /&gt;
: COMcomb_p, (no pause) COMcomb_p_p&lt;br /&gt;
: COMcomb_p, (pause) COMcomb_k&lt;br /&gt;
&lt;br /&gt;
The difference between the hard and soft pause is that you can block during the soft pause and not the hard pause.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Interpolation&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;End&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int16&lt;br /&gt;
|&lt;br /&gt;
* interpolates first X frames of next animation&lt;br /&gt;
* if the first follow-up animation is too short, it can continue to play even further (not observed with vanilla anims)&lt;br /&gt;
&lt;br /&gt;
While interpolations with rotations are less noticeable, interpolations of different positions can cause an additional drift.&lt;br /&gt;
&lt;br /&gt;
This was especially observed for transitions of idle to movements and vice versa — basically any combination of animations with different accelerations at the start and end. By default, animations without a specified Shortcut interpolation get about 8 frames of interpolation. For moves starting or ending in idle, it&#039;s better not to use interpolation. Just give the start and end frames the same positions and rotation values as the idle. Interpolations should always be considered a &#039;&#039;last resort&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:TRAM interpolations - end interpolation bigger than next anim.jpg|thumb|400px|left|&amp;quot;End&amp;quot; interpolation covering multiple follow-up animations.]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Max&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| unused&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;FinalRotation&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| float&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| Ending rotation in degrees. (During an animation, the camera is detached rotation-wise. If this value matches the body&#039;s final rotation, it will prevent a &amp;quot;glitchy&amp;quot; re-attaching.)&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Direction&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
| Used by [[AI#Melee_combat_behaviors|AI melee system]].&lt;br /&gt;
:None&lt;br /&gt;
:Forward&lt;br /&gt;
:Backward&lt;br /&gt;
:Left&lt;br /&gt;
:Right&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Vocalization&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| ID of one of the [[XML:SNDD#Step_1:_Preparing_the_TRAM|SoundConstants in ONCC]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ActionFrame&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Frame number for any special events associated with this animation: weapon theft via disarm, weapon holstering, Mukade teleporting, items getting handed over to player, etc.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Impact&amp;gt;&lt;br /&gt;
| link&lt;br /&gt;
| &amp;quot;&amp;lt;Impact /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Particles&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
| serves as group element&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Particle&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
| holds individual particle data&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Start&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int&lt;br /&gt;
| frame number for particle to start&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;End&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int&lt;br /&gt;
| frame number for particle to end (if the number exceeds frame count of animation, the particle will simply die at the end of the animation)&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Bone&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: Pelvis &lt;br /&gt;
: LeftThigh &lt;br /&gt;
: LeftCalf &lt;br /&gt;
: LeftFoot &lt;br /&gt;
: RightThigh &lt;br /&gt;
: RightCalf &lt;br /&gt;
: RightFoot &lt;br /&gt;
: Mid &lt;br /&gt;
: Chest &lt;br /&gt;
: Neck &lt;br /&gt;
: Head &lt;br /&gt;
: LeftShoulder &lt;br /&gt;
: LeftArm &lt;br /&gt;
: LeftWrist &lt;br /&gt;
: LeftFist &lt;br /&gt;
: RightShoulder &lt;br /&gt;
: RightArm &lt;br /&gt;
: RightFist&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Name&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| link&lt;br /&gt;
| particle name in [[XML:ONCC#ONCP:_Oni_Character_Particle_.28Array.29|ONCC-ONCP]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MotionBlur&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| sequence element&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Bones&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: Pelvis &lt;br /&gt;
: LeftThigh &lt;br /&gt;
: LeftCalf &lt;br /&gt;
: LeftFoot &lt;br /&gt;
: RightThigh &lt;br /&gt;
: RightCalf &lt;br /&gt;
: RightFoot &lt;br /&gt;
: Mid &lt;br /&gt;
: Chest &lt;br /&gt;
: Neck &lt;br /&gt;
: Head &lt;br /&gt;
: LeftShoulder &lt;br /&gt;
: LeftArm &lt;br /&gt;
: LeftWrist &lt;br /&gt;
: LeftFist &lt;br /&gt;
: RightShoulder &lt;br /&gt;
: RightArm &lt;br /&gt;
: RightFist&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Start frame of motion blur sequence&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| End frame of motion blur sequence&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Lifetime&amp;gt;&lt;br /&gt;
| int8&lt;br /&gt;
| Lifetime of each &amp;quot;ghost&amp;quot; in frames. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Alpha&amp;gt;&lt;br /&gt;
| int8&lt;br /&gt;
| Transparency of &amp;quot;ghosts&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Interval&amp;gt;&lt;br /&gt;
| int8&lt;br /&gt;
| Frame interval between each rendered &amp;quot;ghost&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Footsteps&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Footstep&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Type&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|&lt;br /&gt;
: Left&lt;br /&gt;
: Right&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Sounds&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &amp;quot;&amp;lt;Sounds /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Sound&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Name&amp;gt;&lt;br /&gt;
| char[32]&lt;br /&gt;
| &amp;lt;font color=&amp;quot;#777777&amp;quot;&amp;gt;OSBD&amp;lt;/font&amp;gt;file&amp;lt;font color=&amp;quot;#777777&amp;quot;&amp;gt;.imp.oni&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#777777&amp;quot;&amp;gt;(don&#039;t use resource type&#039;s prefix or suffix)&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|The frame when the sound starts to play.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Heights&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Height&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
|Absolute position.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Velocities&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Velocity&amp;gt;&lt;br /&gt;
| 2 x float&lt;br /&gt;
|Relative positions (delta values); the numbers represent the change in position from one frame to another.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Rotations&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Bone&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|There are 19 bone tags, one for each [[TRIA#Bones|body part]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;EKey&amp;gt;&lt;br /&gt;
| int8 + 3 * float&lt;br /&gt;
|For normal animations. The first value is the number of frames for which the rotation is maintained; the sum of all of these first EKey components always equals the total number of frames for the animation.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;QKey&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| int8 + 4 * float&lt;br /&gt;
|For overlay animations used by [[TRAS|TRAS]] aiming screens.&lt;br /&gt;
&lt;br /&gt;
OniSplit v0.9.54.0 produces &amp;lt;QKey&amp;gt;s (quaternions) instead of &amp;lt;EKey&amp;gt;s (Euler rotations) for normal animations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;PositionOffset&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &amp;lt;PositionOffset&amp;gt; and &amp;lt;Positions&amp;gt; belong together. In the [[OBD:TRAM/raw0x30|binaries]], they are written in place. &#039;&#039;&#039;Seems unused; changing them has no effect in-game.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;X&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Z&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Positions&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Position&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| seems to be unused (and when checking this with &amp;quot;chr_debug_sphere = 1&amp;quot;, the spheres remain unchanged)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Height&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| vertical extent&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;YOffset&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| Y offset of the vertical extent from character location &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ThrowSource&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| &amp;quot;&amp;lt;ThrowSource /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;TargetAdjustment&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Used to position targets during throws, relative to the position of the character executing the throw.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Position&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| 3 * float&lt;br /&gt;
| Contains XYZ values, which position the target character:&lt;br /&gt;
*X - Side axis. Negative values move the target to the right and positive values move the target to the left.&lt;br /&gt;
*Y - Height axis. Negative values move the target downwards, but cannot make the target go below the floor. Positive values make the target go upwards — if the value is too big, the target will teleport upward and then immediately start falling, interrupting the target animation.&lt;br /&gt;
*Z - Forward axis. Negative values move the target backwards and positive values move the target forward.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Angle&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| In radians - adjusts the rotation of the target in Oni&#039;s Y axis; most of the time (if not always) it&#039;s set to &#039;&#039;3.14159274&#039;&#039; radians in vanilla anims, equaling 180 degrees - which effectively rotates the rotates by those 180 degrees; if it was set to 0, the target would face the throw source character with his back.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Distance&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| Activation distance. The throw can be triggered if it is within this range. However the value must be greater than the equivalent TRAM in the parent TRAC.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;TargetType&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
| The flags are part of the [[XML:StNA#Animation_types|animation type list]].&lt;br /&gt;
&lt;br /&gt;
(static throws)&lt;br /&gt;
: Thrown1 = ###COMthrow_fw_p_tgt&lt;br /&gt;
: Thrown2 = ###COMthrow_fw_k_tgt&lt;br /&gt;
: Thrown3 = ###COMthrow_bk_p_tgt&lt;br /&gt;
: Thrown4 = ###COMthrow_bk_k_tgt&lt;br /&gt;
(running throws)&lt;br /&gt;
: Thrown5 = ###COMrun_throw_fw_p_tgt&lt;br /&gt;
: Thrown6 = ###COMrun_throw_fw_p_tgt&lt;br /&gt;
: Thrown7 = ###COMrun_throw_bk_k_tgt&lt;br /&gt;
: Thrown8 = ###COMrun_throw_bk_k_tgt (not tested)&lt;br /&gt;
(tackle throw = catching)&lt;br /&gt;
: Thrown9 = ###COMrun_tkl_fw_p_tgt (not tested)&lt;br /&gt;
: Thrown10 = ###COMrun_tkl_bk_p_tgt&lt;br /&gt;
(pistol disarms)&lt;br /&gt;
: Thrown11 = ###PISthrow_fw_p_tgt&lt;br /&gt;
: Thrown12 = ###PISthrow_fw_k_tgt&lt;br /&gt;
: Thrown13 = ###PISthrow_bk_p_tgt&lt;br /&gt;
(rifle disarm)&lt;br /&gt;
: Thrown14 = ###PISthrow_bk_k_tgt (not tested)&lt;br /&gt;
: Thrown15 = ###RIFthrow_fw_p_tgt&lt;br /&gt;
: Thrown16 = ###RIFthrow_bk_p_tgt&lt;br /&gt;
: Thrown17 = ###RIF? = (not tested)&lt;br /&gt;
----&lt;br /&gt;
About the naming:&lt;br /&gt;
: &amp;quot;fw&amp;quot; = face-to-face throw&lt;br /&gt;
: &amp;quot;bk&amp;quot; = thrower is facing victim&#039;s back&lt;br /&gt;
: &amp;quot;throw&amp;quot; inside TRAM names is sometimes shortened to &amp;quot;thr&amp;quot;&lt;br /&gt;
: &amp;quot;p&amp;quot;/&amp;quot;k&amp;quot; = triggered by punch or kick button (&amp;quot;p&amp;quot; is sometimes omitted)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;SelfDamage&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&amp;quot;&amp;lt;SelfDamage /&amp;gt;&amp;quot; if unused.&lt;br /&gt;
&lt;br /&gt;
Works only with specific, hardcoded AnimTypes (mainly ThrownX, it&#039;s unknown if any other types work - that remains to be investigated). Using SelfDamage on an AnimType that wasn&#039;t intended for it will cause the game to crash. (ToDo: Checked if &amp;lt;Flag&amp;gt;ThrowTarget is enough to explain this. Modify a simple kick? For more please link to and use talk page.)&lt;br /&gt;
&lt;br /&gt;
From a practical standpoint, this means SelfDamage can be used only on ThrowTarget animations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Damage&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| sequence element&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Points&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Damage taken by character.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Frame&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Frame of the animation when damage is dealt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Attacks&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Attack&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| parent tag&lt;br /&gt;
| Only 2 attack parts per file are allowed. Normally the target gets only one hit. But if the attack frame ranges of both attack parts are overlapping, then the target can be [http://oni.bungie.org/forum/viewtopic.php?pid=39787#p39787 hit by both of them].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Start&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| First frame where damage can be inflicted on an opponent.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;End&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Last frame where damage can be inflicted on an opponent.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Bones&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| The bones which can inflict damage.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Flags&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| flag&lt;br /&gt;
|These are flags on an attack part, inside an &amp;lt;Attacks&amp;gt;&amp;lt;Attack&amp;gt; element. See the previous &amp;lt;Flags&amp;gt; for general flags on the TRAM.&lt;br /&gt;
: Unblockable&lt;br /&gt;
: Low - Target of attack needs to crouch in order to block this attack.&lt;br /&gt;
: High - Blocker needs to stand; if both Low and High are set, blocker can block from both standing and crouching positions.&lt;br /&gt;
: HalfDamage - Blocker receives half of the normal damage.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Knockback&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| Target gets knocked back by this amount.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;HitPoints&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Damage points inflicted by attack.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;HitType&amp;gt;&lt;br /&gt;
| flag&lt;br /&gt;
| Animation type for opponent&#039;s animation when the attack isn&#039;t blocked. The flags are part of the [[XML:StNA#Animation_types|animation type list]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;HitLength&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Number of frames that the target should remain in his hit animation state when he gets hit.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;StunLength&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Number of frames that the target should remain in his blocking animation state when he blocks the attack.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;StaggerLength&amp;gt;&lt;br /&gt;
| int16&lt;br /&gt;
| Number of frames that the target should perform his stagger animation after a successful block.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Extents&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| Explained below. Automatically calculated by OniSplit if there&#039;s a DAE file referenced in the XML.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Extent&amp;gt;&lt;br /&gt;
| parent tag&lt;br /&gt;
| One tag per attack frame. Number of &amp;lt;Extent&amp;gt; tags = &amp;lt;Attack&amp;gt;&amp;lt;End&amp;gt; - &amp;lt;Attack&amp;gt;&amp;lt;Start&amp;gt; + 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Angle&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| In degrees.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Length&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MinY&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;MaxY&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;AttackRing&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|  parent tag&lt;br /&gt;
| Always contains 36 &amp;lt;Length&amp;gt; tags, explained below. Automatically calculated by OniSplit if there&#039;s a DAE file referenced in the XML. (AttackRing was formerly known as &amp;quot;horizontal extents&amp;quot; in older versions of OniSplit.)&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;Length&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| float&lt;br /&gt;
| Horizontal extents, explained below. They create a &amp;quot;danger zone&amp;quot; around the attacker which the AI uses to try to dodge an attack.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Export==&lt;br /&gt;
TRAM files can be extracted &#039;&#039;&#039;A) as pure XML&#039;&#039;&#039; files or &#039;&#039;&#039;B) as a pair of XML and DAE&#039;&#039;&#039; files. For editing the actual animation, you will want to use method B. While exporting an ONCC, you might see errors such as:&lt;br /&gt;
&lt;br /&gt;
 Cannot find instance &#039;TRAMKONCOMthrow_rev&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONCOMthrow_rev&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONRIFturn_right&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONOKOlev18_ZomStand&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONOKOcorner_hide&#039;&lt;br /&gt;
 Cannot find instance &#039;TRAMKONPIScorner_hide&#039;&lt;br /&gt;
&lt;br /&gt;
Ignore them, as those files doesn&#039;t exist. (Someday we should remove them from the TRACs.)&lt;br /&gt;
&lt;br /&gt;
===Via command line===&lt;br /&gt;
To export a single TRAM:&lt;br /&gt;
 onisplit -extract:xml output_path -anim-body:path_to\TRBS_or_ONCCname.oni path_to\TRAMname.oni&lt;br /&gt;
&lt;br /&gt;
To export merged TRAMs:&lt;br /&gt;
 onisplit -extract:xml output_path &#039;&#039;&#039;-anim-merge&#039;&#039;&#039; -anim-body:path_to\TRBS_or_ONCCname.oni path_to\TRAMname1.oni  path_to\TRAMnameN.oni&lt;br /&gt;
&lt;br /&gt;
===Via Vago===&lt;br /&gt;
[[Image:Vago_xml_plus_dae_extraction.png|thumb|200px|right|Combined extraction of DAE and XML.]]&lt;br /&gt;
&lt;br /&gt;
Change to Characters tab and follow these steps.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 1:&#039;&#039;&#039; Select &amp;quot;TRAM ONI&amp;quot; as input format (&amp;quot;From&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 2:&#039;&#039;&#039; Select &amp;quot;XML / XML &amp;amp; DAE&amp;quot; as output format (&amp;quot;To&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 3:&#039;&#039;&#039; Tick checkbox &amp;quot;Extract with TRBS / ONCC&amp;quot;. It&#039;s important this is done before adding a TRAM file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 4:&#039;&#039;&#039; Set full path of ONCC or TRBS.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 5:&#039;&#039;&#039; Add TRAM file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 6:&#039;&#039;&#039; Click &amp;quot;Convert&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Via Simple OniSplit GUI===&lt;br /&gt;
There was a long-standing problem with combined ONCC/TRAM files where the textures would be missing.&amp;lt;!--[Iritscen: I don&#039;t understand this sentence; is it important to keep this historical note?] With an older method you couldn&#039;t export non-native TRAM which meant to the TRAM had to be registered in the TRAC the ONCC is using.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.paradox.oni2.net/programs/Simple_OniSplit_GUI.zip Simple OniSplit GUI]&#039;&#039;&#039; post-edits the DAE to fix missing textures. The character-related .oni files must be all in one folder. Usually the level0_Final folder does the trick.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 1:&#039;&#039;&#039; Drag and drop the TRAM and ONCC into the [http://www.paradox.oni2.net/images/simpleOniSplitGui.png big field.] (One by one or simultaneously; the order doesn&#039;t matter.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 2:&#039;&#039;&#039; Hit &amp;quot;Convert&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Editing 3D data==&lt;br /&gt;
===Blender===&lt;br /&gt;
See the [[Blender]] article for a general tutorial on using the free program to create animations for Oni. It also contains code snippets for automating certain tasks, troubleshooting advice, and links to an IK rig that makes animation much easier.&lt;br /&gt;
&lt;br /&gt;
===XSI===&lt;br /&gt;
In the past, the community&#039;s preferred tool for any 3D modeling and animation was {{ModTool}}. However, this free program was discontinued in 2014, and modders did not want to be tied to an aging (not to mention Windows-only) program. Thus, we have generally moved to using Blender (see next section). The following information is preserved for historical purposes.&lt;br /&gt;
----&lt;br /&gt;
For the correct Mod Tool settings, see [[Mod Tool#Animating|HERE]].&lt;br /&gt;
&lt;br /&gt;
Here are some hints for creating animations when there is no rigging available:&lt;br /&gt;
* Use the ONCC model in your 3D editor that will actually make use of the animations. This makes sure that the pelvis height will match and that the character&#039;s feet will not float in the air or go through the ground. &lt;br /&gt;
* The first frame and last frames should match the probable previous and follow-up animations. This will reduce the necessity for long interpolations.&lt;br /&gt;
* When setting keyframes, each body part should have moved. This rule of thumb will give a more natural-looking animation.&lt;br /&gt;
* The first body part to be animated is always the pelvis.&lt;br /&gt;
* Watch out for pelvis rotations so that the XYZ rotations don&#039;t overlap too much, otherwise you will get into a [[wp:Gimbal_lock|gimbal lock]].&lt;br /&gt;
&lt;br /&gt;
Also see our [http://oni.bungie.org/forum/viewtopic.php?id=1433 OCF thread].&lt;br /&gt;
&lt;br /&gt;
==Import==&lt;br /&gt;
 onisplit -create output_path path_to\TRAMname.xml&lt;br /&gt;
&lt;br /&gt;
==Common operations on animations by the community==&lt;br /&gt;
===Speeding up existing animations===&lt;br /&gt;
s10k has created an XmlTools script that allows the speed-up of any existing TRAM by removing frames. More information and download link [http://mods.oni2.net/node/354 here.]&lt;br /&gt;
&lt;br /&gt;
==Selected notes on animation types==&lt;br /&gt;
===Attacks===&lt;br /&gt;
====Extents and XML====&lt;br /&gt;
&#039;&#039;&#039;As a regular modder you don&#039;t need to know how the attack ring and the extents get calculated.&#039;&#039;&#039; If you just want to create an attack animation then add an appropriate &amp;lt;Attacks&amp;gt; code block to your XML as seen in the [[#Using OniSplit to calculate extents|section below]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;How attack ring (horizontal extents) and extents get calculated&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Ever wondered how the AI can recognize incoming attacks and block or dodge them? Extents (found by geyser and fully uncovered by Neo) are the key. Imagine the character looked at from above, and visualize a circle with this character being at the center of the circle. Now divide this circle into 10° segments, and those are the 36 units of horizontal extents (that is, the lateral reach of the attack). The 0° point is directly in front of the character and 180° is behind the character. The segments run clockwise around the character. So the first Extent tag is the horizontal reach on the 0° line, the second tag is for the line 10° clockwise, and so on. Note that a frontal attack like a simple kick could hit a target not only if he&#039;s standing at 0° (directly in front), but also at 10° or 20° to the right, and also at 340° and 350° (a bit to the left). When setting these manually, you should guess the inner and outer ranges of the reach of the attacker&#039;s bones that have damage attached to them. Test these values with an AI that blocks often. If you did it right, your attack will often be blocked, but if the extent length is too high, the AIs will react when too far from you, which does not look good.&lt;br /&gt;
&lt;br /&gt;
There are two types of extents:&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;Extents&amp;gt;&#039;&#039;&#039; stores this info:&lt;br /&gt;
::&amp;lt;Angle&amp;gt; at which this extent radiates from the character.&lt;br /&gt;
::&amp;lt;Length&amp;gt; of this extent.&lt;br /&gt;
::&amp;lt;MinY&amp;gt; minimum height of this extent.&lt;br /&gt;
::&amp;lt;MaxY&amp;gt; maximum height of this extent.&lt;br /&gt;
:Length, MinY and MaxY serve to create an invisible area in space which is &amp;quot;dangerous to be in&amp;quot;. If an AI intersects with this area and notices it (refer to the Notice field in [[MELE]]), it will attempt to block or dodge according to its modifiers in its MELE profile.&lt;br /&gt;
::The number of &amp;lt;Extent&amp;gt;s is equal to the number of attack frames: &amp;lt;End&amp;gt; minus &amp;lt;Start&amp;gt; plus one (because the start frame counts too). For example, for TRAMKONCOMkick_low1: &amp;lt;End&amp;gt;30&amp;lt;/End&amp;gt; minus &amp;lt;Start&amp;gt;22&amp;lt;/Start&amp;gt; plus 1 = 9 &amp;lt;Extent&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;AttackRing&amp;gt; (formerly known as &amp;lt;HorizontalExtents&amp;gt;&#039;&#039;&#039; stores this info:&lt;br /&gt;
::36 fields (exactly 36, otherwise it won&#039;t compile back into a .oni file), which correspond to areas in 10° intervals around the character as described above.&lt;br /&gt;
&lt;br /&gt;
====Using OniSplit to calculate extents====&lt;br /&gt;
Let&#039;s say that you want to convert a non-attack animation to a damage-dealing animation. Non-attack TRAMs do not have extents information used to notify the AIs about incoming attacks, so how do you generate this information from the animation?&lt;br /&gt;
:1. Export the animation to XML with a body attached. If you extract using just &amp;quot;-extract:xml dest_folder TRAMsomething.oni&amp;quot;, you&#039;ll get the 3D animation data inside the XML (namely, the tags Heights, Velocities, Rotations, PositionOffset, and Positions; for an attack animation, you&#039;ll also get Attacks and AttackRing, and inside Attacks&#039; elements, each Attack element will have Extents at the end of it).&lt;br /&gt;
:However, if you extract this same animation using &amp;quot;-extract:xml dest_folder TRAMsomething.oni &#039;&#039;&#039;-anim-body ONCCtramuser.oni&#039;&#039;&#039;&amp;quot;, the animation data will be placed in a DAE file along with the character model geometry. Be sure to pick a body with a size that&#039;s representative of the character classes that will actually use this TRAM, because the extents will be calculated from it. The XML file will be very short without the 3D data in it — this is how we want the non-attack TRAM to look. We do not know the extents information that should go in Extents or AttackRing, so we just want to add the part that distinguishes a DAE-extracted attack TRAM XML from a DAE-extracted non-attack TRAM XML. That part is the Attacks section, without the Extents under each Attack.&lt;br /&gt;
:2. First, consider whether the TRAM should have something added to its Flags section, like Attack or ThrowTarget.&lt;br /&gt;
:3. Now add to the XML of the non-attack TRAM data in the following format (after the &amp;lt;SelfDamage /&amp;gt; section, typically):&lt;br /&gt;
        &amp;lt;Attacks&amp;gt;&lt;br /&gt;
            &amp;lt;Attack&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;1&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;10&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Bones&amp;gt;RightWrist RightFist&amp;lt;/Bones&amp;gt;&lt;br /&gt;
                &amp;lt;Flags /&amp;gt;&lt;br /&gt;
                &amp;lt;Knockback&amp;gt;4&amp;lt;/Knockback&amp;gt;&lt;br /&gt;
                &amp;lt;HitPoints&amp;gt;10&amp;lt;/HitPoints&amp;gt;&lt;br /&gt;
                &amp;lt;HitType&amp;gt;KnockdownHead&amp;lt;/HitType&amp;gt;&lt;br /&gt;
                &amp;lt;HitLength&amp;gt;5&amp;lt;/HitLength&amp;gt;&lt;br /&gt;
                &amp;lt;StunLength&amp;gt;8&amp;lt;/StunLength&amp;gt;&lt;br /&gt;
                &amp;lt;StaggerLength&amp;gt;0&amp;lt;/StaggerLength&amp;gt;&lt;br /&gt;
            &amp;lt;/Attack&amp;gt;&lt;br /&gt;
        &amp;lt;/Attacks&amp;gt;&lt;br /&gt;
:Do not add an AttackRing section after Attacks.&lt;br /&gt;
:4. Import this with &amp;quot;-create dest_folder TRAMsomething.xml&amp;quot;. The Extents sections and the AttackRing will be calculated by OniSplit from the attached DAE.&lt;br /&gt;
:5. If you need this information for a patch mod, run &amp;quot;-extract:xml&amp;quot; on the TRAMsomething.oni you&#039;ve created &amp;lt;u&amp;gt;without&amp;lt;/u&amp;gt; using &amp;quot;-anim-body&amp;quot;. Now you can copy the Extents and AttackRing data to your XML patch. For an example of how the patch should look, see the [http://mods.oni2.net/node/311 Domino Knockdowns] mod.&lt;br /&gt;
&lt;br /&gt;
===Combos===&lt;br /&gt;
The type and order of player input for triggering a given animation type (such as PPK) is hardcoded, and new animation types cannot be created. To assign an animation type to a specific combo attack, you set a corresponding value in &amp;lt;Lookup&amp;gt;&amp;lt;Type&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Setting a value in the &amp;lt;Link&amp;gt; of &#039;&#039;&#039;&amp;lt;DirectAnimations&amp;gt;&#039;&#039;&#039; will do two things:&lt;br /&gt;
# It will increase the time window for player input, meaning the next animation can be executed more easily. (In vanilla Oni, the Crescent Moon Kick has no link in KONCOMcomb_k_k_kfw and therefore is difficult to use.)&lt;br /&gt;
# It disables &amp;lt;Interpolation&amp;gt;&amp;lt;End&amp;gt; for the next combo anim.&lt;br /&gt;
# It enables &amp;lt;Pause&amp;gt;&amp;lt;Soft&amp;gt; and &amp;lt;Pause&amp;gt;&amp;lt;Hard&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Just Frame input===&lt;br /&gt;
Implemented by Delano762, inspired by the game series Tekken, a Just Frame (&amp;quot;JF&amp;quot;) move means that you have to press certain keys (W+K or W+P) at the exact same time, which is more difficult than it might sound. Delano&#039;s mod [http://mods.oni2.net/node/353 54000 New Combat Moves for Konoko] has a collection of animations which utilize existing animation states differently to create new moves.&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
* new forward kick = TRAMKONCOMkick_fw_JF &amp;lt;FromState&amp;gt;Standing&lt;br /&gt;
** key strokes: w + k&lt;br /&gt;
* old forward kick = TRAMKONCOMkick_fw &amp;lt;FromState&amp;gt;RunStart&lt;br /&gt;
** key strokes: w, k&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
* new forward punch = TRAMKONCOMpunch_fw_JF &amp;lt;FromState&amp;gt;Standing&lt;br /&gt;
** key strokes: w + p&lt;br /&gt;
* old forward punch = TRAMKONCOMpunch_fw &amp;lt;FromState&amp;gt;RunStart&lt;br /&gt;
** key strokes: w, p&lt;br /&gt;
&lt;br /&gt;
Note that these animations are referred to as JF moves, not JF combos. The Crescent Moon Kick, as mentioned above, is an unintentional JF combo found in vanilla Oni.&lt;br /&gt;
&lt;br /&gt;
===Throws===&lt;br /&gt;
: Todo: Add here throw pair table from talk page when it is complete.&lt;br /&gt;
&lt;br /&gt;
Throw target animations are registered in the TRAC of the throw initiator (AKA the throw source). Target animations are forced onto the other character, removing the need to have that animation in the target&#039;s TRAC. Throw target (TRAM*tgt) animations can only cover up to 256 frames (0-255).&lt;br /&gt;
&lt;br /&gt;
====Forward throws====&lt;br /&gt;
Scenario: You load two characters into Mod Tool and rotate (+/-180°) the throw target character because you need them to stand face to face as you work on an animation. When you are done animating, the target animation would need to be reversed again. This means multiplying the velocities by -1; the rotation also needs correcting. So it looks like you need *(-1) for the x rotation and -/+180° (depending on your initial change) for the Y rotation.&lt;br /&gt;
&lt;br /&gt;
=====BlenderOni Throw Adjust=====&lt;br /&gt;
There is a Blender script implemented within the BlenderOni addon for rotating and adding PositionOffset to a forward throw Target animation. It is capable of adjusting both forward and back throws. The script&#039;s old version can be accessed [[Blender/Obsolete_scripts#Script_for_adjusting_forward_throw_targets|HERE.]]&lt;br /&gt;
&lt;br /&gt;
====Excel macro====&lt;br /&gt;
[[Image:Animation_macro_v4.png|right|thumb]]&lt;br /&gt;
The Excel macro can be used to create any TRAM except overlays. [https://www.youtube.com/watch?v=vDTPYfvMf4M Demo vid here].&lt;br /&gt;
&lt;br /&gt;
The macro should be rewritten as a .NET framework or application because Excel is not freeware. However, the tool was made with XSI in mind (for getting animation pair-based information). As XSI is mostly considered obsolete by the community, research for doing the same with Blender will be needed.&lt;br /&gt;
&lt;br /&gt;
There was some development of a .NET-based &#039;&#039;&#039;[[TRAM setup assistant]]&#039;&#039;&#039; in 2016, but the work drifted into inactivity since the community showed no sign of demand for an updated tool.&lt;br /&gt;
&lt;br /&gt;
As of now there is a Blender script for creating throw target adjustment data. So instead of writing a new stand-alone app, at least the creation of header data might be better ported to the Blender script.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Macro usage:&#039;&#039;&#039;&lt;br /&gt;
* Put your files into the &amp;quot;input_and_output&amp;quot; folder.&lt;br /&gt;
* Disable macro security if you don&#039;t want to have to click on the &amp;quot;Enable Content&amp;quot; button every time.&lt;br /&gt;
* Close other worksheets before you run the macro.&lt;br /&gt;
* If you are not afraid of VBA code, you can enter the dev environment by hitting Alt+F11. If you want to extend the attack library with more screenshots and settings, search for &amp;quot;LibraryThrows&amp;quot;, &amp;quot;LibraryAttack&amp;quot;, &amp;quot;Picture&amp;quot;, and &amp;quot;CBAttackHelp.AddItem&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Run animations===&lt;br /&gt;
Here&#039;s a breakdown of the Striker&#039;s run animations, meant as an illustration for what would be needed to make new run TRAMs.&lt;br /&gt;
&lt;br /&gt;
Run cancel:&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
* STRIKErun1stepa&lt;br /&gt;
* STRIKErun1stepb&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
&lt;br /&gt;
Run – &#039;&#039;a minimal cycle&#039;&#039;:&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
* STRIKErun1stepa&lt;br /&gt;
* STRIKErunstart&lt;br /&gt;
* STRIKErun_rt&lt;br /&gt;
* STRIKErun_lt (optional)&lt;br /&gt;
* STRIKErunstop&lt;br /&gt;
* STRIKEidle1 / another idle animation&lt;br /&gt;
&lt;br /&gt;
Follow the images below from right to left.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:XML_TRAM_STRIKErunstop.png|STRIKErunstop&lt;br /&gt;
Image:XML_TRAM_STRIKErun_lt.png|STRIKErun_lt&lt;br /&gt;
Image:XML_TRAM_STRIKErun_rt.png|STRIKErun_rt&lt;br /&gt;
Image:XML_TRAM_STRIKErunstart.png|STRIKErunstart&lt;br /&gt;
Image:XML_TRAM_STRIKErun1stepa.png|STRIKErun1stepa&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of unused animations==&lt;br /&gt;
Here are all the known unused animations. These could be recycled in a new mod.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;From the original game&#039;&#039;&#039;&lt;br /&gt;
* KONOKOconsole_punch: What the name says (the engine can use that animation depending on the console&#039;s configuration, see [[OBD:BINA/OBJC/CONS|CONS]]) .&lt;br /&gt;
* KONOKOlev3_intro: Looks like she&#039;s placing something (bomb?) and then running away.&lt;br /&gt;
* KONOKOlev4_undress: From an aborted clothes-changing cutscene.&lt;br /&gt;
* KONOKOlev16_bomb: Planting a bomb.&lt;br /&gt;
* KONCOMsuper_kick: Now used in [[OTA]] as a spawn event, and by the fan-made character [[Shinatama Evolved]].&lt;br /&gt;
* KONCOMsuper_punch: KONCOMpunch_heavy but without the shouted attack name, has HalfDamage flag, and does 10 less damage in its first attack part.&lt;br /&gt;
* COMPISidle_special1: Comguy checking environment and his gun; meant for a feature that would visually depict an elevation in the AI&#039;s level of alertness after, say, hearing a noise.&lt;br /&gt;
* STRPISidle_special1: Striker checking his his gun and communicating with an ally (another unused alertness-elevation animation).&lt;br /&gt;
* THUGlev1_direct: Thug probably directing a truck driver.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;From modders&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Image:female_stun.jpg|right|thumb|Char A and Char B performing stun animations.]]&lt;br /&gt;
&lt;br /&gt;
* http://mods.oni2.net/node/376&lt;br /&gt;
** StrikerKneeStepKickThrow.zip&lt;br /&gt;
** REDCOMjump_fw_crouch--double_flip--dae.zip&lt;br /&gt;
** KONprone_getup--dae.zip&lt;br /&gt;
** KONRIF_k_bk_throw.zip&lt;br /&gt;
** female_stun--dae.zip&lt;br /&gt;
&lt;br /&gt;
==Special effects==&lt;br /&gt;
If the scene is overloaded by too many particles (including motion blur), these effects will cease being rendered. So don&#039;t overuse effects.&lt;br /&gt;
&lt;br /&gt;
===Color trails===&lt;br /&gt;
Open the XML-accompanied TRAM, search for the &amp;quot;Particles&amp;quot; tag, and insert your markup.&lt;br /&gt;
&lt;br /&gt;
First example: TRAMSTRCOMcomb_p_p.xml&lt;br /&gt;
&lt;br /&gt;
[[Image:Colorful_contrail_added.png|right|thumb]]&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Particles&amp;gt;&lt;br /&gt;
            &amp;lt;Particle&amp;gt;&lt;br /&gt;
                &amp;lt;StartFrame&amp;gt;0&amp;lt;/StartFrame&amp;gt;&lt;br /&gt;
                &amp;lt;EndFrame&amp;gt;12&amp;lt;/EndFrame&amp;gt;&lt;br /&gt;
                &amp;lt;Bone&amp;gt;LeftFist&amp;lt;/Bone&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;contrail&amp;lt;/Name&amp;gt;&lt;br /&gt;
            &amp;lt;/Particle&amp;gt;&lt;br /&gt;
        &amp;lt;/Particles&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;contrail&amp;quot; is looked up by the character class (ONCC) that emits the actual particle; here it is &amp;quot;h2h_strtrail_e01&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This second example is about creating two different contrails in a TRAM at the same time. The animation is &amp;quot;TRAMSTRCOMpunch_heavy.xml&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Different_contrails_in_attack.png|right|thumb]]&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Particles&amp;gt;&lt;br /&gt;
            &amp;lt;Particle&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;0&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;54&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Bone&amp;gt;RightWrist&amp;lt;/Bone&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;contrail&amp;lt;/Name&amp;gt;&lt;br /&gt;
            &amp;lt;/Particle&amp;gt;&lt;br /&gt;
            &amp;lt;Particle&amp;gt;&lt;br /&gt;
                &amp;lt;Start&amp;gt;0&amp;lt;/Start&amp;gt;&lt;br /&gt;
                &amp;lt;End&amp;gt;54&amp;lt;/End&amp;gt;&lt;br /&gt;
                &amp;lt;Bone&amp;gt;LeftWrist&amp;lt;/Bone&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;&#039;&#039;&#039;contrail_2&#039;&#039;&#039;&amp;lt;/Name&amp;gt;&lt;br /&gt;
            &amp;lt;/Particle&amp;gt;&lt;br /&gt;
        &amp;lt;/Particles&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that you need to register the second contrail in the ONCC as well. Using your own contrail particle is also possible; just insert its name between the &amp;lt;Type&amp;gt; tags.&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;ONCPParticle&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;contrail&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Type&amp;gt;h2h_strtrail_e01&amp;lt;/Type&amp;gt;&lt;br /&gt;
                &amp;lt;BodyPart&amp;gt;-1&amp;lt;/BodyPart&amp;gt;&lt;br /&gt;
            &amp;lt;/ONCPParticle&amp;gt;&lt;br /&gt;
            &amp;lt;ONCPParticle&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;&#039;&#039;&#039;contrail_2&#039;&#039;&#039;&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Type&amp;gt;&#039;&#039;&#039;h2h_murtrail_e01&#039;&#039;&#039;&amp;lt;/Type&amp;gt;&lt;br /&gt;
                &amp;lt;BodyPart&amp;gt;-1&amp;lt;/BodyPart&amp;gt;&lt;br /&gt;
            &amp;lt;/ONCPParticle&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Motion blur===&lt;br /&gt;
[[Image:XML_TRAM_willow_kick_with_motion_blur.jpg|thumb|200px]]&lt;br /&gt;
&lt;br /&gt;
===Impact effect===&lt;br /&gt;
[[Image:XML_TRAM_KONCOMkick_fw_with_ninflash1.jpg|thumb|200px]]&lt;br /&gt;
&lt;br /&gt;
See also [[XML:ONCC]].&lt;br /&gt;
&lt;br /&gt;
{{XML}}&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Importing_character_models&amp;diff=38818</id>
		<title>Importing character models</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Importing_character_models&amp;diff=38818"/>
		<updated>2022-11-21T10:39:17Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Blender-specific OniSplit information - minor adjustments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article covers the importing of new character models into Oni, but also how to export models from Oni. Generally speaking, you are going to want to use [[wikipedia:COLLADA|COLLADA]] as the &amp;quot;passthrough&amp;quot; format between your 3D program and Oni, as this is exactly what COLLADA was designed for. In this article, COLLADA is referred to as &amp;quot;Collada&amp;quot; (because who enjoys being shouted at?), or by &amp;quot;.dae file&amp;quot; (because that is the file suffix for COLLADA).&lt;br /&gt;
&lt;br /&gt;
==Modding tools==&lt;br /&gt;
===OniSplit===&lt;br /&gt;
This is the program that we use to get models into and out of Oni. It is a command line tool. There are GUI wrappers for OniSplit that cover most of its functions (see [[Vago (tool)]], but modders sometimes have to call it from the command line (or use the direct command line input feature in a GUI) to take full advantage of OniSplit&#039;s abilities.&lt;br /&gt;
&lt;br /&gt;
===3D programs===&lt;br /&gt;
====Blender====&lt;br /&gt;
[[Blender]] is the community&#039;s current 3D software of choice, allowing for 3D modeling, animating, and more.&lt;br /&gt;
&lt;br /&gt;
Blender rocks when it comes to [[Lightmapping levels|lightmapping levels]]. XSI is closed source and can only lightmap one mesh at a time with one lightmap texture per mesh. Blender is more flexible because of its free-for-all scripting API, and a nice touch is that it supports radiosity, i.e., emissive materials -- and that&#039;s exactly how Oni&#039;s lighting was done initially (see [[OBLS]]).&lt;br /&gt;
&lt;br /&gt;
====XSI====&lt;br /&gt;
Softimage XSI is a Windows-only 3D software that went discontinued in 2014, and [https://www.moddb.com/downloads/autodesk-softimage-mod-tool-75 a free version of it from 2008] used to to be the community&#039;s modding tool of choice before moving on to Blender. A number of Oni-related addons, tools and tutorials were developed for it can be still found and used. It has detailed documentation and is versatile, whether working with characters or levels, though highly obsolete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===File converters===&lt;br /&gt;
====Autodesk FBX====&lt;br /&gt;
Check out {{AutodeskFBX}} (primarily the FBX converter) if your tool can reliably import/export FBX but has trouble with Collada.&lt;br /&gt;
&lt;br /&gt;
==Basic importing and exporting==&lt;br /&gt;
===Exporting from Oni to Collada===&lt;br /&gt;
OniSplit allows you to export .dae files from both [[TRBS]] and [[ONCC]]. Though all the 3D data is in the TRBS, the textures are listed in the [[TRMA]] file, which is only visible from the ONCC, not the TRBS. Thus, if you want to use the textures while editing the model, convert the ONCC, not the TRBS, into Collada. The instructions below assume that you want the textured model, and thus illustrate how to export the ONCC.&lt;br /&gt;
&lt;br /&gt;
First, you need to find the class name for the character you want to export. You can accomplish this by going into Oni, loading the level in which the desired character appears, and then enabling the shapeshifter cheat -- but you have to do this by turning on [[Developer Mode]], not by entering the &amp;quot;shapeshifter&amp;quot; cheat code, because the regular cheat code does not display the console output that you need. Once Dev Mode is on, press F8 until you reach the desired character. You should see the message &amp;quot;character class &#039;&#039;number&#039;&#039; &#039;&#039;&#039;&#039;&#039;string&#039;&#039;&#039;&#039;&#039;&amp;quot;. The number is unimportant, but write down the string, because that is the class name which provides the basis for the names of the ONCC and TRBS.&lt;br /&gt;
&lt;br /&gt;
In this example, we&#039;ll export one of Konoko&#039;s models. For Konoko, we don&#039;t even need to open Oni to find the name of an ONCC because we have [[Konoko#In-game_outfits|this handy table]]. Let&#039;s use Konoko in her police uniform; you can see from the table that this is ONCCk3 and that it&#039;s found in level2_Final.&lt;br /&gt;
&lt;br /&gt;
Next, you need to decide on the pose in which your character will be exported. See the &amp;quot;Poses&amp;quot; section below for guidance. Without making this example more complicated, we only have two choices for pose: default (folded) and -noanim (standing at attention); we are going to use the second option, for a more visually pleasing result. Here are the steps for getting your desired character in .dae format. Substitute backward slashes for forward ones if you are in Windows.&lt;br /&gt;
&lt;br /&gt;
:1. Create a couple of folders in a convenient place. One folder will receive a whole bunch of files, and the second folder will hold the exported model. We&#039;ll call these paths &amp;quot;splitOutput/&amp;quot; and &amp;quot;modelOutput/&amp;quot; respectively.&lt;br /&gt;
:2. On the command line, go to the directory &amp;quot;Oni/GameDataFolder/&amp;quot;, where &amp;quot;Oni/&amp;quot; means the path to your game.&lt;br /&gt;
:3. Split the desired level&#039;s data into its component resources with OniSplit. Where you see just &amp;quot;onisplit&amp;quot; in the following commands, you should take that to mean &amp;quot;C:\path\to\OniSplit.exe&amp;quot; in Windows or &amp;quot;mono /path/to/OniSplit.exe&amp;quot; on Macs (Mono is a third-party package that you need to run .NET applications in macOS):&lt;br /&gt;
::&amp;lt;tt&amp;gt;onisplit -export splitOutput/ level2_Final.dat&amp;lt;/tt&amp;gt;&lt;br /&gt;
:4. Convert the desired character&#039;s model data into Collada:&lt;br /&gt;
::&amp;lt;tt&amp;gt;onisplit -extract:dae modelOutput/ -noanim splitOutput/ONCCk3.oni&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create the file &#039;&#039;&#039;ONCCk3.dae&#039;&#039;&#039;, and its supporting textures in TGA format, in modelOutput/. Note that only the highest level of detail (LOD) model will be exported using this method. See [[XML:TRBS]] for a method which exports all 5 LOD models.&lt;br /&gt;
&lt;br /&gt;
Note that if you want to extract the model with a pose besides folded or -noanim, you need to have the animation data (the [[TRAC]] and [[TRAM]] .oni files) in the same folder as the model data (the ONCC and its related files). In vanilla (un-modded) Oni, animations for many characters (including Konoko) are only in level0_Final, and, as you saw above, model data is found in whichever level that character appears in. Extracting a model in the pose of your choice will be simpler if you have the [[AE]] installed, as it globalizes character data, placing it all in the level0_Final files in the AE&#039;s GameDataFolder. With vanilla Oni, you will have to split both level0_Final and level&#039;&#039;x&#039;&#039;_Final and then combine their files into one folder before you can perform the &amp;quot;-extract:dae&amp;quot; operation using the &amp;quot;-anim&amp;quot; tag that is discussed below.&lt;br /&gt;
&lt;br /&gt;
===Importing from Collada into Oni===&lt;br /&gt;
When importing characters, the simplest method is to generate a whole body set ([[TRBS]]) from one .dae file. To convert your 3D model, let&#039;s say that you saved it in Collada format with the name &amp;quot;TRBSnewchar.dae&amp;quot;. Run the command:&lt;br /&gt;
:&amp;lt;tt&amp;gt;onisplit -create:trbs DAEtoONI/ TRBSnewchar.dae&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create &#039;&#039;&#039;TRBSnewchar.oni&#039;&#039;&#039; in the folder DAEtoONI. Because it was created from a single .dae file, this TRBS will contain 5 identical models for the 5 levels of detail (LOD) that Oni supports for each character. You have to import by XML in order to specify a different .dae for every LOD; see [[XML:TRBS]] for more info.&lt;br /&gt;
&lt;br /&gt;
Textures are currently ignored upon creating the TRBS (however, the TRBS will of course retain the changes you may have made to the UV coordinates if you were editing a model exported from Oni). Possibly a future version of OniSplit can automatically generate a TRMA and TXMPs if the .dae file has textures.&lt;br /&gt;
&lt;br /&gt;
Note that your file should be named appropriately if you want it to be looked up by name from one or more of Oni&#039;s existing ONCCs, or a new one of your own creation.&lt;br /&gt;
&lt;br /&gt;
To actually test the model in-game, you should [[Making a mod package|create a mod package]] for it, place the package in Oni/AE/packages/, and select it in the AE Installer. The older method of testing your work is to rebuild the level by running &amp;quot;onisplit -import&amp;quot; on a folder containing your TRBS and all the other .oni files for a level, but this only creates a set of level files that you can use on your computer, and is inherently a disorganized approach to keeping track of your work. Creating an AE package will allow you to share your work with other players.&lt;br /&gt;
&lt;br /&gt;
Please note that a final character mod package should contain multiple LOD models for your character. Filling all 5 slots with distinct models is not necessary; many modders create only two or three LOD models and fill the lower LOD slots with the simpler model(s) and the highest slot with the full-detail model, e.g.:&lt;br /&gt;
:# TRBSnewchar_low.dae&lt;br /&gt;
:# TRBSnewchar_low.dae&lt;br /&gt;
:# TRBSnewchar_mid.dae&lt;br /&gt;
:# TRBSnewchar_mid.dae&lt;br /&gt;
:# TRBSnewchar_high.dae&lt;br /&gt;
&lt;br /&gt;
An ONCC contains much more information than just links to TRBS and TRMA, and thus can not be generated automatically. See [[XML:ONCC]] on how to create such a file, and then import the character with this class data into Oni. The easiest way to try out an imported character in Oni is to name your imported TRBS so that it replaces an existing one and no ONCC editing is needed. The next step up is to clone an existing ONCC (in XML) and modify it to link to your new TRBS file(s).&lt;br /&gt;
&lt;br /&gt;
==Blender-specific OniSplit information==&lt;br /&gt;
This section contains OniSplit commands specific to Blender, and related settings in Blender necessary for assets to work.&lt;br /&gt;
&lt;br /&gt;
===Blender settings for importing and exporting COLLADA files===&lt;br /&gt;
====Importing====&lt;br /&gt;
In the Collada Import Data Options, make sure to check Import Units. Failure to do so will result in scaling issues, which are not easy to fix.&lt;br /&gt;
&lt;br /&gt;
Before importing TRAM files, set the scene frame rate to 60 FPS. Failure to do so will result in keyframes being placed incorrectly on the timeline.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Collada import settings !! Scene settings&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:BlenderImportSettings.png|200px|frameless|center]] || [[Image:BlenderSceneSettings.png|300px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
====Exporting====&lt;br /&gt;
When exporting TRBS, be sure to delete the default light and camera from the scene, or you can select all 19 body parts, then in the Export Main Tab, select Selection Only.&lt;br /&gt;
&lt;br /&gt;
When exporting TRAM, select all 19 body parts, then in the Collada export options, under the Main Tab: select Selection Only, Geom Tab: select Triangulate, Anim Tab: select Curves.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Blender Collada export settings&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:BlenderColladaExportSettings.png|500px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Blender-specific OniSplit commands===&lt;br /&gt;
*Convert TRBS.oni to Blender compatible dae: &lt;br /&gt;
 -extract:&#039;&#039;&#039;dae&#039;&#039;&#039; To_blender -noanim -blender Original\TRBSkonoko_body_high.oni&lt;br /&gt;
&lt;br /&gt;
*Convert ONCC.oni to Blender compatible dae with textures: &lt;br /&gt;
&lt;br /&gt;
 -extract:&#039;&#039;&#039;dae&#039;&#039;&#039; To_blender -noanim -blender Original\ONCCkonoko_generic.oni&lt;br /&gt;
&lt;br /&gt;
Be sure to include the TMXP.oni files with the ONCC.oni file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Convert TRAM.oni to Blender compatible dae - &#039;&#039;&#039;textureless&#039;&#039;&#039;, as exporting animations with textured models does not work yet:&lt;br /&gt;
&lt;br /&gt;
 -extract:&#039;&#039;&#039;xml&#039;&#039;&#039; To_blender -anim-body:Original\TRBSkonoko_body_high.oni -blender Original\TRAMKONCOMkick_heavy.oni &lt;br /&gt;
&lt;br /&gt;
This will create a TRAM.dae along with an .xml file, which is needed for importing back to Oni. You will be also able to tell that everything went okay when you see&lt;br /&gt;
&amp;lt;mark&amp;gt;&amp;lt;tt&amp;gt;AnimationDaeWriter: custom axis conversion&amp;lt;/tt&amp;gt;&amp;lt;/mark&amp;gt;&lt;br /&gt;
on output. If you don’t, you’re most likely doing something wrong.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Convert TRBS.dae from Blender to .oni:&lt;br /&gt;
 -create:&#039;&#039;&#039;trbs&#039;&#039;&#039; From_blender -blender From_blender\TRBSkonoko_body_high.dae&lt;br /&gt;
&lt;br /&gt;
*Convert TRAM.dae from Blender to .oni&lt;br /&gt;
 -create From_blender -blender From_blender\TRAMKONCOMkick_heavy.xml&lt;br /&gt;
The TRAMKONCOMkick_heavy.xml links to the TRAMKONCOMkick_heavy.dae from Blender which needs to be in the same location as the .xml file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshooting===&lt;br /&gt;
&lt;br /&gt;
Known Issues between Blender 2.83 and OniSplit 0.9.99.2:&lt;br /&gt;
&lt;br /&gt;
1) Importing a .dae file results in the following error message:&lt;br /&gt;
 &amp;quot;Schema validation (Error): Error: ERROR_REQUIRED_ATTRIBUTE_MISSING Element: technique, Attribute: sid&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Solution: Open the .dae file in a text editor, find all instances of &amp;lt;tt&amp;gt;&amp;lt;technique&amp;gt;&amp;lt;/tt&amp;gt; and replace with &amp;lt;tt&amp;gt;&amp;lt;technique sid=&amp;quot;common&amp;quot;&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Poses==&lt;br /&gt;
===Oni&#039;s default orientation===&lt;br /&gt;
This pose, where the body parts are all at zero rotation, is usually referred to in the community as the &amp;quot;folded pose&amp;quot;. The primary axis of a body part, in its own frame of reference, is X. When you move down an arm or leg, or up the spine, you are moving along the positive X direction of every body part.&lt;br /&gt;
When all the bones are aligned with their parents, you get something like this:&lt;br /&gt;
 14-o-13-o-12-o-11-o 3-o-2-o-1-o       ^ z&lt;br /&gt;
                   |           |       ^&lt;br /&gt;
            :)10-o-9-o-8-o-7-o-0  &amp;lt; &amp;lt; &amp;lt;^&amp;lt; &amp;lt; &amp;lt;&lt;br /&gt;
                   |           |   x   ^&lt;br /&gt;
 18-o-17-o-16-o-15-o 6-o-5-o-4-o       ^&lt;br /&gt;
This is a conventional reference used in all of Oni. For any animation of any character in Oni, the rotations of the body parts are calculated with respect to a default pose such as this one. This allows the characters to share animations, even if their &amp;quot;skeletons&amp;quot; ([[TRTA]]) have slightly different proportions.&lt;br /&gt;
&lt;br /&gt;
In the default pose, the XYZ axes of all the bones are oriented the same way. Thus, in the default pose, you can see the &amp;quot;true&amp;quot; translations (offsets) of every body part with respect to its parent, as stored in the &amp;quot;translation array&amp;quot; (TRTA). For example, in Konoko&#039;s case, the &amp;quot;mid&amp;quot; section (part 7), is translated by 1.67 WU along X (i.e., 16.7 cm towards the top of the spine), and by 0.25 along Y (i.e., 2.5 cm towards the front of the spine). Remember that this translation is &#039;&#039;in the &amp;quot;local&amp;quot; frame of reference of the pelvis&#039;&#039;, i.e., with respect to the &#039;&#039;origin&#039;&#039; of the pelvis &#039;&#039;and&#039;&#039; to its local XYZ axes (which are generally different from the world axes). Basically, the local X of the pelvis always points up the spine, the local Y points forward, the local Z points left, and the same goes for &amp;quot;mid&amp;quot;, &amp;quot;chest&amp;quot;, &amp;quot;neck&amp;quot;, and &amp;quot;head&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===-noanim pose===&lt;br /&gt;
[[Image:Konoko_bodyparts.png|thumbnail|right|283px]]&lt;br /&gt;
Supplying the &#039;&#039;&#039;-noanim&#039;&#039;&#039; switch to OniSplit yields the &amp;quot;standing at attention&amp;quot; pose, a much less visually awkward pose than the default &amp;quot;folded pose&amp;quot;. Note that &amp;quot;-noanim&amp;quot; goes in between the destination directory and the source file name:&lt;br /&gt;
:&#039;&#039;&#039;onisplit -extract:dae modelOutput/ -noanim ONCCkonoko_generic.oni&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The result will look something the picture on the right, but the model will have her legs together and her arms by her side.&lt;br /&gt;
&lt;br /&gt;
To produce this pose, these rotations are used:&lt;br /&gt;
:(0,90,90) for the pelvis&lt;br /&gt;
:(0,180,0) for both thighs&lt;br /&gt;
:(90,90,90) for the left shoulder&lt;br /&gt;
:(-90,-90,90) for the right shoulder&lt;br /&gt;
:(0,90,0) for the left biceps&lt;br /&gt;
:(0,-90,0) for the right biceps&lt;br /&gt;
:(-90,0,0) for the left hand/fist&lt;br /&gt;
:(90,0,0) for the right hand/fist&lt;br /&gt;
:(0,0,0) for all other parts&lt;br /&gt;
The placement of the pelvis is adjusted for Konoko, so that the soles of her feet are at Y=0. For male characters the feet will be at Y&amp;lt;0.&lt;br /&gt;
&lt;br /&gt;
===Idle pose===&lt;br /&gt;
If you use &#039;&#039;&#039;-extract:dae TargetFolder ONCCkonoko_generic.oni&#039;&#039;&#039;, taking care that you have the TRAC/TRAM files next to the ONCC, OniSplit will look up the idle animation from the ONCC&#039;s TRAC and apply the rotations from the first frame of the animation to the body parts.&lt;br /&gt;
&lt;br /&gt;
Keep in mind that this idle pose exported by OniSplit is just an arbitrary natural-looking pose, as opposed to the default &amp;quot;folded&amp;quot; orientation or the &amp;quot;at attention&amp;quot; &#039;&#039;&#039;-noanim&#039;&#039;&#039; pose. A frame from an idle animation is certainly &#039;&#039;not&#039;&#039; a standard pose for you to match when importing a new model (unless you are swapping body parts between Oni characters that use the same idle pose, in which case you don&#039;t have to match anything anyway).&lt;br /&gt;
&lt;br /&gt;
===Any pose===&lt;br /&gt;
When exporting from ONCC, you can use the &#039;&#039;&#039;-anim&#039;&#039;&#039; tag to specify any TRAM, as long as it can be found in the character&#039;s TRAC (and as long as it&#039;s not an overlay animation). Or, you can just start from the -noanim or idle pose, and tweak the rotations to match any pose you like.&lt;br /&gt;
&lt;br /&gt;
==Things to try==&lt;br /&gt;
===Bastardizing===&lt;br /&gt;
This is possibly the easiest kind of modding, that doesn&#039;t require texturing skills or even, in most cases, attentive handling of poses and joints. The idea is to:&lt;br /&gt;
#take two Oni characters (for simplicity, two characters who use the same skeleton: e.g., the Konokos from {{C|13}} and {{C|10}})&lt;br /&gt;
#load both of them simultaneously into Mod Tool or Blender. In Mod Tool, just drag-and-drop the .dae files, but &amp;quot;Select none&amp;quot; (Ctrl+Shift+A) before you do, to make sure that you drop both into &amp;quot;Scene_Root&amp;quot;)&lt;br /&gt;
#reparent some body parts (rename if needed) and trim the rest (since the orientations and joint offsets match, you don&#039;t need to rotate/move anything)&lt;br /&gt;
#export, adapt the TRMA if needed, rebuild the level and play&lt;br /&gt;
This allows one to recombine Oni&#039;s characters into &amp;quot;new&amp;quot; ones very easily. Probably the easiest thing is to add sunglasses to any Konoko model ^_^ (or Konoko&#039;s head to any female character)&lt;br /&gt;
&lt;br /&gt;
===Cel-shading===&lt;br /&gt;
An effect similar to cel-shading can be obtained by enclosing the mesh in a shell painted in black and facing inwards.&lt;br /&gt;
:As of 0.9.8, OniSplit can perform this operation with every body part, in an automatic way, with one control parameter (a sorta &amp;quot;margin&amp;quot;, or effective thickness of the &amp;quot;shell&amp;quot;).&lt;br /&gt;
The syntax is as follows:&lt;br /&gt;
:&#039;&#039;&#039;FolderWhereOniSplitIs\OniSplit.exe -create:trbs TargetFolderForCreatedTRBS -cel FolderWhereTheModelIs\name_of_the_model.dae&#039;&#039;&#039;&lt;br /&gt;
:or &#039;&#039;&#039;FolderWhereOniSplitIs\OniSplit.exe -create:trbs TargetFolderForCreatedTRBS -cel:0.1 FolderWhereTheModelIs\name_of_the_model.dae&#039;&#039;&#039;&lt;br /&gt;
The &#039;&#039;&#039;-cel&#039;&#039;&#039; option enables the generation of the shell. The optional parameter (default 0.07) defines the thickness of the shell.&lt;br /&gt;
&lt;br /&gt;
Note that the shells may not be good-looking in every situation without some further tweaking. Rextract the TRBS or ONCC, tweak the shell, and reimport normally (without &#039;&#039;&#039;-cel&#039;&#039;&#039; this time).&lt;br /&gt;
:Some examples of automatically generated shells (not tweaked in any way) can be seen here: http://geyser.oni2.net/edition/celshading/&lt;br /&gt;
&lt;br /&gt;
===New models===&lt;br /&gt;
====Matching body part centers====&lt;br /&gt;
There is actually no such thing as a &amp;quot;standard&amp;quot; pose for 3D characters: the width of the stance, the stiffness of the spine, the angle at which the arms extend from the body - all that varies a lot between models. Therefore the model of your dreams (Gally, Master Chief, Eva-01, whatever) will typically come with a somewhat &amp;quot;random&amp;quot; pose, which has nothing to do with either Oni&#039;s default pose, or even with the &#039;&#039;&#039;-noanim&#039;&#039;&#039; &amp;quot;standard&amp;quot; exported by OniSplit. Another problem is that, if you roundtripped your character through OBJ (which doesn&#039;t support relative placement and rotation), then all the bones are essentially defined in world space, i.e., their centers are at the world&#039;s origin, and their axes are aligned with the world axes.&lt;br /&gt;
&lt;br /&gt;
What can we do about this? Here&#039;s what:&lt;br /&gt;
#First, make sure that the model that you want to import into Oni is split into 19 separate body parts, and that they overlap nicely even under extreme rotations (see below). The &amp;quot;extremes&amp;quot; are something that you can fix later, but you really need the character to be split into 19 body parts. If some of those parts are missing (e.g., [[Barabas]] has no visible shoulder parts), you will still need placeholder meshes (see Barabas as an example). So, get all those meshes ready, alongside each other, at the root of the scene (no hierarchy needed right now).&lt;br /&gt;
#Now, load an Oni character exported with OniSplit into the same scene. This character will be your posing figure, so make sure it is similar (in height and &amp;quot;width&amp;quot;) to the one that you want to import (i.e., don&#039;t use Konoko to match Master Chief, and don&#039;t use Barabas to match Gally). Tweak the rotations of the Oni character until it overlaps with the &amp;quot;random&amp;quot; pose of the new character.&lt;br /&gt;
#Sometimes you can&#039;t make everything overlap just with rotations, and in that case you have to actually translate bones with respect to their parents. By doing this you are actually modifying the skeleton of the Oni character, bringing it closer to the proportions of the new character. If this is the case, and if you want the new character to use Oni&#039;s animations, you will have to make sure that the length of the legs stays roughly the same. If the legs of the new character have about the same length as those of an Oni character (measured between the hip joint and the sole of the feet, or between the pelvis center and the sole of the feet), then the animations may look a bit different, but at least during basic stances and movements the feet will stay roughly in contact with the ground, not above or below.&lt;br /&gt;
#Now, you can inspect the Oni character, which you have posed in a way that is consistent with the &amp;quot;random&amp;quot; arrangement of the new body parts. Try selecting the body parts of the &amp;quot;posing&amp;quot; Oni character, one at a time, and inspect the values of the translation and rotation of the mesh with respect to its parent (i.e., &amp;quot;Local&amp;quot;), in the &amp;quot;Transform&amp;quot; panel (far right). Try switching to &amp;quot;Center&amp;quot; in the &amp;quot;Select&amp;quot; panel (top right corner), and inspect not only the values in the &amp;quot;Transform&amp;quot; panel, but also the color-coded local axes, which can be seen sticking out of the center of every selected mesh, in the viewport. Try to interpret all this, in terms of the &amp;quot;translation array&amp;quot; ([[TRTA]]) and Oni&#039;s conventional neutral pose (see above).&lt;br /&gt;
#The next (and last) step is to ensure that every part of the new character is parented correctly (the thighs to the pelvis, the calves to the thighs, etc), &#039;&#039;and&#039;&#039; that the center of every new body part is placed in the same way as the center of the corresponding body part of the &amp;quot;posed&amp;quot; Oni character. To see the centers of &#039;&#039;all&#039;&#039; body parts of the Oni character, all at once, just select all of its meshes, and either select &amp;quot;Center&amp;quot; in the &amp;quot;Select&amp;quot; panel, top right, or check &amp;quot;Centers&amp;quot; in the drop-down &amp;quot;eye&amp;quot; menu, in the viewport.&lt;br /&gt;
#Basically, the only thing that you will be doing is: reparenting the bodyparts of the new character to each other (by drag-and-dropping them in the &amp;quot;Explorer/Scene_Root&amp;quot; viewport), and matching the translations and rotations of their respective centers to the centers of their counterparts in the posing mesh, which we know to be correct. Therefore, make sure that &amp;quot;Center&amp;quot; is selected the whole time: we are &#039;&#039;not&#039;&#039; moving the meshes themselves, only redefining their relation to each other and their local frames of reference. Some of the matching can be done automatically, but it won&#039;t always work, so be ready to copy some values by hand, from one mesh to the other.&lt;br /&gt;
#The basic order in which you proceed is this.&lt;br /&gt;
#*Select the new pelvis. It already overlaps with the &amp;quot;posing&amp;quot; pelvis, and it needs no parent. The only thing that&#039;s wrong with it is the position and rotation of its center. So, what you do is, you select the new pelvis (or rather its &amp;quot;Center&amp;quot;), and then in the drop-down Transform menu, click &amp;quot;Match all transforms&amp;quot;, and immediately pick the pelvis of the posing Oni character (in &amp;quot;Explorer&amp;quot;). This should make the center of the new pelvis collapse onto the center of the posing pelvis, which is where we want it to be.&lt;br /&gt;
#*Actually it seems that, in the latest version of ModTool, the automating matching of transformations is done in global coordinates, not in the local frame of reference. ([[User:geyser|IIRC]], in previous versions of XSI, it was possible to match transforms in the &amp;quot;Local&amp;quot; sense.) This means that the rotation will probably match correctly, but the translations will typically be off, so you may have to copy them manually.&lt;br /&gt;
#*Basically, after you &amp;quot;Match all transforms&amp;quot;, check the orientation of the new pelvis&#039;s center (the triplet of Euler angles in the &amp;quot;Transform&amp;quot; panel, and the color-coded axes sticking out of the center, in the viewport). Make sure that the axes look the same as for the posing pelvis. If the Euler angles look different but the axes look OK, then you are probably looking at equivalent Euler angles.&lt;br /&gt;
#*Now, select the left thigh (which is not parented to the new pelvis yet). Drag and drop it into the new pelvis in the &amp;quot;Explorer&amp;quot; viewport (i.e., reparent it). Normally, no meshes should move when you do this. But if you move or rotate the center of the new pelvis now, the new left thigh will also move and rotate, because it is already relative to the pelvis. This is why you need to do the pelvis first.&lt;br /&gt;
#*There is still one thing wrong with the left thigh, and that is the placement and rotation of its center - it is still, e.g., at the world&#039;s origin (in this pose), and we want it to be where the center of the posing left thigh is. So, we select the new left thigh&#039;s center, then choose &amp;quot;Match all transforms&amp;quot; in the Transform drop-down, and pick the &amp;quot;posing&amp;quot; left thigh in &amp;quot;Explorer&amp;quot;. Same as above, check the rotation (Euler angles and local axes), and fix the translation manually if needed. Now our new left thigh should also be OK.&lt;br /&gt;
#*All the other body parts are done the same way. Be sure to proceed from the root of the hierarchy to the extremities, and check your results from time to time. Make sure you don&#039;t match the posing body parts to the new body parts instead of the other way round. In other words, look carefully at the first steps detailed above, and make sure that you know what you&#039;re doing.&lt;br /&gt;
All of the above is done in ModTool. I have no idea about how you&#039;d do this in Blender, never tried. [[User:Geyser|AFAIK]], not only is Blender incapable of matching transforms in the local sense, but manual setting of transforms can be done in the global sense only. This means that you would probably need to reduce the new model to Oni&#039;s neutral pose, or use a skeleton.&lt;br /&gt;
&lt;br /&gt;
====Making joints look nice====&lt;br /&gt;
Apart from the consideration regarding the pose (see above), you should be aware of the specific nature of Oni&#039;s body parts.&lt;br /&gt;
Have a good look at an Oni model before you import a new one. Especially look at the generous overlaps between the body parts.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re importing a skinned character, you may have to completely remodel the following regions: elbows, knees, waist, diaphragm.&lt;br /&gt;
E.g., it&#039;s not enough to just cut the leg at the knee. Both the thigh part and the calf part should wrap around the knee joint, and intersect with the other mesh over about 1 world unit (10 cm). Same for the elbow.&lt;br /&gt;
&lt;br /&gt;
The bulk of the shoulder parts (except for Barabas, who doesn&#039;t have any) is supposed to bridge the gap between the chest and the arms for the more &amp;quot;extreme&amp;quot; kind of animations. Oni&#039;s characters mostly use capsule-shaped primitives for shoulders, so if your new model doesn&#039;t have anything that you can use, you can always borrow shoulder parts from an Oni thug, or whoever.&lt;br /&gt;
&lt;br /&gt;
As for the spine, large overlaps (and clever overall decomposition into pelvis/mid/chest) are needed to allow for the extreme bending of the spine (think [[Backbreaker]]).&lt;br /&gt;
Feet and fists can be resolved rather easily (you just extrude them a bit towards the calf/wrist), but you should also mind such things as two-handed aiming overlays.&lt;br /&gt;
&lt;br /&gt;
====Working example====&lt;br /&gt;
{|align=right&lt;br /&gt;
|http://geyser.oni2.net/edition/characters/gally/GLB_shot.png&lt;br /&gt;
|}&lt;br /&gt;
For the sake of this sorta tutorial, we shall pretend three things:&lt;br /&gt;
*Berserker Gally from GUNNM Martian Memory (a PSX game) is, like, the coolest model ever (see picture on the right);&lt;br /&gt;
*we want to make into, like, the coolest Oni character mod ever made, or die trying;&lt;br /&gt;
*as the provider of the (ripped) model, I am not your &amp;lt;strike&amp;gt;bitch&amp;lt;/strike&amp;gt; housemaid (meaning that, although I &#039;&#039;could&#039;&#039; rip an OniSplit-ready DAE or even an Oni-ready TRBS, I will &#039;&#039;not&#039;&#039;);&lt;br /&gt;
*as the writer of the tutorial, I am not your maid either (maybe I could explain it better, with screenshots at every step, but then you wouldn&#039;t suffer, and you wouldn&#039;t learn half as well).&lt;br /&gt;
We shall proceed in steps. The ripped model is provided as-is [http://geyser.oni2.net/edition/characters/gally/GLB_ripped.zip HERE] (well, not really as-is; I roundtripped it through 3D Exploration)&lt;br /&gt;
#Start a &amp;quot;File/New scene&amp;quot; in XSI, and open this thing with &amp;quot;File/Import/OBJ file&amp;quot;. In an &amp;quot;Explorer&amp;quot; window you shall see that there are 15 &amp;quot;bone-something&amp;quot; objects, and 19 &amp;quot;part-something&amp;quot; objects.&lt;br /&gt;
#Don&#039;t go thinking that the 19 &amp;quot;parts&amp;quot; are the ones you need for Oni, because they&#039;re not. They&#039;re just meshes. As you will soon find out,&lt;br /&gt;
#*there are no shoulder parts,&lt;br /&gt;
#*parts 7 to 11 part all belong to the head,&lt;br /&gt;
#*part 18 is pelvis, mid and chest combined, and&lt;br /&gt;
#*the open hands are in a separate OBJ file.&lt;br /&gt;
#There is a bunch of basic things that you want to do before actually adapting this character for Oni&lt;br /&gt;
##The first thing you want to do is combine the head meshes into one. Just comment out the &amp;quot;g&amp;quot; tags for parts 8 through 11, in the OBJ file, and you should get [http://geyser.oni2.net/edition/characters/gally/GLB_merged.zip THIS]. Reimport it into a new scene, and see what changed.&lt;br /&gt;
##Don&#039;t mind the &amp;quot;bone&amp;quot; objects for now. I just happened to include them in the rip, but I&#039;m not sure why.&lt;br /&gt;
##Sooner or later you&#039;ll want to select all the objects (or just &amp;quot;Select all&amp;quot; and deselect the light and camera) and rotate them by -90° along X, so that Gally is upright.&lt;br /&gt;
#Now you want to split the body mesh (part 18) into three parts and to add some placeholder meshes for the shoulders.&lt;br /&gt;
##The shoulders you can get from Barabas. Drop his DAE into the &amp;quot;Scene_Root&amp;quot;, reparent the shoulders to &amp;quot;Scene_Root&amp;quot;, delete the rest of Barabas, and then scale/move the shoulders around until they fit inside Gally&#039;s chest. Try to keep them symmetric.&lt;br /&gt;
##As for the splitting, here is what you do. You duplicate part 18, twice, then hide all the duplicates but one, delete faraway polys, move the adjacent vertices around a bit, and then close the mesh with new polygons (N for making a new triangle, then Esc and Ctrl+Shift+A before creating a new one, to avoid making a quad). While you&#039;re editing the body, you may notice that some quads were apparently triangulated even though they are not perfectly flat, and the triangulation is not done the same way on both sides of the body. You can fix it now (Dissolve, Subdivide, re-Dissolve), or you can save it for later.&lt;br /&gt;
##When you&#039;re done, you can add the hand meshes from the extra OBJ file. To place them correctly, you can use the coordinates of the tips of &amp;quot;bone_4&amp;quot; and &amp;quot;bone_7&amp;quot; (aha! I knew they&#039;d come in handy)&lt;br /&gt;
##When you&#039;re done with that too, you want to get her ready for a &amp;quot;matching session&amp;quot; with an Oni character such as Konoko. Select all objects, then &amp;quot;Freeze all transforms&amp;quot; (from the drop-down menu of the &amp;quot;Transform&amp;quot; panel), then scale the whole bunch by 2 along all axes (don&#039;t ask, just do it), and &amp;quot;Freeze all transforms&amp;quot; again.&lt;br /&gt;
##Now every object (including Barabas&#039;s shoulders) has unit scaling, 0 rotation and 0 translation. Since all the meshes are parented to the scene root, &amp;quot;0 rotation and 0 translation&amp;quot; means that all their centers are at the world&#039;s origin, and the axes of the centers are aligned with the world axes (you can check that by switching to &amp;quot;Center&amp;quot; in the &amp;quot;Select&amp;quot; panel, or by enabling the drawing of Centers in the &amp;quot;eye&amp;quot; drop-down menu of any viewport). If you haven&#039;t done it already, you can rename the &amp;quot;part-something&amp;quot; meshes to the standard names used by OniSplit.&lt;br /&gt;
#Now is a good time to save your work, either as an XSI scene or model, or as Collada. I prefer Collada for some reason, but you must be careful to export only the selection (you don&#039;t want the &amp;quot;Scene_Root&amp;quot; to be exported, or the camera, or the light). Just select all the objects (including the &amp;quot;bone-somethings&amp;quot;, because they might come in handy again), then &amp;quot;File/Crosswalk/Export&amp;quot;, set the exported type to COLLADA, the filename to something sensible, and in the Settings, make sure that &amp;quot;Selection Only&amp;quot; and &amp;quot;Keep Referenced Paths Relative&amp;quot; are ON, and that &amp;quot;Verbose&amp;quot; and &amp;quot;XSI Extra&amp;quot; are OFF. You should get something like [http://geyser.oni2.net/edition/characters/gally/GLB_almost.zip THIS] (tweaked a bit in a text editor, to remove the link to TXMPTextures_babamid, and to make the hands and the rest of Gally use the same material GLB).&lt;br /&gt;
#Now there&#039;s only a few things left to do. Our last step will be the &amp;quot;matching&amp;quot; of Gally&#039;s body parts to those of a modified Konoko. But before that, there are some preliminaries.&lt;br /&gt;
##Start a new scene in XSI, and drag-drop the Gally you just saved into it. Delete the fists if you want to, and name everything according to OniSplit&#039;s standard, if you haven&#039;t already.&lt;br /&gt;
##Use OniSplit to &amp;quot;extract&amp;quot; &#039;&#039;&#039;ONCCkonoko_generic&#039;&#039;&#039; to .dae, with the &#039;&#039;&#039;-noanim&#039;&#039;&#039; tag, and drag-and-drop her into the same scene.&lt;br /&gt;
##*If you named Gally&#039;s meshes correctly, then Konoko&#039;s meshes will be disambiguated with a &amp;quot;2&amp;quot;. This is not a problem.&lt;br /&gt;
##*Note how the height of Konoko&#039;s pelvis (and hip joints) is consistent with Gally&#039;s. That&#039;s what the factor 2 was for.&lt;br /&gt;
##*Also note that Gally&#039;s upper body is rather small in proportion to her legs, and that her calves are slightly longer.&lt;br /&gt;
##Rotate Konoko&#039;s arms and shoulders to match Gally&#039;s pose. Try (0, +-65, 180) for shoulders and (0, +-65, 0) for arms.&lt;br /&gt;
##Now translate Konoko&#039;s body parts (&#039;&#039;not&#039;&#039; the centers) so that their centers match the supposed centers of Gally&#039;s.&lt;br /&gt;
##*Work from the pelvis down the tree, because if you move, e.g., &amp;quot;mid&amp;quot;, then all the upper body will move too. So, do &amp;quot;mid&amp;quot; first, and don&#039;t touch it afterward.&lt;br /&gt;
##*Use Gally&#039;s &amp;quot;skeleton&amp;quot; to pinpoint the supposed centers of her meshes. To see Konoko&#039;s centers while you move the objects, use the viewport&#039;s &amp;quot;eye&amp;quot; settings.&lt;br /&gt;
##*Shoulders, mid and chest can be tricky because the original Gally has no shoulders or mid, and chest has translation 0, unlike in Oni (probably the spine is meant only to twist, not to bend). Just try to place all those bones in proportion with the head-neck distance and approximate shoulder width (which is a bit narrower than Konoko&#039;s. Maybe it&#039;s better to use [[Shinatama Too]] instead of Konoko, here. In any case, don&#039;t be afraid to translate Konoko&#039;s body parts away from the original locations, as long as this &amp;quot;compact Konoko&amp;quot; gets close to Gally&#039;s proportions.&lt;br /&gt;
##*[http://geyser.oni2.net/edition/characters/gally/GLB_compact.zip HERE] is what you should get. Don&#039;t laugh too hard, and instead look at how well I matched the centers of Konoko&#039;s body parts with the tips of Gally&#039;s &amp;quot;bones&amp;quot;. The only thing that&#039;s wrong at this point is that the shoulder parts are too far from their centers, and may end up sticking out of Gally&#039;s chest or back. To fix this, you can move, scale and rotate those parts in any way you like. Just remember to &amp;quot;Freeze all transforms&amp;quot; when you&#039;re done, especially if you&#039;ve used scaling.&lt;br /&gt;
#When you&#039;re happy with the overlap, you are ready to match Gally&#039;s body parts to Konoko&#039;s; both in terms of hierarchy ([[TRIA]]) and in terms of relative placement ([[TRTA]]).&lt;br /&gt;
#*Switch to &amp;quot;Center&amp;quot; in the &amp;quot;Select&amp;quot; panel, select &amp;quot;pelvis&amp;quot; (Gally&#039;s), then click &amp;quot;Match all transforms&amp;quot; in the &amp;quot;Transform&amp;quot; drop-down, and pick &amp;quot;pelvis2&amp;quot; (Konoko&#039;s). Check the result by alternatively selecting &amp;quot;pelvis&amp;quot; and &amp;quot;pelvis2&amp;quot;. Look not only at the values in the &amp;quot;Transform&amp;quot; panel, but also, in any viewport, at the center (white circle) and the local axes (colored) lines. The rotation should be OK, but the translation may be off. If it is, just fix it manually, and check the result in the viewport, alternatively selecting &amp;quot;pelvis&amp;quot; and &amp;quot;pelvis2&amp;quot; until you&#039;re sure that both centers are the same.&lt;br /&gt;
#*When you&#039;re done with &amp;quot;pelvis&amp;quot;, move on to &amp;quot;left_thigh&amp;quot;. Until now it was a sibling of &amp;quot;pelvis&amp;quot;, and a child of &amp;quot;Scene_Root&amp;quot;. Now that &amp;quot;pelvis&amp;quot; is done, you can make &amp;quot;left_thigh&amp;quot; a child of &amp;quot;pelvis&amp;quot;, by drag-and-dropping it onto &amp;quot;pelvis&amp;quot; in the &amp;quot;Explorer&amp;quot; viewport. Then you need to match the relative transforms of this center with respect to the center of &amp;quot;pelvis&amp;quot;. Make sure &amp;quot;Center&amp;quot; is selected in the &amp;quot;Select&amp;quot; panel, then select &amp;quot;left_thigh&amp;quot;, choose &amp;quot;Match all transforms&amp;quot; in the &amp;quot;Transform&amp;quot; drop-down, and pick &amp;quot;left_thigh2&amp;quot; (Konoko&#039;s posing thigh). Again, the rotation will probably be correct, but the translation will probably be off, and you will have to fix it manually. Check the result by alternatively selecting &amp;quot;left_thigh&amp;quot; and &amp;quot;left_thigh2&amp;quot;, until you&#039;re happy.&lt;br /&gt;
#*Now that you&#039;ve gotten the idea, do the same for all the other body parts (reparent Gally&#039;s, and then match Gally&#039;s centers to Konoko&#039;s). Make sure you do one mesh at a time, and progress from the root of the tree (the pelvis) towards the extremities. Try not to forget any mesh, especially early on, or you will have to start over.&lt;br /&gt;
#When the reparenting and matching is over, you should get something like [http://geyser.oni2.net/edition/characters/gally/GLB_matched.zip THIS]. You can check that everything is OK simply by enabling the drawing of centers (either with the &amp;quot;eye&amp;quot; menu of a viewport, or with the &amp;quot;Center&amp;quot; filter), and then by alternatively middle-clicking &amp;quot;pelvis&amp;quot; and &amp;quot;pelvis2&amp;quot; (this selects the whole tree of either Gally, which we are unsure about, or the &amp;quot;compact Konoko&amp;quot;, which we know to be OK because we only tweaked her [[TRTA]] a bit). If the centers and the local axes look the same for both Gally and Konoko, then Gally is OK too. &lt;br /&gt;
#And that&#039;s it, we&#039;re done. Now select all of Gally&#039;s meshes (as a tree, with Ctrl+T or middle-click), export to Collada (&amp;quot;selection only&amp;quot;), import into Oni (DAE to TRBS, TGA to TXMP, ONCC from &#039;&#039;&#039;konoko_generic&#039;&#039;&#039; and TRMA from &#039;&#039;&#039;ninjabot_tx&#039;&#039;&#039;) and it should Just Work. And indeed it does. [http://geyser.oni2.net/edition/characters/gally/GLB_ready.zip HERE] is the input and [http://geyser.oni2.net/edition/characters/gally/level0_GUNNM.zip HERE] is the Oni-ready plugin (Windows only).&lt;br /&gt;
#If there&#039;s a problem with any of these steps, just say so. I&#039;m not sure how I could explain it any better without screenshots.&lt;br /&gt;
#This can be done in well under an hour - if you don&#039;t have to type a tutorial as you go, that is. Once you get the hang of this, you can save some time by completely skipping the &amp;quot;compact Konoko&amp;quot; part, and placing the new character&#039;s centers directly where you want them -- especially if the pose is as simple as this one, and/or if the model comes with a skeleton, or very clear anatomy, such as a robot. Challenges such as the [[AE:Iron Demon]] or the [[AE:BGI|BGI]] troopers/mecha come readily to mind, and could both use a tutorial.&lt;br /&gt;
&lt;br /&gt;
[[Category:Modding tutorials]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Blender&amp;diff=38813</id>
		<title>Blender</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Blender&amp;diff=38813"/>
		<updated>2022-11-20T23:46:49Z</updated>

		<summary type="html">&lt;p&gt;Delano762: Blender-specific OniSplit information&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Blender is a free and open-source program used for 3D modeling, animating, rigging, texturing, video editing, digital drawing, etc. It is the community&#039;s current 3D software of choice for modding Oni.&lt;br /&gt;
&lt;br /&gt;
==History of modding with Blender==&lt;br /&gt;
[[Mod Tool|XSI Mod Tool 7.5]], a free version of Autodesk Softimage from 2009, had the fewest problems in handling Oni&#039;s assets and animations, it was relatively easy to learn and use. Up until 2019, it was Oni community&#039;s 3D program of choice.&lt;br /&gt;
&lt;br /&gt;
Blender at that time had a notoriously bad user interface and couldn&#039;t handle DAE files very well. [[#Oni-specific_issues_with_Blender|Besides other problems]], most importantly the expected rotation order and up-axis were different between XSI and Blender.&lt;br /&gt;
&lt;br /&gt;
After an interface overhaul in version 2.80 Blender&#039;s user-friendliness and [http://oni.bungie.org/forum/viewtopic.php?pid=52588#p52588 support for vertex shading in DAE] was improved. At the same time more and more users had problems to run XSI on their PCs.&lt;br /&gt;
&lt;br /&gt;
By 2019 demands got louder to support Blender made animations. [[OniSplit]] received an update (&amp;lt;tt&amp;gt;-blender&amp;lt;/tt&amp;gt;) so it could read such animations. Also, rigging was never fully figured out in XSI so between 2020 and 2022 an [[Using the Rigify animation rig|animation rig]] tailor-fit for making Oni animations - alongside a new addon named [[BlenderOni]] - was created. It was the last nail in the coffin of XSI.&lt;br /&gt;
&lt;br /&gt;
==Tutorials and resources==&lt;br /&gt;
With the abundance of tutorials for Blender on YouTube, creating our own introductory material would be reinventing the wheel. So instead we recommend watching some of the tutorials listed below and trying to make small personal projects in order to get familiar with Blender, such as modeling simple objects like teddy bears or tables.&lt;br /&gt;
&lt;br /&gt;
General Blender basics:&lt;br /&gt;
* [https://www.youtube.com/watch?v=RG8qK5zPqgM Wolf&#039;s 45-Minute Crash Course for Blender Virgins] (don&#039;t be misled by the silly name - this is one of the best Blender basics tutorials out there; it&#039;s also good if you know your basics already and you want to find out if you&#039;ve missed anything)&lt;br /&gt;
&lt;br /&gt;
Modelling:&lt;br /&gt;
* [https://www.youtube.com/watch?v=1jHUY3qoBu8 Learn Low Poly Modeling in Blender 2.83 (Imphenzia)]&lt;br /&gt;
&lt;br /&gt;
Rigging:&lt;br /&gt;
* [https://www.youtube.com/watch?v=vKgH5zXIYmM Rigify (CGDive)]&lt;br /&gt;
&lt;br /&gt;
Documentation:&lt;br /&gt;
* Blender has excellent documentation, available [https://docs.blender.org/manual/en/dev/modeling/meshes/editing/face/index.html HERE]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
[[Image:Blender_2.8_Python_Tooltips.png|thumb]]&lt;br /&gt;
You may want to go to the preferences and switch on &#039;&#039;&#039;Python Tooltips&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Contrary to what you might expect, the &#039;&#039;&#039;Developer Extras&#039;&#039;&#039; do not give you additional Python functionality per se. Instead this option enables experimental Blender features.&lt;br /&gt;
&lt;br /&gt;
Related videos:&lt;br /&gt;
* [https://youtu.be/XqX5wh4YeRw?t=46 Python Crash Course for Blender! (Curtis Holt)]&lt;br /&gt;
* [https://www.youtube.com/watch?v=uahfuypQQ04 Blender 2.8 Addon Development Tutorial for Beginners (Jayanam)]&lt;br /&gt;
&lt;br /&gt;
==Animation rig with IK and FK==&lt;br /&gt;
Currently we have an animation rig available in the form of a Blender scene available [http://mods.oni2.net/node/388 HERE]. The rig was made by Geyser and Delano762, and a tutorial on how to use it is available [[Using the Rigify animation rig|HERE]]. The rig is based on the Rigify plugin for Blender and serves as the &#039;&#039;&#039;community&#039;s modern tool to create new character animations for Oni&#039;&#039;&#039;, featuring both Forward and Inverse Kinematics – an enormous improvement over the previous FK-only method of animating.&lt;br /&gt;
&lt;br /&gt;
This rig is intended to be used together with [[#BlenderOni|BlenderOni]], a Blender addon designed as a companion tool for it – &#039;&#039;&#039;without it, the rig is extremely difficult to set up, to the point of being almost useless.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The rig has the following capabilities (which come with Rigify by default, unless otherwise noted):&lt;br /&gt;
* Snapping to Oni animations through bone constraints controlled by the Z location of the objects in the Pose Matching layer (added feature)&lt;br /&gt;
* Inverse and Forward Kinematics (IK and FK)&lt;br /&gt;
* Snapping between IK and FK chains&lt;br /&gt;
* Function to snap IK hand controller rotation to the wrist bone, integrated into rig_ui.py (added feature)&lt;br /&gt;
* IK joint poles for specifying limb joints (elbows and knees) should be facing&lt;br /&gt;
* Sliders specifying how much the neck, head and FK limbs should retain their world space rotation – that is, Neck Follow, Head Follow and FK Limb Follow&lt;br /&gt;
* IK foot pivoting controllers around toes and the heel&lt;br /&gt;
* Root bone&lt;br /&gt;
&lt;br /&gt;
===Tutorial for creating animation rig===&lt;br /&gt;
If you want to create the above rig, and learn a bit about rigs, IK/FK, Rigify, Blender, bone layers, bone constraints, scripts, issues with Oni models and animations such as the rotation order being incompatible with Blender, see [[Creating an animation rig in Blender]].&lt;br /&gt;
&lt;br /&gt;
==BlenderOni==&lt;br /&gt;
BlenderOni is a Blender addon intended as an integral companion tool for the fan-made animation rig for Blender. It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, the vast majority of the addon&#039;s options can also be used for general Blender purposes.&lt;br /&gt;
&lt;br /&gt;
For more information on BlenderOni, please check its documentation page available [[BlenderOni|HERE]].&lt;br /&gt;
&lt;br /&gt;
==Blender-specific OniSplit information==&lt;br /&gt;
For detailed instructions on how to convert Oni assets to Blender-readable files, please check [[Importing_character_models#Blender-specific_OniSplit_information| Blender-specific OniSplit information.]]&lt;br /&gt;
&lt;br /&gt;
==Oni-specific issues with Blender==&lt;br /&gt;
===Rotation order===&lt;br /&gt;
The previous XSI process allowed us to get to work pretty quickly: you could simply export any animation from Oni as a COLLADA file using OniSplit, then import it to XSI and it would work (mostly) without any quirks. That is not the case with Blender. If you import any Oni animation into Blender as it is, the rotations will be all wrong.&lt;br /&gt;
&lt;br /&gt;
That&#039;s because Oni&#039;s rotations are stored in XYZ Euler rotation order, while Blender&#039;s XYZ is actually ZYX despite being called &amp;quot;XYZ&amp;quot;; this is because Blender reads the Euler angles [https://docs.blender.org/manual/en/latest/advanced/appendices/rotations.html from the bottom of the hierarchy] rather than the top. In other words, Oni reads XYZ starting with X, while Blender starts with Z.&lt;br /&gt;
&lt;br /&gt;
You can demonstrate this by simply switching the rotation order of the body parts from XYZ to ZYX, as shown below. The image on the left shows KONCOMcomb_p imported to Blender without any adjustments, with the rotation order set to Blender&#039;s default &amp;quot;XYZ&amp;quot;, while the image on the right shows the same animation after switching the rotation order to ZYX.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! KONCOMcomb_p in Blender&#039;s XYZ !! KONCOMcomb_p in ZYX&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ARB KONCOMcomb p XYZ.png|500px|frameless]]&lt;br /&gt;
| [[Image:ARB KONCOMcomb p ZYX.png|500px|frameless]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Because of this, geyser implemented the &#039;&#039;&#039;-blender&#039;&#039;&#039; argument in OniSplit, which solves this problem by converting Oni assets&#039; rotation order from XYZ to quaternions and then to ZYX, and vice versa when exporting assets from Blender to Oni. So that conversion flow looks as follows:&lt;br /&gt;
&lt;br /&gt;
*From Oni to Blender:&lt;br /&gt;
XYZ → Quaternions → ZYX&lt;br /&gt;
&lt;br /&gt;
*From Blender to Oni:&lt;br /&gt;
ZYX → Quaternions → XYZ&lt;br /&gt;
&lt;br /&gt;
To summarize: &#039;&#039;&#039;Always use the -blender argument when you&#039;re exporting assets from Oni to Blender&#039;&#039;&#039;, otherwise you can expect the problem shown in the above screenshots.&lt;br /&gt;
&lt;br /&gt;
===Differing up-axis===&lt;br /&gt;
To be expanded on later: Oni&#039;s &amp;quot;up&amp;quot; axis is Y, Blender&#039;s is Z.&lt;br /&gt;
&lt;br /&gt;
===Units===&lt;br /&gt;
To be expanded on later: Oni&#039;s units are in the imperial system, not the metric one, though the 0.1-meter unit used by OniSplit is a good approximation of Oni&#039;s actual world unit of 4 inches.&lt;br /&gt;
&lt;br /&gt;
===Lack of textures on animated models===&lt;br /&gt;
&#039;&#039;&#039;Currently there is no option in OniSplit for exporting animated models with textures in a way that Blender will import.&#039;&#039;&#039; While you don&#039;t need textures for animating, they are very useful, particularly in the case of Oni; the models are low-detail to a point where you can lose sense of which direction elbows and knees are facing if you don&#039;t have the textures on. &lt;br /&gt;
&lt;br /&gt;
Because there is no option to export animated models with textures, &#039;&#039;&#039;the current workaround for that is to import an unanimated model with textures, then import an animated model,&#039;&#039;&#039; and either copy materials from the unanimated model to the animated one (the faster method), or set the materials on the animated model manually in the Shading tab.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Copying materials&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ABR_Copying_materials.png|200px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Alpha transparency issue===&lt;br /&gt;
You will also most likely need to set the Shading settings on some of the body parts of a non-animated model in order to fix alpha transparency issues (much like in XSI); specifically, you&#039;ll need to connect the Alpha parameter of the Base Color node to any parameter in Principled BSDF that will work, such as Emission Strength (this should be set up differently as that&#039;s technically incorrect, but I don&#039;t know how to do so at this moment).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Konoko upon importing to Blender !! Fixed transparency&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ABR Konoko broken alpha.png|200px|frameless|center]] || [[Image:ABR_Konoko_fixed_alpha.png|200px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Wanted==&lt;br /&gt;
Except for sounds, textures and text-oriented resources, Blender has the potential to be THE editor for Oni. Its powerful Python support is very useful for customization.&lt;br /&gt;
&lt;br /&gt;
Additional imports/exports, XML/.oni file creation and configurations should be automated, and customization should be used to streamline workflows as much as possible. Tools in the form of addons should allow users to be artists instead of coders, speeding up development of the actual projects.&lt;br /&gt;
&lt;br /&gt;
A successful modding community requires not one of these points, but all of them: documentation, tools and tutorials.&lt;br /&gt;
&lt;br /&gt;
===Level editor===&lt;br /&gt;
* core geometry&lt;br /&gt;
* pathfinding&lt;br /&gt;
* &amp;quot;furniture&amp;quot; (OFGA) creation/placement&lt;br /&gt;
* editing of CJBO&lt;br /&gt;
* special gunk flag placement&lt;br /&gt;
* basic level shading (vertex shading)&lt;br /&gt;
* advanced level shading for OniX?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OFGA library&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Objects that are used pretty often should be provided either by Blender Asset Browser or by a customized solution.&lt;br /&gt;
* Blender Asset Browser video demo: https://www.youtube.com/watch?v=gJC0y6HqyAU&lt;br /&gt;
&lt;br /&gt;
===BSL editor===&lt;br /&gt;
Most events in Oni are fired using trigger volumes. There should be an editor to open the code of a trigger volume as soon as it&#039;s selected in Blender.&lt;br /&gt;
&lt;br /&gt;
Also, character functions should editable when you select a character.&lt;br /&gt;
&lt;br /&gt;
The editor should be context-sensitive to:&lt;br /&gt;
* level geometry: atmosphere, save points, win level, lose level&lt;br /&gt;
* objects: scripting of static and animated objects (cutscene editor)&lt;br /&gt;
* particle scripting&lt;br /&gt;
* character: after selecting a character there should be a button visible to edit the ONCC, TRBS, animations and textures (GIMP/Photoshop).&lt;br /&gt;
&lt;br /&gt;
===Character editor===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Character library&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
There should be a way to place characters or character placeholders so that character collections (BINACHAR) can be saved to disk based on their positioning in the level model.&lt;br /&gt;
&lt;br /&gt;
===Animation editor===&lt;br /&gt;
The core would be BlenderOni that is called as soon as a user chooses to create or edit an animation. It could be extended to edit TRAC.&lt;br /&gt;
&lt;br /&gt;
===Particle editor===&lt;br /&gt;
A particle editor has been always missing in the community.&lt;br /&gt;
&lt;br /&gt;
===Testing and publishing support===&lt;br /&gt;
There should be some linking to Vago and AEI for package creation and quick starting of levels for testing.&lt;br /&gt;
&lt;br /&gt;
A secondary Oni installation could serve as a developer environment where only one level is present at a time. With OniX, it could be made possible to skip the menu UI and automatically load the current project.&lt;br /&gt;
 &lt;br /&gt;
[[Category:Bi-platform modding tools]][[Category:Completed modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Importing_character_models&amp;diff=38812</id>
		<title>Importing character models</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Importing_character_models&amp;diff=38812"/>
		<updated>2022-11-20T23:43:06Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Blender-specific OniSplit information, formatting plus images */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article covers the importing of new character models into Oni, but also how to export models from Oni. Generally speaking, you are going to want to use [[wikipedia:COLLADA|COLLADA]] as the &amp;quot;passthrough&amp;quot; format between your 3D program and Oni, as this is exactly what COLLADA was designed for. In this article, COLLADA is referred to as &amp;quot;Collada&amp;quot; (because who enjoys being shouted at?), or by &amp;quot;.dae file&amp;quot; (because that is the file suffix for COLLADA).&lt;br /&gt;
&lt;br /&gt;
==Modding tools==&lt;br /&gt;
===OniSplit===&lt;br /&gt;
This is the program that we use to get models into and out of Oni. It is a command line tool. There are GUI wrappers for OniSplit that cover most of its functions (see [[Vago (tool)]], but modders sometimes have to call it from the command line (or use the direct command line input feature in a GUI) to take full advantage of OniSplit&#039;s abilities.&lt;br /&gt;
&lt;br /&gt;
===3D programs===&lt;br /&gt;
====Blender====&lt;br /&gt;
[[Blender]] is the community&#039;s current 3D software of choice, allowing for 3D modeling, animating, and more.&lt;br /&gt;
&lt;br /&gt;
Blender rocks when it comes to [[Lightmapping levels|lightmapping levels]]. XSI is closed source and can only lightmap one mesh at a time with one lightmap texture per mesh. Blender is more flexible because of its free-for-all scripting API, and a nice touch is that it supports radiosity, i.e., emissive materials -- and that&#039;s exactly how Oni&#039;s lighting was done initially (see [[OBLS]]).&lt;br /&gt;
&lt;br /&gt;
====XSI====&lt;br /&gt;
Softimage XSI is a Windows-only 3D software that went discontinued in 2014, and [https://www.moddb.com/downloads/autodesk-softimage-mod-tool-75 a free version of it from 2008] used to to be the community&#039;s modding tool of choice before moving on to Blender. A number of Oni-related addons, tools and tutorials were developed for it can be still found and used. It has detailed documentation and is versatile, whether working with characters or levels, though highly obsolete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===File converters===&lt;br /&gt;
====Autodesk FBX====&lt;br /&gt;
Check out {{AutodeskFBX}} (primarily the FBX converter) if your tool can reliably import/export FBX but has trouble with Collada.&lt;br /&gt;
&lt;br /&gt;
==Basic importing and exporting==&lt;br /&gt;
===Exporting from Oni to Collada===&lt;br /&gt;
OniSplit allows you to export .dae files from both [[TRBS]] and [[ONCC]]. Though all the 3D data is in the TRBS, the textures are listed in the [[TRMA]] file, which is only visible from the ONCC, not the TRBS. Thus, if you want to use the textures while editing the model, convert the ONCC, not the TRBS, into Collada. The instructions below assume that you want the textured model, and thus illustrate how to export the ONCC.&lt;br /&gt;
&lt;br /&gt;
First, you need to find the class name for the character you want to export. You can accomplish this by going into Oni, loading the level in which the desired character appears, and then enabling the shapeshifter cheat -- but you have to do this by turning on [[Developer Mode]], not by entering the &amp;quot;shapeshifter&amp;quot; cheat code, because the regular cheat code does not display the console output that you need. Once Dev Mode is on, press F8 until you reach the desired character. You should see the message &amp;quot;character class &#039;&#039;number&#039;&#039; &#039;&#039;&#039;&#039;&#039;string&#039;&#039;&#039;&#039;&#039;&amp;quot;. The number is unimportant, but write down the string, because that is the class name which provides the basis for the names of the ONCC and TRBS.&lt;br /&gt;
&lt;br /&gt;
In this example, we&#039;ll export one of Konoko&#039;s models. For Konoko, we don&#039;t even need to open Oni to find the name of an ONCC because we have [[Konoko#In-game_outfits|this handy table]]. Let&#039;s use Konoko in her police uniform; you can see from the table that this is ONCCk3 and that it&#039;s found in level2_Final.&lt;br /&gt;
&lt;br /&gt;
Next, you need to decide on the pose in which your character will be exported. See the &amp;quot;Poses&amp;quot; section below for guidance. Without making this example more complicated, we only have two choices for pose: default (folded) and -noanim (standing at attention); we are going to use the second option, for a more visually pleasing result. Here are the steps for getting your desired character in .dae format. Substitute backward slashes for forward ones if you are in Windows.&lt;br /&gt;
&lt;br /&gt;
:1. Create a couple of folders in a convenient place. One folder will receive a whole bunch of files, and the second folder will hold the exported model. We&#039;ll call these paths &amp;quot;splitOutput/&amp;quot; and &amp;quot;modelOutput/&amp;quot; respectively.&lt;br /&gt;
:2. On the command line, go to the directory &amp;quot;Oni/GameDataFolder/&amp;quot;, where &amp;quot;Oni/&amp;quot; means the path to your game.&lt;br /&gt;
:3. Split the desired level&#039;s data into its component resources with OniSplit. Where you see just &amp;quot;onisplit&amp;quot; in the following commands, you should take that to mean &amp;quot;C:\path\to\OniSplit.exe&amp;quot; in Windows or &amp;quot;mono /path/to/OniSplit.exe&amp;quot; on Macs (Mono is a third-party package that you need to run .NET applications in macOS):&lt;br /&gt;
::&amp;lt;tt&amp;gt;onisplit -export splitOutput/ level2_Final.dat&amp;lt;/tt&amp;gt;&lt;br /&gt;
:4. Convert the desired character&#039;s model data into Collada:&lt;br /&gt;
::&amp;lt;tt&amp;gt;onisplit -extract:dae modelOutput/ -noanim splitOutput/ONCCk3.oni&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create the file &#039;&#039;&#039;ONCCk3.dae&#039;&#039;&#039;, and its supporting textures in TGA format, in modelOutput/. Note that only the highest level of detail (LOD) model will be exported using this method. See [[XML:TRBS]] for a method which exports all 5 LOD models.&lt;br /&gt;
&lt;br /&gt;
Note that if you want to extract the model with a pose besides folded or -noanim, you need to have the animation data (the [[TRAC]] and [[TRAM]] .oni files) in the same folder as the model data (the ONCC and its related files). In vanilla (un-modded) Oni, animations for many characters (including Konoko) are only in level0_Final, and, as you saw above, model data is found in whichever level that character appears in. Extracting a model in the pose of your choice will be simpler if you have the [[AE]] installed, as it globalizes character data, placing it all in the level0_Final files in the AE&#039;s GameDataFolder. With vanilla Oni, you will have to split both level0_Final and level&#039;&#039;x&#039;&#039;_Final and then combine their files into one folder before you can perform the &amp;quot;-extract:dae&amp;quot; operation using the &amp;quot;-anim&amp;quot; tag that is discussed below.&lt;br /&gt;
&lt;br /&gt;
===Importing from Collada into Oni===&lt;br /&gt;
When importing characters, the simplest method is to generate a whole body set ([[TRBS]]) from one .dae file. To convert your 3D model, let&#039;s say that you saved it in Collada format with the name &amp;quot;TRBSnewchar.dae&amp;quot;. Run the command:&lt;br /&gt;
:&amp;lt;tt&amp;gt;onisplit -create:trbs DAEtoONI/ TRBSnewchar.dae&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create &#039;&#039;&#039;TRBSnewchar.oni&#039;&#039;&#039; in the folder DAEtoONI. Because it was created from a single .dae file, this TRBS will contain 5 identical models for the 5 levels of detail (LOD) that Oni supports for each character. You have to import by XML in order to specify a different .dae for every LOD; see [[XML:TRBS]] for more info.&lt;br /&gt;
&lt;br /&gt;
Textures are currently ignored upon creating the TRBS (however, the TRBS will of course retain the changes you may have made to the UV coordinates if you were editing a model exported from Oni). Possibly a future version of OniSplit can automatically generate a TRMA and TXMPs if the .dae file has textures.&lt;br /&gt;
&lt;br /&gt;
Note that your file should be named appropriately if you want it to be looked up by name from one or more of Oni&#039;s existing ONCCs, or a new one of your own creation.&lt;br /&gt;
&lt;br /&gt;
To actually test the model in-game, you should [[Making a mod package|create a mod package]] for it, place the package in Oni/AE/packages/, and select it in the AE Installer. The older method of testing your work is to rebuild the level by running &amp;quot;onisplit -import&amp;quot; on a folder containing your TRBS and all the other .oni files for a level, but this only creates a set of level files that you can use on your computer, and is inherently a disorganized approach to keeping track of your work. Creating an AE package will allow you to share your work with other players.&lt;br /&gt;
&lt;br /&gt;
Please note that a final character mod package should contain multiple LOD models for your character. Filling all 5 slots with distinct models is not necessary; many modders create only two or three LOD models and fill the lower LOD slots with the simpler model(s) and the highest slot with the full-detail model, e.g.:&lt;br /&gt;
:# TRBSnewchar_low.dae&lt;br /&gt;
:# TRBSnewchar_low.dae&lt;br /&gt;
:# TRBSnewchar_mid.dae&lt;br /&gt;
:# TRBSnewchar_mid.dae&lt;br /&gt;
:# TRBSnewchar_high.dae&lt;br /&gt;
&lt;br /&gt;
An ONCC contains much more information than just links to TRBS and TRMA, and thus can not be generated automatically. See [[XML:ONCC]] on how to create such a file, and then import the character with this class data into Oni. The easiest way to try out an imported character in Oni is to name your imported TRBS so that it replaces an existing one and no ONCC editing is needed. The next step up is to clone an existing ONCC (in XML) and modify it to link to your new TRBS file(s).&lt;br /&gt;
&lt;br /&gt;
==Blender-specific OniSplit information==&lt;br /&gt;
This section contains OniSplit commands specific to Blender, and related settings in Blender necessary for assets to work.&lt;br /&gt;
&lt;br /&gt;
===Blender settings for importing and exporting COLLADA files===&lt;br /&gt;
====Importing====&lt;br /&gt;
In the Collada Import Data Options, make sure to check Import Units. Failure to do so will result in scaling issues, which are not easy to fix.&lt;br /&gt;
&lt;br /&gt;
Before importing TRAM files, set the scene frame rate to 60fps.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Collada import settings !! Scene settings&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:BlenderImportSettings.png|200px|frameless|center]] || [[Image:BlenderSceneSettings.png|300px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
====Exporting====&lt;br /&gt;
When exporting TRBS, be sure to delete the default light and camera from the scene, or you can select all 19 body parts, then in the Export Main Tab, select Selection Only&lt;br /&gt;
&lt;br /&gt;
When exporting TRAM, select all 19 body parts, then in the Collada export options, under the Main Tab: select Selection Only, Geom Tab: select Triangulate, Anim Tab: select Curves.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Blender Collada export settings&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:BlenderColladaExportSettings.png|500px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Blender-specific OniSplit commands===&lt;br /&gt;
*Convert TRBS.oni to Blender compatible dae: &lt;br /&gt;
 -extract:&#039;&#039;&#039;dae&#039;&#039;&#039; To_blender -noanim -blender Original\TRBSkonoko_body_high.oni&lt;br /&gt;
&lt;br /&gt;
*Convert ONCC.oni to Blender compatible dae with textures: &lt;br /&gt;
&lt;br /&gt;
 -extract:&#039;&#039;&#039;dae&#039;&#039;&#039; To_blender -noanim -blender Original\ONCCkonoko_generic.oni&lt;br /&gt;
&lt;br /&gt;
Be sure to include the TMXP.oni files with the ONCC.oni file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Convert TRAM.oni to Blender compatible dae - &#039;&#039;&#039;textureless&#039;&#039;&#039;, as exporting animations with textured models does not work yet:&lt;br /&gt;
&lt;br /&gt;
 -extract:&#039;&#039;&#039;xml&#039;&#039;&#039; To_blender -anim-body:Original\TRBSkonoko_body_high.oni -blender Original\TRAMKONCOMkick_heavy.oni &lt;br /&gt;
&lt;br /&gt;
This will create a TRAM.dae along with an .xml file, which is needed for importing back to Oni. You will be also able to tell that everything went okay when you see&lt;br /&gt;
&amp;lt;mark&amp;gt;&amp;lt;tt&amp;gt;AnimationDaeWriter: custom axis conversion&amp;lt;/tt&amp;gt;&amp;lt;/mark&amp;gt;&lt;br /&gt;
on output. If you don’t, you’re most likely doing something wrong.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Convert TRBS.dae from Blender to .oni:&lt;br /&gt;
 -create:&#039;&#039;&#039;trbs&#039;&#039;&#039; From_blender -blender From_blender\TRBSkonoko_body_high.dae&lt;br /&gt;
&lt;br /&gt;
*Convert TRAM.dae from Blender to .oni&lt;br /&gt;
 -create From_blender -blender From_blender\TRAMKONCOMkick_heavy.xml&lt;br /&gt;
The TRAMKONCOMkick_heavy.xml links to the TRAMKONCOMkick_heavy.dae from Blender which needs to be in the same location as the .xml file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshooting===&lt;br /&gt;
&lt;br /&gt;
Known Issues between Blender 2.83 and OniSplit 0.9.99.2&lt;br /&gt;
&lt;br /&gt;
1) Importing a .dae file results in the following error message:&lt;br /&gt;
 &amp;quot;Schema validation (Error): Error: ERROR_REQUIRED_ATTRIBUTE_MISSING Element: technique, Attribute: sid&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Solution: Open the .dae file in a text editor, find all instances of &amp;lt;tt&amp;gt;&amp;lt;technique&amp;gt;&amp;lt;/tt&amp;gt; and replace with &amp;lt;tt&amp;gt;&amp;lt;technique sid=&amp;quot;common&amp;quot;&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Poses==&lt;br /&gt;
===Oni&#039;s default orientation===&lt;br /&gt;
This pose, where the body parts are all at zero rotation, is usually referred to in the community as the &amp;quot;folded pose&amp;quot;. The primary axis of a body part, in its own frame of reference, is X. When you move down an arm or leg, or up the spine, you are moving along the positive X direction of every body part.&lt;br /&gt;
When all the bones are aligned with their parents, you get something like this:&lt;br /&gt;
 14-o-13-o-12-o-11-o 3-o-2-o-1-o       ^ z&lt;br /&gt;
                   |           |       ^&lt;br /&gt;
            :)10-o-9-o-8-o-7-o-0  &amp;lt; &amp;lt; &amp;lt;^&amp;lt; &amp;lt; &amp;lt;&lt;br /&gt;
                   |           |   x   ^&lt;br /&gt;
 18-o-17-o-16-o-15-o 6-o-5-o-4-o       ^&lt;br /&gt;
This is a conventional reference used in all of Oni. For any animation of any character in Oni, the rotations of the body parts are calculated with respect to a default pose such as this one. This allows the characters to share animations, even if their &amp;quot;skeletons&amp;quot; ([[TRTA]]) have slightly different proportions.&lt;br /&gt;
&lt;br /&gt;
In the default pose, the XYZ axes of all the bones are oriented the same way. Thus, in the default pose, you can see the &amp;quot;true&amp;quot; translations (offsets) of every body part with respect to its parent, as stored in the &amp;quot;translation array&amp;quot; (TRTA). For example, in Konoko&#039;s case, the &amp;quot;mid&amp;quot; section (part 7), is translated by 1.67 WU along X (i.e., 16.7 cm towards the top of the spine), and by 0.25 along Y (i.e., 2.5 cm towards the front of the spine). Remember that this translation is &#039;&#039;in the &amp;quot;local&amp;quot; frame of reference of the pelvis&#039;&#039;, i.e., with respect to the &#039;&#039;origin&#039;&#039; of the pelvis &#039;&#039;and&#039;&#039; to its local XYZ axes (which are generally different from the world axes). Basically, the local X of the pelvis always points up the spine, the local Y points forward, the local Z points left, and the same goes for &amp;quot;mid&amp;quot;, &amp;quot;chest&amp;quot;, &amp;quot;neck&amp;quot;, and &amp;quot;head&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===-noanim pose===&lt;br /&gt;
[[Image:Konoko_bodyparts.png|thumbnail|right|283px]]&lt;br /&gt;
Supplying the &#039;&#039;&#039;-noanim&#039;&#039;&#039; switch to OniSplit yields the &amp;quot;standing at attention&amp;quot; pose, a much less visually awkward pose than the default &amp;quot;folded pose&amp;quot;. Note that &amp;quot;-noanim&amp;quot; goes in between the destination directory and the source file name:&lt;br /&gt;
:&#039;&#039;&#039;onisplit -extract:dae modelOutput/ -noanim ONCCkonoko_generic.oni&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The result will look something the picture on the right, but the model will have her legs together and her arms by her side.&lt;br /&gt;
&lt;br /&gt;
To produce this pose, these rotations are used:&lt;br /&gt;
:(0,90,90) for the pelvis&lt;br /&gt;
:(0,180,0) for both thighs&lt;br /&gt;
:(90,90,90) for the left shoulder&lt;br /&gt;
:(-90,-90,90) for the right shoulder&lt;br /&gt;
:(0,90,0) for the left biceps&lt;br /&gt;
:(0,-90,0) for the right biceps&lt;br /&gt;
:(-90,0,0) for the left hand/fist&lt;br /&gt;
:(90,0,0) for the right hand/fist&lt;br /&gt;
:(0,0,0) for all other parts&lt;br /&gt;
The placement of the pelvis is adjusted for Konoko, so that the soles of her feet are at Y=0. For male characters the feet will be at Y&amp;lt;0.&lt;br /&gt;
&lt;br /&gt;
===Idle pose===&lt;br /&gt;
If you use &#039;&#039;&#039;-extract:dae TargetFolder ONCCkonoko_generic.oni&#039;&#039;&#039;, taking care that you have the TRAC/TRAM files next to the ONCC, OniSplit will look up the idle animation from the ONCC&#039;s TRAC and apply the rotations from the first frame of the animation to the body parts.&lt;br /&gt;
&lt;br /&gt;
Keep in mind that this idle pose exported by OniSplit is just an arbitrary natural-looking pose, as opposed to the default &amp;quot;folded&amp;quot; orientation or the &amp;quot;at attention&amp;quot; &#039;&#039;&#039;-noanim&#039;&#039;&#039; pose. A frame from an idle animation is certainly &#039;&#039;not&#039;&#039; a standard pose for you to match when importing a new model (unless you are swapping body parts between Oni characters that use the same idle pose, in which case you don&#039;t have to match anything anyway).&lt;br /&gt;
&lt;br /&gt;
===Any pose===&lt;br /&gt;
When exporting from ONCC, you can use the &#039;&#039;&#039;-anim&#039;&#039;&#039; tag to specify any TRAM, as long as it can be found in the character&#039;s TRAC (and as long as it&#039;s not an overlay animation). Or, you can just start from the -noanim or idle pose, and tweak the rotations to match any pose you like.&lt;br /&gt;
&lt;br /&gt;
==Things to try==&lt;br /&gt;
===Bastardizing===&lt;br /&gt;
This is possibly the easiest kind of modding, that doesn&#039;t require texturing skills or even, in most cases, attentive handling of poses and joints. The idea is to:&lt;br /&gt;
#take two Oni characters (for simplicity, two characters who use the same skeleton: e.g., the Konokos from {{C|13}} and {{C|10}})&lt;br /&gt;
#load both of them simultaneously into Mod Tool or Blender. In Mod Tool, just drag-and-drop the .dae files, but &amp;quot;Select none&amp;quot; (Ctrl+Shift+A) before you do, to make sure that you drop both into &amp;quot;Scene_Root&amp;quot;)&lt;br /&gt;
#reparent some body parts (rename if needed) and trim the rest (since the orientations and joint offsets match, you don&#039;t need to rotate/move anything)&lt;br /&gt;
#export, adapt the TRMA if needed, rebuild the level and play&lt;br /&gt;
This allows one to recombine Oni&#039;s characters into &amp;quot;new&amp;quot; ones very easily. Probably the easiest thing is to add sunglasses to any Konoko model ^_^ (or Konoko&#039;s head to any female character)&lt;br /&gt;
&lt;br /&gt;
===Cel-shading===&lt;br /&gt;
An effect similar to cel-shading can be obtained by enclosing the mesh in a shell painted in black and facing inwards.&lt;br /&gt;
:As of 0.9.8, OniSplit can perform this operation with every body part, in an automatic way, with one control parameter (a sorta &amp;quot;margin&amp;quot;, or effective thickness of the &amp;quot;shell&amp;quot;).&lt;br /&gt;
The syntax is as follows:&lt;br /&gt;
:&#039;&#039;&#039;FolderWhereOniSplitIs\OniSplit.exe -create:trbs TargetFolderForCreatedTRBS -cel FolderWhereTheModelIs\name_of_the_model.dae&#039;&#039;&#039;&lt;br /&gt;
:or &#039;&#039;&#039;FolderWhereOniSplitIs\OniSplit.exe -create:trbs TargetFolderForCreatedTRBS -cel:0.1 FolderWhereTheModelIs\name_of_the_model.dae&#039;&#039;&#039;&lt;br /&gt;
The &#039;&#039;&#039;-cel&#039;&#039;&#039; option enables the generation of the shell. The optional parameter (default 0.07) defines the thickness of the shell.&lt;br /&gt;
&lt;br /&gt;
Note that the shells may not be good-looking in every situation without some further tweaking. Rextract the TRBS or ONCC, tweak the shell, and reimport normally (without &#039;&#039;&#039;-cel&#039;&#039;&#039; this time).&lt;br /&gt;
:Some examples of automatically generated shells (not tweaked in any way) can be seen here: http://geyser.oni2.net/edition/celshading/&lt;br /&gt;
&lt;br /&gt;
===New models===&lt;br /&gt;
====Matching body part centers====&lt;br /&gt;
There is actually no such thing as a &amp;quot;standard&amp;quot; pose for 3D characters: the width of the stance, the stiffness of the spine, the angle at which the arms extend from the body - all that varies a lot between models. Therefore the model of your dreams (Gally, Master Chief, Eva-01, whatever) will typically come with a somewhat &amp;quot;random&amp;quot; pose, which has nothing to do with either Oni&#039;s default pose, or even with the &#039;&#039;&#039;-noanim&#039;&#039;&#039; &amp;quot;standard&amp;quot; exported by OniSplit. Another problem is that, if you roundtripped your character through OBJ (which doesn&#039;t support relative placement and rotation), then all the bones are essentially defined in world space, i.e., their centers are at the world&#039;s origin, and their axes are aligned with the world axes.&lt;br /&gt;
&lt;br /&gt;
What can we do about this? Here&#039;s what:&lt;br /&gt;
#First, make sure that the model that you want to import into Oni is split into 19 separate body parts, and that they overlap nicely even under extreme rotations (see below). The &amp;quot;extremes&amp;quot; are something that you can fix later, but you really need the character to be split into 19 body parts. If some of those parts are missing (e.g., [[Barabas]] has no visible shoulder parts), you will still need placeholder meshes (see Barabas as an example). So, get all those meshes ready, alongside each other, at the root of the scene (no hierarchy needed right now).&lt;br /&gt;
#Now, load an Oni character exported with OniSplit into the same scene. This character will be your posing figure, so make sure it is similar (in height and &amp;quot;width&amp;quot;) to the one that you want to import (i.e., don&#039;t use Konoko to match Master Chief, and don&#039;t use Barabas to match Gally). Tweak the rotations of the Oni character until it overlaps with the &amp;quot;random&amp;quot; pose of the new character.&lt;br /&gt;
#Sometimes you can&#039;t make everything overlap just with rotations, and in that case you have to actually translate bones with respect to their parents. By doing this you are actually modifying the skeleton of the Oni character, bringing it closer to the proportions of the new character. If this is the case, and if you want the new character to use Oni&#039;s animations, you will have to make sure that the length of the legs stays roughly the same. If the legs of the new character have about the same length as those of an Oni character (measured between the hip joint and the sole of the feet, or between the pelvis center and the sole of the feet), then the animations may look a bit different, but at least during basic stances and movements the feet will stay roughly in contact with the ground, not above or below.&lt;br /&gt;
#Now, you can inspect the Oni character, which you have posed in a way that is consistent with the &amp;quot;random&amp;quot; arrangement of the new body parts. Try selecting the body parts of the &amp;quot;posing&amp;quot; Oni character, one at a time, and inspect the values of the translation and rotation of the mesh with respect to its parent (i.e., &amp;quot;Local&amp;quot;), in the &amp;quot;Transform&amp;quot; panel (far right). Try switching to &amp;quot;Center&amp;quot; in the &amp;quot;Select&amp;quot; panel (top right corner), and inspect not only the values in the &amp;quot;Transform&amp;quot; panel, but also the color-coded local axes, which can be seen sticking out of the center of every selected mesh, in the viewport. Try to interpret all this, in terms of the &amp;quot;translation array&amp;quot; ([[TRTA]]) and Oni&#039;s conventional neutral pose (see above).&lt;br /&gt;
#The next (and last) step is to ensure that every part of the new character is parented correctly (the thighs to the pelvis, the calves to the thighs, etc), &#039;&#039;and&#039;&#039; that the center of every new body part is placed in the same way as the center of the corresponding body part of the &amp;quot;posed&amp;quot; Oni character. To see the centers of &#039;&#039;all&#039;&#039; body parts of the Oni character, all at once, just select all of its meshes, and either select &amp;quot;Center&amp;quot; in the &amp;quot;Select&amp;quot; panel, top right, or check &amp;quot;Centers&amp;quot; in the drop-down &amp;quot;eye&amp;quot; menu, in the viewport.&lt;br /&gt;
#Basically, the only thing that you will be doing is: reparenting the bodyparts of the new character to each other (by drag-and-dropping them in the &amp;quot;Explorer/Scene_Root&amp;quot; viewport), and matching the translations and rotations of their respective centers to the centers of their counterparts in the posing mesh, which we know to be correct. Therefore, make sure that &amp;quot;Center&amp;quot; is selected the whole time: we are &#039;&#039;not&#039;&#039; moving the meshes themselves, only redefining their relation to each other and their local frames of reference. Some of the matching can be done automatically, but it won&#039;t always work, so be ready to copy some values by hand, from one mesh to the other.&lt;br /&gt;
#The basic order in which you proceed is this.&lt;br /&gt;
#*Select the new pelvis. It already overlaps with the &amp;quot;posing&amp;quot; pelvis, and it needs no parent. The only thing that&#039;s wrong with it is the position and rotation of its center. So, what you do is, you select the new pelvis (or rather its &amp;quot;Center&amp;quot;), and then in the drop-down Transform menu, click &amp;quot;Match all transforms&amp;quot;, and immediately pick the pelvis of the posing Oni character (in &amp;quot;Explorer&amp;quot;). This should make the center of the new pelvis collapse onto the center of the posing pelvis, which is where we want it to be.&lt;br /&gt;
#*Actually it seems that, in the latest version of ModTool, the automating matching of transformations is done in global coordinates, not in the local frame of reference. ([[User:geyser|IIRC]], in previous versions of XSI, it was possible to match transforms in the &amp;quot;Local&amp;quot; sense.) This means that the rotation will probably match correctly, but the translations will typically be off, so you may have to copy them manually.&lt;br /&gt;
#*Basically, after you &amp;quot;Match all transforms&amp;quot;, check the orientation of the new pelvis&#039;s center (the triplet of Euler angles in the &amp;quot;Transform&amp;quot; panel, and the color-coded axes sticking out of the center, in the viewport). Make sure that the axes look the same as for the posing pelvis. If the Euler angles look different but the axes look OK, then you are probably looking at equivalent Euler angles.&lt;br /&gt;
#*Now, select the left thigh (which is not parented to the new pelvis yet). Drag and drop it into the new pelvis in the &amp;quot;Explorer&amp;quot; viewport (i.e., reparent it). Normally, no meshes should move when you do this. But if you move or rotate the center of the new pelvis now, the new left thigh will also move and rotate, because it is already relative to the pelvis. This is why you need to do the pelvis first.&lt;br /&gt;
#*There is still one thing wrong with the left thigh, and that is the placement and rotation of its center - it is still, e.g., at the world&#039;s origin (in this pose), and we want it to be where the center of the posing left thigh is. So, we select the new left thigh&#039;s center, then choose &amp;quot;Match all transforms&amp;quot; in the Transform drop-down, and pick the &amp;quot;posing&amp;quot; left thigh in &amp;quot;Explorer&amp;quot;. Same as above, check the rotation (Euler angles and local axes), and fix the translation manually if needed. Now our new left thigh should also be OK.&lt;br /&gt;
#*All the other body parts are done the same way. Be sure to proceed from the root of the hierarchy to the extremities, and check your results from time to time. Make sure you don&#039;t match the posing body parts to the new body parts instead of the other way round. In other words, look carefully at the first steps detailed above, and make sure that you know what you&#039;re doing.&lt;br /&gt;
All of the above is done in ModTool. I have no idea about how you&#039;d do this in Blender, never tried. [[User:Geyser|AFAIK]], not only is Blender incapable of matching transforms in the local sense, but manual setting of transforms can be done in the global sense only. This means that you would probably need to reduce the new model to Oni&#039;s neutral pose, or use a skeleton.&lt;br /&gt;
&lt;br /&gt;
====Making joints look nice====&lt;br /&gt;
Apart from the consideration regarding the pose (see above), you should be aware of the specific nature of Oni&#039;s body parts.&lt;br /&gt;
Have a good look at an Oni model before you import a new one. Especially look at the generous overlaps between the body parts.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re importing a skinned character, you may have to completely remodel the following regions: elbows, knees, waist, diaphragm.&lt;br /&gt;
E.g., it&#039;s not enough to just cut the leg at the knee. Both the thigh part and the calf part should wrap around the knee joint, and intersect with the other mesh over about 1 world unit (10 cm). Same for the elbow.&lt;br /&gt;
&lt;br /&gt;
The bulk of the shoulder parts (except for Barabas, who doesn&#039;t have any) is supposed to bridge the gap between the chest and the arms for the more &amp;quot;extreme&amp;quot; kind of animations. Oni&#039;s characters mostly use capsule-shaped primitives for shoulders, so if your new model doesn&#039;t have anything that you can use, you can always borrow shoulder parts from an Oni thug, or whoever.&lt;br /&gt;
&lt;br /&gt;
As for the spine, large overlaps (and clever overall decomposition into pelvis/mid/chest) are needed to allow for the extreme bending of the spine (think [[Backbreaker]]).&lt;br /&gt;
Feet and fists can be resolved rather easily (you just extrude them a bit towards the calf/wrist), but you should also mind such things as two-handed aiming overlays.&lt;br /&gt;
&lt;br /&gt;
====Working example====&lt;br /&gt;
{|align=right&lt;br /&gt;
|http://geyser.oni2.net/edition/characters/gally/GLB_shot.png&lt;br /&gt;
|}&lt;br /&gt;
For the sake of this sorta tutorial, we shall pretend three things:&lt;br /&gt;
*Berserker Gally from GUNNM Martian Memory (a PSX game) is, like, the coolest model ever (see picture on the right);&lt;br /&gt;
*we want to make into, like, the coolest Oni character mod ever made, or die trying;&lt;br /&gt;
*as the provider of the (ripped) model, I am not your &amp;lt;strike&amp;gt;bitch&amp;lt;/strike&amp;gt; housemaid (meaning that, although I &#039;&#039;could&#039;&#039; rip an OniSplit-ready DAE or even an Oni-ready TRBS, I will &#039;&#039;not&#039;&#039;);&lt;br /&gt;
*as the writer of the tutorial, I am not your maid either (maybe I could explain it better, with screenshots at every step, but then you wouldn&#039;t suffer, and you wouldn&#039;t learn half as well).&lt;br /&gt;
We shall proceed in steps. The ripped model is provided as-is [http://geyser.oni2.net/edition/characters/gally/GLB_ripped.zip HERE] (well, not really as-is; I roundtripped it through 3D Exploration)&lt;br /&gt;
#Start a &amp;quot;File/New scene&amp;quot; in XSI, and open this thing with &amp;quot;File/Import/OBJ file&amp;quot;. In an &amp;quot;Explorer&amp;quot; window you shall see that there are 15 &amp;quot;bone-something&amp;quot; objects, and 19 &amp;quot;part-something&amp;quot; objects.&lt;br /&gt;
#Don&#039;t go thinking that the 19 &amp;quot;parts&amp;quot; are the ones you need for Oni, because they&#039;re not. They&#039;re just meshes. As you will soon find out,&lt;br /&gt;
#*there are no shoulder parts,&lt;br /&gt;
#*parts 7 to 11 part all belong to the head,&lt;br /&gt;
#*part 18 is pelvis, mid and chest combined, and&lt;br /&gt;
#*the open hands are in a separate OBJ file.&lt;br /&gt;
#There is a bunch of basic things that you want to do before actually adapting this character for Oni&lt;br /&gt;
##The first thing you want to do is combine the head meshes into one. Just comment out the &amp;quot;g&amp;quot; tags for parts 8 through 11, in the OBJ file, and you should get [http://geyser.oni2.net/edition/characters/gally/GLB_merged.zip THIS]. Reimport it into a new scene, and see what changed.&lt;br /&gt;
##Don&#039;t mind the &amp;quot;bone&amp;quot; objects for now. I just happened to include them in the rip, but I&#039;m not sure why.&lt;br /&gt;
##Sooner or later you&#039;ll want to select all the objects (or just &amp;quot;Select all&amp;quot; and deselect the light and camera) and rotate them by -90° along X, so that Gally is upright.&lt;br /&gt;
#Now you want to split the body mesh (part 18) into three parts and to add some placeholder meshes for the shoulders.&lt;br /&gt;
##The shoulders you can get from Barabas. Drop his DAE into the &amp;quot;Scene_Root&amp;quot;, reparent the shoulders to &amp;quot;Scene_Root&amp;quot;, delete the rest of Barabas, and then scale/move the shoulders around until they fit inside Gally&#039;s chest. Try to keep them symmetric.&lt;br /&gt;
##As for the splitting, here is what you do. You duplicate part 18, twice, then hide all the duplicates but one, delete faraway polys, move the adjacent vertices around a bit, and then close the mesh with new polygons (N for making a new triangle, then Esc and Ctrl+Shift+A before creating a new one, to avoid making a quad). While you&#039;re editing the body, you may notice that some quads were apparently triangulated even though they are not perfectly flat, and the triangulation is not done the same way on both sides of the body. You can fix it now (Dissolve, Subdivide, re-Dissolve), or you can save it for later.&lt;br /&gt;
##When you&#039;re done, you can add the hand meshes from the extra OBJ file. To place them correctly, you can use the coordinates of the tips of &amp;quot;bone_4&amp;quot; and &amp;quot;bone_7&amp;quot; (aha! I knew they&#039;d come in handy)&lt;br /&gt;
##When you&#039;re done with that too, you want to get her ready for a &amp;quot;matching session&amp;quot; with an Oni character such as Konoko. Select all objects, then &amp;quot;Freeze all transforms&amp;quot; (from the drop-down menu of the &amp;quot;Transform&amp;quot; panel), then scale the whole bunch by 2 along all axes (don&#039;t ask, just do it), and &amp;quot;Freeze all transforms&amp;quot; again.&lt;br /&gt;
##Now every object (including Barabas&#039;s shoulders) has unit scaling, 0 rotation and 0 translation. Since all the meshes are parented to the scene root, &amp;quot;0 rotation and 0 translation&amp;quot; means that all their centers are at the world&#039;s origin, and the axes of the centers are aligned with the world axes (you can check that by switching to &amp;quot;Center&amp;quot; in the &amp;quot;Select&amp;quot; panel, or by enabling the drawing of Centers in the &amp;quot;eye&amp;quot; drop-down menu of any viewport). If you haven&#039;t done it already, you can rename the &amp;quot;part-something&amp;quot; meshes to the standard names used by OniSplit.&lt;br /&gt;
#Now is a good time to save your work, either as an XSI scene or model, or as Collada. I prefer Collada for some reason, but you must be careful to export only the selection (you don&#039;t want the &amp;quot;Scene_Root&amp;quot; to be exported, or the camera, or the light). Just select all the objects (including the &amp;quot;bone-somethings&amp;quot;, because they might come in handy again), then &amp;quot;File/Crosswalk/Export&amp;quot;, set the exported type to COLLADA, the filename to something sensible, and in the Settings, make sure that &amp;quot;Selection Only&amp;quot; and &amp;quot;Keep Referenced Paths Relative&amp;quot; are ON, and that &amp;quot;Verbose&amp;quot; and &amp;quot;XSI Extra&amp;quot; are OFF. You should get something like [http://geyser.oni2.net/edition/characters/gally/GLB_almost.zip THIS] (tweaked a bit in a text editor, to remove the link to TXMPTextures_babamid, and to make the hands and the rest of Gally use the same material GLB).&lt;br /&gt;
#Now there&#039;s only a few things left to do. Our last step will be the &amp;quot;matching&amp;quot; of Gally&#039;s body parts to those of a modified Konoko. But before that, there are some preliminaries.&lt;br /&gt;
##Start a new scene in XSI, and drag-drop the Gally you just saved into it. Delete the fists if you want to, and name everything according to OniSplit&#039;s standard, if you haven&#039;t already.&lt;br /&gt;
##Use OniSplit to &amp;quot;extract&amp;quot; &#039;&#039;&#039;ONCCkonoko_generic&#039;&#039;&#039; to .dae, with the &#039;&#039;&#039;-noanim&#039;&#039;&#039; tag, and drag-and-drop her into the same scene.&lt;br /&gt;
##*If you named Gally&#039;s meshes correctly, then Konoko&#039;s meshes will be disambiguated with a &amp;quot;2&amp;quot;. This is not a problem.&lt;br /&gt;
##*Note how the height of Konoko&#039;s pelvis (and hip joints) is consistent with Gally&#039;s. That&#039;s what the factor 2 was for.&lt;br /&gt;
##*Also note that Gally&#039;s upper body is rather small in proportion to her legs, and that her calves are slightly longer.&lt;br /&gt;
##Rotate Konoko&#039;s arms and shoulders to match Gally&#039;s pose. Try (0, +-65, 180) for shoulders and (0, +-65, 0) for arms.&lt;br /&gt;
##Now translate Konoko&#039;s body parts (&#039;&#039;not&#039;&#039; the centers) so that their centers match the supposed centers of Gally&#039;s.&lt;br /&gt;
##*Work from the pelvis down the tree, because if you move, e.g., &amp;quot;mid&amp;quot;, then all the upper body will move too. So, do &amp;quot;mid&amp;quot; first, and don&#039;t touch it afterward.&lt;br /&gt;
##*Use Gally&#039;s &amp;quot;skeleton&amp;quot; to pinpoint the supposed centers of her meshes. To see Konoko&#039;s centers while you move the objects, use the viewport&#039;s &amp;quot;eye&amp;quot; settings.&lt;br /&gt;
##*Shoulders, mid and chest can be tricky because the original Gally has no shoulders or mid, and chest has translation 0, unlike in Oni (probably the spine is meant only to twist, not to bend). Just try to place all those bones in proportion with the head-neck distance and approximate shoulder width (which is a bit narrower than Konoko&#039;s. Maybe it&#039;s better to use [[Shinatama Too]] instead of Konoko, here. In any case, don&#039;t be afraid to translate Konoko&#039;s body parts away from the original locations, as long as this &amp;quot;compact Konoko&amp;quot; gets close to Gally&#039;s proportions.&lt;br /&gt;
##*[http://geyser.oni2.net/edition/characters/gally/GLB_compact.zip HERE] is what you should get. Don&#039;t laugh too hard, and instead look at how well I matched the centers of Konoko&#039;s body parts with the tips of Gally&#039;s &amp;quot;bones&amp;quot;. The only thing that&#039;s wrong at this point is that the shoulder parts are too far from their centers, and may end up sticking out of Gally&#039;s chest or back. To fix this, you can move, scale and rotate those parts in any way you like. Just remember to &amp;quot;Freeze all transforms&amp;quot; when you&#039;re done, especially if you&#039;ve used scaling.&lt;br /&gt;
#When you&#039;re happy with the overlap, you are ready to match Gally&#039;s body parts to Konoko&#039;s; both in terms of hierarchy ([[TRIA]]) and in terms of relative placement ([[TRTA]]).&lt;br /&gt;
#*Switch to &amp;quot;Center&amp;quot; in the &amp;quot;Select&amp;quot; panel, select &amp;quot;pelvis&amp;quot; (Gally&#039;s), then click &amp;quot;Match all transforms&amp;quot; in the &amp;quot;Transform&amp;quot; drop-down, and pick &amp;quot;pelvis2&amp;quot; (Konoko&#039;s). Check the result by alternatively selecting &amp;quot;pelvis&amp;quot; and &amp;quot;pelvis2&amp;quot;. Look not only at the values in the &amp;quot;Transform&amp;quot; panel, but also, in any viewport, at the center (white circle) and the local axes (colored) lines. The rotation should be OK, but the translation may be off. If it is, just fix it manually, and check the result in the viewport, alternatively selecting &amp;quot;pelvis&amp;quot; and &amp;quot;pelvis2&amp;quot; until you&#039;re sure that both centers are the same.&lt;br /&gt;
#*When you&#039;re done with &amp;quot;pelvis&amp;quot;, move on to &amp;quot;left_thigh&amp;quot;. Until now it was a sibling of &amp;quot;pelvis&amp;quot;, and a child of &amp;quot;Scene_Root&amp;quot;. Now that &amp;quot;pelvis&amp;quot; is done, you can make &amp;quot;left_thigh&amp;quot; a child of &amp;quot;pelvis&amp;quot;, by drag-and-dropping it onto &amp;quot;pelvis&amp;quot; in the &amp;quot;Explorer&amp;quot; viewport. Then you need to match the relative transforms of this center with respect to the center of &amp;quot;pelvis&amp;quot;. Make sure &amp;quot;Center&amp;quot; is selected in the &amp;quot;Select&amp;quot; panel, then select &amp;quot;left_thigh&amp;quot;, choose &amp;quot;Match all transforms&amp;quot; in the &amp;quot;Transform&amp;quot; drop-down, and pick &amp;quot;left_thigh2&amp;quot; (Konoko&#039;s posing thigh). Again, the rotation will probably be correct, but the translation will probably be off, and you will have to fix it manually. Check the result by alternatively selecting &amp;quot;left_thigh&amp;quot; and &amp;quot;left_thigh2&amp;quot;, until you&#039;re happy.&lt;br /&gt;
#*Now that you&#039;ve gotten the idea, do the same for all the other body parts (reparent Gally&#039;s, and then match Gally&#039;s centers to Konoko&#039;s). Make sure you do one mesh at a time, and progress from the root of the tree (the pelvis) towards the extremities. Try not to forget any mesh, especially early on, or you will have to start over.&lt;br /&gt;
#When the reparenting and matching is over, you should get something like [http://geyser.oni2.net/edition/characters/gally/GLB_matched.zip THIS]. You can check that everything is OK simply by enabling the drawing of centers (either with the &amp;quot;eye&amp;quot; menu of a viewport, or with the &amp;quot;Center&amp;quot; filter), and then by alternatively middle-clicking &amp;quot;pelvis&amp;quot; and &amp;quot;pelvis2&amp;quot; (this selects the whole tree of either Gally, which we are unsure about, or the &amp;quot;compact Konoko&amp;quot;, which we know to be OK because we only tweaked her [[TRTA]] a bit). If the centers and the local axes look the same for both Gally and Konoko, then Gally is OK too. &lt;br /&gt;
#And that&#039;s it, we&#039;re done. Now select all of Gally&#039;s meshes (as a tree, with Ctrl+T or middle-click), export to Collada (&amp;quot;selection only&amp;quot;), import into Oni (DAE to TRBS, TGA to TXMP, ONCC from &#039;&#039;&#039;konoko_generic&#039;&#039;&#039; and TRMA from &#039;&#039;&#039;ninjabot_tx&#039;&#039;&#039;) and it should Just Work. And indeed it does. [http://geyser.oni2.net/edition/characters/gally/GLB_ready.zip HERE] is the input and [http://geyser.oni2.net/edition/characters/gally/level0_GUNNM.zip HERE] is the Oni-ready plugin (Windows only).&lt;br /&gt;
#If there&#039;s a problem with any of these steps, just say so. I&#039;m not sure how I could explain it any better without screenshots.&lt;br /&gt;
#This can be done in well under an hour - if you don&#039;t have to type a tutorial as you go, that is. Once you get the hang of this, you can save some time by completely skipping the &amp;quot;compact Konoko&amp;quot; part, and placing the new character&#039;s centers directly where you want them -- especially if the pose is as simple as this one, and/or if the model comes with a skeleton, or very clear anatomy, such as a robot. Challenges such as the [[AE:Iron Demon]] or the [[AE:BGI|BGI]] troopers/mecha come readily to mind, and could both use a tutorial.&lt;br /&gt;
&lt;br /&gt;
[[Category:Modding tutorials]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=File:Blender_Collada_export_settings.png&amp;diff=38811</id>
		<title>File:Blender Collada export settings.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=File:Blender_Collada_export_settings.png&amp;diff=38811"/>
		<updated>2022-11-20T23:37:02Z</updated>

		<summary type="html">&lt;p&gt;Delano762: Blender Collada export settings, showing mainly how Curves should be enabled instead of samples.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Blender Collada export settings, showing mainly how Curves should be enabled instead of samples.&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=File:Blender_scene_settings.png&amp;diff=38810</id>
		<title>File:Blender scene settings.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=File:Blender_scene_settings.png&amp;diff=38810"/>
		<updated>2022-11-20T23:35:27Z</updated>

		<summary type="html">&lt;p&gt;Delano762: Blender scene settings showing that the frame rate should always be set to 60 FPS.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Blender scene settings showing that the frame rate should always be set to 60 FPS.&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=File:Blender_import_settings.png&amp;diff=38809</id>
		<title>File:Blender import settings.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=File:Blender_import_settings.png&amp;diff=38809"/>
		<updated>2022-11-20T23:34:30Z</updated>

		<summary type="html">&lt;p&gt;Delano762: Blender import settings showing that Import Units should be always checked.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Blender import settings showing that Import Units should be always checked.&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=OniSplit&amp;diff=38803</id>
		<title>OniSplit</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=OniSplit&amp;diff=38803"/>
		<updated>2022-11-20T22:57:15Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Blender support */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCfloat|side=right}}&lt;br /&gt;
{{Hatnote|Before reading this page, it&#039;s a good idea to be familiar with basic Oni [[game data terminology]].}}&lt;br /&gt;
&#039;&#039;&#039;OniSplit&#039;&#039;&#039;, written by [[User_talk:Neo|Neo]], is an integral part of the [[Anniversary Edition]] and an essential modding tool on its own. It is a command line tool which can import and export almost all kinds of Oni game data, including textures, sound, 3D models, level geometry and combat animations. Its name comes from its original purpose, which was breaking Oni&#039;s level data files into individual resources. Later, the ability to convert those resources&#039; data between Oni&#039;s format and standard file formats was added. OniSplit incorporates the latest [[OBD|knowledge about Oni&#039;s game data]], and it is currently the community&#039;s main modding tool.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Subpages:&#039;&#039; [[/Change_log|Change log]] (past versions), [[/WIP|WIP notes]] (upcoming versions)&lt;br /&gt;
&lt;br /&gt;
==Getting it==&lt;br /&gt;
===Download links===&lt;br /&gt;
* Latest release of OniSplit: [http://mods.oni2.net/node/38 v0.9.99.2] ([http://websvn.illy.bz/dl.php?repname=Oni2&amp;amp;path=%2FOniSplit%2F&amp;amp;isdir=1 source code])&lt;br /&gt;
* The current GUI for OniSplit is [[Vago (tool)|Vago]]. &#039;&#039;&#039;You should try the GUI to see if it does what you need before working with OniSplit on the command line.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Requirements===&lt;br /&gt;
*Windows: [https://dotnet.microsoft.com/en-us/download/dotnet-framework .NET framework]&lt;br /&gt;
*macOS: [https://www.mono-project.com/download/stable/ Mono framework]&lt;br /&gt;
&lt;br /&gt;
==Workflow==&lt;br /&gt;
OniSplit is used in up to four different stages when modding:&lt;br /&gt;
{|&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|&amp;lt;span style=&amp;quot;font-size:150%&amp;quot;&amp;gt;&#039;&#039;&#039;OUT&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|&#039;&#039;Exporting&#039;&#039; - using the &amp;lt;tt&amp;gt;-export&amp;lt;/tt&amp;gt; command, a [[Dat|level data file]] is broken into its component resources, .oni files.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;border-style: solid; border-width: 0 0 1px 0&amp;quot;|&#039;&#039;Extracting&#039;&#039; - using the &amp;lt;tt&amp;gt;-extract&amp;lt;/tt&amp;gt; commands, .oni files are converted to standard-format files that can be edited in various third-party programs.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|&amp;lt;center&amp;gt;&amp;lt;span style=&amp;quot;font-size:150%&amp;quot;&amp;gt;&#039;&#039;&#039;IN&#039;&#039;&#039;&amp;lt;/span&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&#039;&#039;Creating&#039;&#039; - using the &amp;lt;tt&amp;gt;-create&amp;lt;/tt&amp;gt; commands, standard-format files are converted into .oni files.&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Importing&#039;&#039; - using the &amp;lt;tt&amp;gt;-import&amp;lt;/tt&amp;gt; command, a folder of .oni files is combined into a level data file.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note that &amp;quot;extracting&amp;quot; refers to a conversion from one format to another, but &amp;quot;exporting&amp;quot; only refers to the creation of .oni files from a .dat file. When exporting, no conversion or re-formatting is taking place; the data is simply being copied out of a .dat (any connected binary data in .raw/.sep files will be concatenated to the data from the .dat when making the .oni).&lt;br /&gt;
&lt;br /&gt;
==Beginner&#039;s tips==&lt;br /&gt;
{{Divhide|show=yes|For users new to the command line or to OniSplit}}&lt;br /&gt;
In Windows, there are several options through which you can use OniSplit - out of which it is recommended to get Vago and CMDer:&lt;br /&gt;
* [[Vago (tool)|Vago]] is a GUI for OniSplit which allows you to handle all general conversions, save your sessions as project files, input manual commands if needed, and more. The two downsides of it is that it doesn&#039;t support Blender yet, forcing the users input commands manually, which in turn are not stored upon ending the session.&lt;br /&gt;
* [https://cmder.app/ CMDer] is an excellent alternative to cmd.exe. It can be customized to allow starting it from any folder you pick with the context menu, and it also stores the most recently used commands after ending the session. Currently it is highly useful for Blender-related operations.&lt;br /&gt;
* Command Prompt/cmd.exe. Windows&#039; default command line interpreter, it&#039;s a poor choice as it does not store most recently used commands.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On Macs, the command line is found in the Terminal app (/Applications/Utilities) (press Command-Spacebar and type &amp;quot;Terminal&amp;quot; to get there faster).&lt;br /&gt;
&lt;br /&gt;
===OniSplit syntax===&lt;br /&gt;
The basic syntax is:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Windows&#039;&#039;&#039;||&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background:rgb(235,235,235); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;OniSplit.exe&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(175,175,255); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;-create:trbs&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(255,156,156); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;C:\Games\Oni\SomeFolder&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(175,175,255); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;-normals&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(156,255,156); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;C:\Games\Oni\Modding\TRBSMyNewChar.dae&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Mac&#039;&#039;&#039;||&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background:rgb(235,235,235); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;mono OniSplit.exe&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(175,175,255); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;-create:trbs&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(255,156,156); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;/Games/Oni/SomeFolder&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(175,175,255); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;-normals&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(156,255,156); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;/Games/Oni/Modding/TRBSMyNewChar.dae&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Here&#039;s how it breaks down:&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width:130px&amp;quot;|&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background:rgb(235,235,235); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;&#039;&#039;&#039;Invocation&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|Windows can refer to the program directly, but Macs use Mono to run the .NET app; note also that if OniSplit.exe is not in the Command Prompt/Terminal&#039;s current directory, you must provide the full path to it or set the path variable.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background:rgb(175,175,255); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;&#039;&#039;&#039;Option&#039;&#039;&#039;&amp;lt;/span&amp;gt;||The command.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background:rgb(255,156,156); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;&#039;&#039;&#039;Path to folder&#039;&#039;&#039;&amp;lt;/span&amp;gt;||Whether destination or source, the path which is a folder comes first. &amp;lt;u&amp;gt;Use the full path to the folder (starting from &amp;quot;C:\&amp;quot;, or &amp;quot;/&amp;quot; on Macs).&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background:rgb(175,175,255); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;&#039;&#039;&#039;Option flags&#039;&#039;&#039;&amp;lt;/span&amp;gt;||The flags that can optionally go with this command, separated by spaces.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background:rgb(156,255,156); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;&#039;&#039;&#039;Path to file&#039;&#039;&#039;&amp;lt;/span&amp;gt;||Whether destination or source, the path of the file comes second. &amp;lt;u&amp;gt;Use the full path to the file (starting from &amp;quot;C:\&amp;quot;, or &amp;quot;/&amp;quot; on Macs).&amp;lt;/u&amp;gt; One exception to this parameter being a file is when using &amp;lt;tt&amp;gt;-create&amp;lt;/tt&amp;gt; to make a level, in which case this is where you supply the source folder.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===CLI tips===&lt;br /&gt;
*Command line interfaces (CLI) usually supply an auto-complete feature to save on typing. If you&#039;ve typed enough of a file/folder name to identify it, press the Tab key and the rest should fill in. In Windows, you may not get the right path name autocompleted on the first try if there are multiple possible autocompletions based on the names in that directory, so keep pressing Tab to cycle through all possibilities. On Macs, if you have not typed enough of the name to narrow it down to a single autocompletion, you will hear an error sound.  Double-tap Tab to see a list of possible autocompletions, then keep typing until you have narrowed it down to one of those and then hit Tab to fill in the rest of its name.&lt;br /&gt;
&lt;br /&gt;
*Note that you can also drag files/folders into the window and the path will magically appear; in cases where you don&#039;t need to use a wildcard, this is the fastest way to build an OniSplit command.&lt;br /&gt;
&lt;br /&gt;
===Wildcards===&lt;br /&gt;
Wildcards can be used to supply patterns to CLI programs. The wildcard is simply the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; character. For instance:&lt;br /&gt;
 OniSplit.exe -export:TRAM* &amp;lt;destination&amp;gt; &amp;lt;source .dat&amp;gt;&lt;br /&gt;
will export all the TRAMs in the source .dat into the destination folder. Using &amp;quot;TRAMKON*&amp;quot; would export all of Konoko&#039;s animations.&lt;br /&gt;
&lt;br /&gt;
===Spaces in paths===&lt;br /&gt;
Command line interfaces (CLI) do not recognize spaces as a possible part of a path name because spaces are what separate the terms in your commands. The best course of action is to not use paths with spaces in their names! But if you must, you can use quotes to tell the CLI that a certain string is a single path:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;C:\Games\Oni\&amp;gt;&#039;&#039;&#039;OniSplit.exe -list &amp;quot;My Mod Folder\level5_Final.dat&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This works in the Mac Terminal too, but you can also use the escape character, &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;. Also, other characters like &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; need to be escaped as well if you do not use quotes:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;MyMac%&#039;&#039;&#039; mono OniSplit.exe -list My\ Mods\ \(In\ Progress\)/level5_Final.dat&lt;br /&gt;
&lt;br /&gt;
But as mentioned, the best practice is to not use any characters besides the alphabet and numbers. It makes your life simpler, and if you ask for help on the forum with a command, no one wants to have to read your long path with lots of spaces or escaped characters in it ;-)&lt;br /&gt;
&lt;br /&gt;
===Reading the commands below===&lt;br /&gt;
*The following commands should be complete, but the current list can be obtained by calling OniSplit with the &amp;lt;tt&amp;gt;-help&amp;lt;/tt&amp;gt; option. You should also use &amp;lt;tt&amp;gt;-version&amp;lt;/tt&amp;gt; to make sure you&#039;re using the latest version, the number of which is given in the &amp;quot;Download links&amp;quot; section above.&lt;br /&gt;
&lt;br /&gt;
*Sample usages are given after certain commands. These are in DOS style, so if you are on a Mac, simply flip the &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;s to &amp;lt;tt&amp;gt;/&amp;lt;/tt&amp;gt;s and make &amp;quot;C:\&amp;quot; into a leading &amp;quot;/&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*Optional flags are listed in square brackets simply to indicate that they&#039;re optional; don&#039;t enter the brackets when typing a command.&lt;br /&gt;
&lt;br /&gt;
Note that only the .dat file from a level&#039;s data files is mentioned. The .raw and .sep files will be accessed by OniSplit as necessary when working with the .dat file that you gave the name of.&lt;br /&gt;
{{Divhide|end}}&lt;br /&gt;
&lt;br /&gt;
==Commands==&lt;br /&gt;
===Conversion between .dat and .oni===&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width:430px&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-list &amp;lt;file name&amp;gt;&amp;lt;/code&amp;gt;||Lists the named resources contained in a .dat (see [[OBD:File_types/Named|HERE]] for info on unnamed resources)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-export &amp;lt;destination directory&amp;gt; &amp;lt;dat file&amp;gt;&amp;lt;/code&amp;gt;||Breaks .dat file into .oni files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-export:&amp;lt;pattern&amp;gt; &amp;lt;destination directory&amp;gt; &amp;lt;dat file&amp;gt;&amp;lt;/code&amp;gt;||Exports named resource (wildcards also allowed) from .dat file&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;-import &amp;lt;source directory&amp;gt; &amp;lt;new dat file&amp;gt;&amp;lt;/code&amp;gt;||Compiles level files from source directory using the name you supply for the .dat file; tries to get target file format from source SNDD, but it&#039;s better to use the :sep or :nosep variants below&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&amp;lt;span style=&amp;quot;padding-left:20px&amp;quot;&amp;gt;To create level5_Final.dat/.raw[/.sep] from the files in MyNewLevel\: &amp;lt;code&amp;gt;OniSplit.exe -import C:\Oni\MyNewLevel\ C:\Oni\GameDataFolder\level5_Final.dat&amp;lt;/code&amp;gt;&amp;lt;span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-import:sep &amp;lt;source directory&amp;gt; &amp;lt;new dat file&amp;gt;&amp;lt;/code&amp;gt;||Imports target file (.dat) from source directory; uses .dat/.raw/.sep format (Mac and PC Demo)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-import:nosep &amp;lt;source directory&amp;gt; &amp;lt;new dat file&amp;gt;&amp;lt;/code&amp;gt;||Imports target file (.dat) from source directory; uses .dat/.raw format (PC retail)&lt;br /&gt;
|}&lt;br /&gt;
:Note that &amp;lt;tt&amp;gt;-import&amp;lt;/tt&amp;gt; will search subdirectories too. If you find having hundreds or thousand of files .oni in one directory to be unmanageable you can always group them in subdirectories any way you like. The only exception is that a subdirectory named &amp;quot;noimport&amp;quot; or &amp;quot;_noimport&amp;quot; is always ignored.&lt;br /&gt;
&lt;br /&gt;
===Management of .oni files===&lt;br /&gt;
Sometimes you want to move some .oni files out of a larger folder of .onis. You could do this manually, but OniSpit knows which files depend on others. It will also look for those dependencies in subfolders beneath the level of the file you supply the name of. The filename field supports wildcards. This is mostly used by the [[AE]] Installer rather than modders themselves.&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;-deps &amp;lt;oni file&amp;gt;&amp;lt;/code&amp;gt;||Displays a list of .oni files that the specified .oni file depends on&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-copy &amp;lt;destination directory&amp;gt; &amp;lt;oni file&amp;gt;&amp;lt;/code&amp;gt;||Copies .oni file and its dependencies; skips file if it already exists at destination&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-move &amp;lt;destination directory&amp;gt; &amp;lt;oni file&amp;gt;&amp;lt;/code&amp;gt;||Moves an .oni file and its dependencies; skips file if it already exists at destination&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-move:overwrite &amp;lt;destination directory&amp;gt; &amp;lt;oni file&amp;gt;&amp;lt;/code&amp;gt;||Moves an .oni file and its dependencies; overwrites any existing .oni files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-move:delete &amp;lt;destination directory&amp;gt; &amp;lt;oni file&amp;gt;&amp;lt;/code&amp;gt;||Moves an .oni file and its dependencies; doesn&#039;t overwrite; deletes source files&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Conversion between .oni/.dat and 3rd party formats===&lt;br /&gt;
====Textures====&lt;br /&gt;
Unless mentioned otherwise, source filenames support wildcards. See [[Modifying textures|HERE]] for a detailed tutorial. The &amp;lt;tt&amp;gt;-extract&amp;lt;/tt&amp;gt; commands can work with .oni files (a single file or several files if you use the wildcard), or rip all the TXMPs from a .dat file.&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:dds &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts all textures (TXMP) from a Oni .dat/.oni file into DDS files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:tga &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts all textures (TXMP) from a Oni .dat/.oni file into TGA files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:png &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts all textures (TXMP) from a Oni .dat/.oni file into PNG files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-create:txmp &amp;lt;destination directory&amp;gt;&amp;lt;br&amp;gt;[-genmipmaps] [-nouwrap] [-novwrap]&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;[-format:bgr32|bgra32|bgr555|bgra5551|bgra4444|dxt1]&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;[-envmap:texture_name] &amp;lt;image file&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=top|Creates .oni file from image file (PNG, TGA, or DDS)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Models====&lt;br /&gt;
[[M3GM]]s, [[ONWC]]s, [[ONCC]]s can be exported to the Wavefront .obj and COLLADA .dae formats. For details see [[Importing character models]] and [[Importing weapon models]]. The generic &amp;lt;tt&amp;gt;-extract&amp;lt;/tt&amp;gt; commands can work with .oni files (a single file, or several files if you use the wildcard), or rip all the TXMP from a .dat file. TRBS and ONCC support additional &amp;lt;tt&amp;gt;-noanim&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;-anim&amp;lt;/tt&amp;gt; options for &amp;lt;tt&amp;gt;-extract:dae&amp;lt;/tt&amp;gt;; see [[Importing character models]] for details. Imported geometry must only contain triangles.&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width:540px&amp;quot;|&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:obj &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts 3D data in .oni file (or all M3GM, ONWC and ONCC instances in a .dat) into Wavefront OBJ files&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:dae &amp;lt;destination directory&amp;gt; [-noanim] &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts 3D data in .oni file (or all M3GM, ONWC and ONCC instances in a .dat) into Collada DAE files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-create:m3gm &amp;lt;destination directory&amp;gt; [-tex:texture_name] &amp;lt;OBJ file&amp;gt;&amp;lt;/code&amp;gt;||Creates a M3GM .oni from an .obj file&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-create:trbs &amp;lt;destination directory&amp;gt; [-cel] [-normals] &amp;lt;DAE file&amp;gt;&amp;lt;/code&amp;gt;||Creates a TRBS .oni from a .dae file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note on -noanim parameter: Normally OniSplit exports the character with an idle animation. If you use -noanim the character is exported in &amp;quot;I&amp;quot; pose, also the pelvis has the coordinates x=0, y=0, z=0.&lt;br /&gt;
&lt;br /&gt;
====Levels====&lt;br /&gt;
OniSplit can convert AKEV files (level geometry) and the associated file types to and from DAE format:&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:dae &amp;lt;destination directory&amp;gt; &amp;lt;AKEV.oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts 3D data in AKEV and related resources from dependencies into Collada file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The next two steps are used on a folder in which you have placed the DAE and XML-formatted instances of the required files, as well as textures in TGA format. See [http://oni.bungie.org/forum/viewtopic.php?id=1515 HERE] for details.&lt;br /&gt;
{|&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;-create &amp;lt;destination directory&amp;gt;&amp;lt;br&amp;gt;[-genmipmaps] [-format:dxt1]&amp;lt;br&amp;gt;&amp;lt;source directory&amp;gt;&amp;lt;/code&amp;gt;||Converts all AKEV and related instances to .oni files&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;-import:nosep &amp;lt;source directory&amp;gt;&amp;lt;br&amp;gt;&amp;lt;target file name&amp;gt;.dat&amp;lt;/code&amp;gt;||The standard command for creating .dat/.raw files from .oni files (remember to use the import:sep option on Mac!)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Sounds====&lt;br /&gt;
The sounds in Windows Oni are stored in WAV format, and on Macs are stored in AIFF format. This also means creating each of your SNDD files in both formats in order to work on both platforms.&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:wav &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Rips sound data from an SNDD .oni file (or all SNDDs from a .dat) as .wav files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:aif &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Rips sound data from an SNDD .oni file (or all SNDDs from a .dat) as .aif files&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Text====&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:txt &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Rips text data from a SUBT .oni file (or all SUBTs from a .dat) as .txt files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-create:subt &amp;lt;destination directory&amp;gt; &amp;lt;TXT file&amp;gt;&amp;lt;/code&amp;gt;||Creates a SUBT .oni file from a .txt file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====XML====&lt;br /&gt;
One of the latest features is conversion of .oni files to and from an XML file, or an XML metafile and related 3rd-party format files. XML files are easier to read and edit.&lt;br /&gt;
::Currently XML export/import is limited to files that do not have raw/sep parts. 2-way conversion is known to work for [[BINA]], [[CONS]], [[DOOR]], [[DPge]], [[FILM]], [[HPge]], [[IGHH]], [[IPge]], [[M3GM]], [[OBAN]], [[ONCC]], [[ONCV]], [[ONLD]], [[ONLV]], [[ONGS]], [[ONSK]], [[ONVL]], [[ONWC]], [[OPge]], [[OSBD]], [[PSpc]], [[PSpL]], [[PSUI]], [[TRAC]], [[TRAM]], [[TRIG]], [[TRGE]], [[TRMA]], [[TRSC]], [[TXMB]], [[TXMP]], [[WMCL]], [[WMDD]], [[WMM_]], [[WPge]].&lt;br /&gt;
:::For detailed examples and tutorials, see [[XML|HERE]]&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:xml &amp;lt;destination directory&amp;gt; &amp;lt;oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts .oni file and all related resources to XML files and 3rd-party formats&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-create &amp;lt;destination directory&amp;gt; &amp;lt;XML file&amp;gt;&amp;lt;/code&amp;gt;||Creates an .oni file from an XML file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Blender support====&lt;br /&gt;
[[Blender]] by default has a number of issues with most of Oni&#039;s assets, however, OniSplit allows exporting them to Blender-readable files with the &amp;lt;tt&amp;gt;-blender&amp;lt;/tt&amp;gt; flag.&lt;br /&gt;
&lt;br /&gt;
For more detailed information on how to use the &amp;lt;tt&amp;gt;-blender&amp;lt;/tt&amp;gt; flag, please check [[Importing_character_models#Blender-specific_OniSplit_information|Blender specific OniSplit information]]. &lt;br /&gt;
&lt;br /&gt;
[[Category:Completed modding tools]][[Category:Bi-platform modding tools]][[Category:Modding tutorials]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Importing_character_models&amp;diff=38802</id>
		<title>Importing character models</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Importing_character_models&amp;diff=38802"/>
		<updated>2022-11-20T22:39:21Z</updated>

		<summary type="html">&lt;p&gt;Delano762: Added Blender-specific OniSplit information&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article covers the importing of new character models into Oni, but also how to export models from Oni. Generally speaking, you are going to want to use [[wikipedia:COLLADA|COLLADA]] as the &amp;quot;passthrough&amp;quot; format between your 3D program and Oni, as this is exactly what COLLADA was designed for. In this article, COLLADA is referred to as &amp;quot;Collada&amp;quot; (because who enjoys being shouted at?), or by &amp;quot;.dae file&amp;quot; (because that is the file suffix for COLLADA).&lt;br /&gt;
&lt;br /&gt;
==Modding tools==&lt;br /&gt;
===OniSplit===&lt;br /&gt;
This is the program that we use to get models into and out of Oni. It is a command line tool. There are GUI wrappers for OniSplit that cover most of its functions (see [[Vago (tool)]], but modders sometimes have to call it from the command line (or use the direct command line input feature in a GUI) to take full advantage of OniSplit&#039;s abilities.&lt;br /&gt;
&lt;br /&gt;
===3D programs===&lt;br /&gt;
====Blender====&lt;br /&gt;
[[Blender]] is the community&#039;s current 3D software of choice, allowing for 3D modeling, animating, and more.&lt;br /&gt;
&lt;br /&gt;
Blender rocks when it comes to [[Lightmapping levels|lightmapping levels]]. XSI is closed source and can only lightmap one mesh at a time with one lightmap texture per mesh. Blender is more flexible because of its free-for-all scripting API, and a nice touch is that it supports radiosity, i.e., emissive materials -- and that&#039;s exactly how Oni&#039;s lighting was done initially (see [[OBLS]]).&lt;br /&gt;
&lt;br /&gt;
====XSI====&lt;br /&gt;
Softimage XSI is a Windows-only 3D software that went discontinued in 2014, and [https://www.moddb.com/downloads/autodesk-softimage-mod-tool-75 a free version of it from 2008] used to to be the community&#039;s modding tool of choice before moving on to Blender. A number of Oni-related addons, tools and tutorials were developed for it can be still found and used. It has detailed documentation and is versatile, whether working with characters or levels, though highly obsolete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===File converters===&lt;br /&gt;
====Autodesk FBX====&lt;br /&gt;
Check out {{AutodeskFBX}} (primarily the FBX converter) if your tool can reliably import/export FBX but has trouble with Collada.&lt;br /&gt;
&lt;br /&gt;
==Basic importing and exporting==&lt;br /&gt;
===Exporting from Oni to Collada===&lt;br /&gt;
OniSplit allows you to export .dae files from both [[TRBS]] and [[ONCC]]. Though all the 3D data is in the TRBS, the textures are listed in the [[TRMA]] file, which is only visible from the ONCC, not the TRBS. Thus, if you want to use the textures while editing the model, convert the ONCC, not the TRBS, into Collada. The instructions below assume that you want the textured model, and thus illustrate how to export the ONCC.&lt;br /&gt;
&lt;br /&gt;
First, you need to find the class name for the character you want to export. You can accomplish this by going into Oni, loading the level in which the desired character appears, and then enabling the shapeshifter cheat -- but you have to do this by turning on [[Developer Mode]], not by entering the &amp;quot;shapeshifter&amp;quot; cheat code, because the regular cheat code does not display the console output that you need. Once Dev Mode is on, press F8 until you reach the desired character. You should see the message &amp;quot;character class &#039;&#039;number&#039;&#039; &#039;&#039;&#039;&#039;&#039;string&#039;&#039;&#039;&#039;&#039;&amp;quot;. The number is unimportant, but write down the string, because that is the class name which provides the basis for the names of the ONCC and TRBS.&lt;br /&gt;
&lt;br /&gt;
In this example, we&#039;ll export one of Konoko&#039;s models. For Konoko, we don&#039;t even need to open Oni to find the name of an ONCC because we have [[Konoko#In-game_outfits|this handy table]]. Let&#039;s use Konoko in her police uniform; you can see from the table that this is ONCCk3 and that it&#039;s found in level2_Final.&lt;br /&gt;
&lt;br /&gt;
Next, you need to decide on the pose in which your character will be exported. See the &amp;quot;Poses&amp;quot; section below for guidance. Without making this example more complicated, we only have two choices for pose: default (folded) and -noanim (standing at attention); we are going to use the second option, for a more visually pleasing result. Here are the steps for getting your desired character in .dae format. Substitute backward slashes for forward ones if you are in Windows.&lt;br /&gt;
&lt;br /&gt;
:1. Create a couple of folders in a convenient place. One folder will receive a whole bunch of files, and the second folder will hold the exported model. We&#039;ll call these paths &amp;quot;splitOutput/&amp;quot; and &amp;quot;modelOutput/&amp;quot; respectively.&lt;br /&gt;
:2. On the command line, go to the directory &amp;quot;Oni/GameDataFolder/&amp;quot;, where &amp;quot;Oni/&amp;quot; means the path to your game.&lt;br /&gt;
:3. Split the desired level&#039;s data into its component resources with OniSplit. Where you see just &amp;quot;onisplit&amp;quot; in the following commands, you should take that to mean &amp;quot;C:\path\to\OniSplit.exe&amp;quot; in Windows or &amp;quot;mono /path/to/OniSplit.exe&amp;quot; on Macs (Mono is a third-party package that you need to run .NET applications in macOS):&lt;br /&gt;
::&amp;lt;tt&amp;gt;onisplit -export splitOutput/ level2_Final.dat&amp;lt;/tt&amp;gt;&lt;br /&gt;
:4. Convert the desired character&#039;s model data into Collada:&lt;br /&gt;
::&amp;lt;tt&amp;gt;onisplit -extract:dae modelOutput/ -noanim splitOutput/ONCCk3.oni&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create the file &#039;&#039;&#039;ONCCk3.dae&#039;&#039;&#039;, and its supporting textures in TGA format, in modelOutput/. Note that only the highest level of detail (LOD) model will be exported using this method. See [[XML:TRBS]] for a method which exports all 5 LOD models.&lt;br /&gt;
&lt;br /&gt;
Note that if you want to extract the model with a pose besides folded or -noanim, you need to have the animation data (the [[TRAC]] and [[TRAM]] .oni files) in the same folder as the model data (the ONCC and its related files). In vanilla (un-modded) Oni, animations for many characters (including Konoko) are only in level0_Final, and, as you saw above, model data is found in whichever level that character appears in. Extracting a model in the pose of your choice will be simpler if you have the [[AE]] installed, as it globalizes character data, placing it all in the level0_Final files in the AE&#039;s GameDataFolder. With vanilla Oni, you will have to split both level0_Final and level&#039;&#039;x&#039;&#039;_Final and then combine their files into one folder before you can perform the &amp;quot;-extract:dae&amp;quot; operation using the &amp;quot;-anim&amp;quot; tag that is discussed below.&lt;br /&gt;
&lt;br /&gt;
===Importing from Collada into Oni===&lt;br /&gt;
When importing characters, the simplest method is to generate a whole body set ([[TRBS]]) from one .dae file. To convert your 3D model, let&#039;s say that you saved it in Collada format with the name &amp;quot;TRBSnewchar.dae&amp;quot;. Run the command:&lt;br /&gt;
:&amp;lt;tt&amp;gt;onisplit -create:trbs DAEtoONI/ TRBSnewchar.dae&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create &#039;&#039;&#039;TRBSnewchar.oni&#039;&#039;&#039; in the folder DAEtoONI. Because it was created from a single .dae file, this TRBS will contain 5 identical models for the 5 levels of detail (LOD) that Oni supports for each character. You have to import by XML in order to specify a different .dae for every LOD; see [[XML:TRBS]] for more info.&lt;br /&gt;
&lt;br /&gt;
Textures are currently ignored upon creating the TRBS (however, the TRBS will of course retain the changes you may have made to the UV coordinates if you were editing a model exported from Oni). Possibly a future version of OniSplit can automatically generate a TRMA and TXMPs if the .dae file has textures.&lt;br /&gt;
&lt;br /&gt;
Note that your file should be named appropriately if you want it to be looked up by name from one or more of Oni&#039;s existing ONCCs, or a new one of your own creation.&lt;br /&gt;
&lt;br /&gt;
To actually test the model in-game, you should [[Making a mod package|create a mod package]] for it, place the package in Oni/AE/packages/, and select it in the AE Installer. The older method of testing your work is to rebuild the level by running &amp;quot;onisplit -import&amp;quot; on a folder containing your TRBS and all the other .oni files for a level, but this only creates a set of level files that you can use on your computer, and is inherently a disorganized approach to keeping track of your work. Creating an AE package will allow you to share your work with other players.&lt;br /&gt;
&lt;br /&gt;
Please note that a final character mod package should contain multiple LOD models for your character. Filling all 5 slots with distinct models is not necessary; many modders create only two or three LOD models and fill the lower LOD slots with the simpler model(s) and the highest slot with the full-detail model, e.g.:&lt;br /&gt;
:# TRBSnewchar_low.dae&lt;br /&gt;
:# TRBSnewchar_low.dae&lt;br /&gt;
:# TRBSnewchar_mid.dae&lt;br /&gt;
:# TRBSnewchar_mid.dae&lt;br /&gt;
:# TRBSnewchar_high.dae&lt;br /&gt;
&lt;br /&gt;
An ONCC contains much more information than just links to TRBS and TRMA, and thus can not be generated automatically. See [[XML:ONCC]] on how to create such a file, and then import the character with this class data into Oni. The easiest way to try out an imported character in Oni is to name your imported TRBS so that it replaces an existing one and no ONCC editing is needed. The next step up is to clone an existing ONCC (in XML) and modify it to link to your new TRBS file(s).&lt;br /&gt;
&lt;br /&gt;
==Blender-specific OniSplit information==&lt;br /&gt;
This section contains OniSplit commands specific to Blender, and related settings in Blender necessary for assets to work.&lt;br /&gt;
&lt;br /&gt;
===Blender settings for importing and exporting COLLADA files===&lt;br /&gt;
====Importing====&lt;br /&gt;
In the Collada Import Data Options, make sure to check Import Units. Failure to do so will result in scaling issues, which are not easy to fix.&lt;br /&gt;
&lt;br /&gt;
Before importing TRAM files, set the scene frame rate to 60fps.&lt;br /&gt;
====Exporting====&lt;br /&gt;
When exporting TRBS, be sure to delete the default light and camera from the scene, or you can select all 19 body parts, then in the Export Main Tab, select Selection Only&lt;br /&gt;
&lt;br /&gt;
When exporting TRAM, select all 19 body parts, then in the Collada export options, under the Main Tab: select Selection Only, Geom Tab: select Triangulate, Anim Tab: select Curves.&lt;br /&gt;
===Troubleshooting===&lt;br /&gt;
&lt;br /&gt;
Known Issues between Blender 2.83 and OniSplit 0.9.99.2&lt;br /&gt;
&lt;br /&gt;
1) When importing .dae file you get the error message &amp;quot;Schema validation (Error): Error: ERROR_REQUIRED_ATTRIBUTE_MISSING Element: technique, Attribute: sid&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Solution: Open the .dae file in a text editor, find all instances of &amp;lt;technique&amp;gt; and replace with &amp;lt;technique sid=&amp;quot;common&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Blender-specific OniSplit commands===&lt;br /&gt;
Convert TRBS.oni to Blender compatible dae: &lt;br /&gt;
-extract:dae To_blender -noanim -blender Original\TRBSkonoko_body_high.oni&lt;br /&gt;
&lt;br /&gt;
Convert ONCC.oni to Blender compatible dae with textures: &lt;br /&gt;
&lt;br /&gt;
-extract:dae To_blender -noanim -blender Original\ONCCkonoko_generic.oni&lt;br /&gt;
&lt;br /&gt;
Be sure to include the TMXP.oni files with the ONCC.oni file&lt;br /&gt;
&lt;br /&gt;
Convert TRAM.oni to Blender compatible dae - textureless, as exporting animations with textured models does not work yet:&lt;br /&gt;
&lt;br /&gt;
-extract:xml To_blender -anim-body:Original\TRBSkonoko_body_high.oni -blender Original\TRAMKONCOMkick_heavy.oni &lt;br /&gt;
&lt;br /&gt;
This will create a TRAM.dae along with an .xml file, which is needed for importing back to Oni.&lt;br /&gt;
You will be also able to tell that everything went okay when you see&lt;br /&gt;
AnimationDaeWriter: custom axis conversion.&lt;br /&gt;
on output. If you don’t, you’re most likely doing something wrong.&lt;br /&gt;
&lt;br /&gt;
Convert TRBS.dae from Blender to .oni:&lt;br /&gt;
-create:trbs From_blender -blender From_blender\TRBSkonoko_body_high.dae&lt;br /&gt;
&lt;br /&gt;
Convert TRAM.dae from Blender to .oni&lt;br /&gt;
-create From_blender -blender From_blender\TRAMKONCOMkick_heavy.xml&lt;br /&gt;
The TRAMKONCOMkick_heavy.xml links to the TRAMKONCOMkick_heavy.dae from Blender which needs to be in the same location as the .xml file.&lt;br /&gt;
&lt;br /&gt;
==Poses==&lt;br /&gt;
===Oni&#039;s default orientation===&lt;br /&gt;
This pose, where the body parts are all at zero rotation, is usually referred to in the community as the &amp;quot;folded pose&amp;quot;. The primary axis of a body part, in its own frame of reference, is X. When you move down an arm or leg, or up the spine, you are moving along the positive X direction of every body part.&lt;br /&gt;
When all the bones are aligned with their parents, you get something like this:&lt;br /&gt;
 14-o-13-o-12-o-11-o 3-o-2-o-1-o       ^ z&lt;br /&gt;
                   |           |       ^&lt;br /&gt;
            :)10-o-9-o-8-o-7-o-0  &amp;lt; &amp;lt; &amp;lt;^&amp;lt; &amp;lt; &amp;lt;&lt;br /&gt;
                   |           |   x   ^&lt;br /&gt;
 18-o-17-o-16-o-15-o 6-o-5-o-4-o       ^&lt;br /&gt;
This is a conventional reference used in all of Oni. For any animation of any character in Oni, the rotations of the body parts are calculated with respect to a default pose such as this one. This allows the characters to share animations, even if their &amp;quot;skeletons&amp;quot; ([[TRTA]]) have slightly different proportions.&lt;br /&gt;
&lt;br /&gt;
In the default pose, the XYZ axes of all the bones are oriented the same way. Thus, in the default pose, you can see the &amp;quot;true&amp;quot; translations (offsets) of every body part with respect to its parent, as stored in the &amp;quot;translation array&amp;quot; (TRTA). For example, in Konoko&#039;s case, the &amp;quot;mid&amp;quot; section (part 7), is translated by 1.67 WU along X (i.e., 16.7 cm towards the top of the spine), and by 0.25 along Y (i.e., 2.5 cm towards the front of the spine). Remember that this translation is &#039;&#039;in the &amp;quot;local&amp;quot; frame of reference of the pelvis&#039;&#039;, i.e., with respect to the &#039;&#039;origin&#039;&#039; of the pelvis &#039;&#039;and&#039;&#039; to its local XYZ axes (which are generally different from the world axes). Basically, the local X of the pelvis always points up the spine, the local Y points forward, the local Z points left, and the same goes for &amp;quot;mid&amp;quot;, &amp;quot;chest&amp;quot;, &amp;quot;neck&amp;quot;, and &amp;quot;head&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===-noanim pose===&lt;br /&gt;
[[Image:Konoko_bodyparts.png|thumbnail|right|283px]]&lt;br /&gt;
Supplying the &#039;&#039;&#039;-noanim&#039;&#039;&#039; switch to OniSplit yields the &amp;quot;standing at attention&amp;quot; pose, a much less visually awkward pose than the default &amp;quot;folded pose&amp;quot;. Note that &amp;quot;-noanim&amp;quot; goes in between the destination directory and the source file name:&lt;br /&gt;
:&#039;&#039;&#039;onisplit -extract:dae modelOutput/ -noanim ONCCkonoko_generic.oni&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The result will look something the picture on the right, but the model will have her legs together and her arms by her side.&lt;br /&gt;
&lt;br /&gt;
To produce this pose, these rotations are used:&lt;br /&gt;
:(0,90,90) for the pelvis&lt;br /&gt;
:(0,180,0) for both thighs&lt;br /&gt;
:(90,90,90) for the left shoulder&lt;br /&gt;
:(-90,-90,90) for the right shoulder&lt;br /&gt;
:(0,90,0) for the left biceps&lt;br /&gt;
:(0,-90,0) for the right biceps&lt;br /&gt;
:(-90,0,0) for the left hand/fist&lt;br /&gt;
:(90,0,0) for the right hand/fist&lt;br /&gt;
:(0,0,0) for all other parts&lt;br /&gt;
The placement of the pelvis is adjusted for Konoko, so that the soles of her feet are at Y=0. For male characters the feet will be at Y&amp;lt;0.&lt;br /&gt;
&lt;br /&gt;
===Idle pose===&lt;br /&gt;
If you use &#039;&#039;&#039;-extract:dae TargetFolder ONCCkonoko_generic.oni&#039;&#039;&#039;, taking care that you have the TRAC/TRAM files next to the ONCC, OniSplit will look up the idle animation from the ONCC&#039;s TRAC and apply the rotations from the first frame of the animation to the body parts.&lt;br /&gt;
&lt;br /&gt;
Keep in mind that this idle pose exported by OniSplit is just an arbitrary natural-looking pose, as opposed to the default &amp;quot;folded&amp;quot; orientation or the &amp;quot;at attention&amp;quot; &#039;&#039;&#039;-noanim&#039;&#039;&#039; pose. A frame from an idle animation is certainly &#039;&#039;not&#039;&#039; a standard pose for you to match when importing a new model (unless you are swapping body parts between Oni characters that use the same idle pose, in which case you don&#039;t have to match anything anyway).&lt;br /&gt;
&lt;br /&gt;
===Any pose===&lt;br /&gt;
When exporting from ONCC, you can use the &#039;&#039;&#039;-anim&#039;&#039;&#039; tag to specify any TRAM, as long as it can be found in the character&#039;s TRAC (and as long as it&#039;s not an overlay animation). Or, you can just start from the -noanim or idle pose, and tweak the rotations to match any pose you like.&lt;br /&gt;
&lt;br /&gt;
==Things to try==&lt;br /&gt;
===Bastardizing===&lt;br /&gt;
This is possibly the easiest kind of modding, that doesn&#039;t require texturing skills or even, in most cases, attentive handling of poses and joints. The idea is to:&lt;br /&gt;
#take two Oni characters (for simplicity, two characters who use the same skeleton: e.g., the Konokos from {{C|13}} and {{C|10}})&lt;br /&gt;
#load both of them simultaneously into Mod Tool or Blender. In Mod Tool, just drag-and-drop the .dae files, but &amp;quot;Select none&amp;quot; (Ctrl+Shift+A) before you do, to make sure that you drop both into &amp;quot;Scene_Root&amp;quot;)&lt;br /&gt;
#reparent some body parts (rename if needed) and trim the rest (since the orientations and joint offsets match, you don&#039;t need to rotate/move anything)&lt;br /&gt;
#export, adapt the TRMA if needed, rebuild the level and play&lt;br /&gt;
This allows one to recombine Oni&#039;s characters into &amp;quot;new&amp;quot; ones very easily. Probably the easiest thing is to add sunglasses to any Konoko model ^_^ (or Konoko&#039;s head to any female character)&lt;br /&gt;
&lt;br /&gt;
===Cel-shading===&lt;br /&gt;
An effect similar to cel-shading can be obtained by enclosing the mesh in a shell painted in black and facing inwards.&lt;br /&gt;
:As of 0.9.8, OniSplit can perform this operation with every body part, in an automatic way, with one control parameter (a sorta &amp;quot;margin&amp;quot;, or effective thickness of the &amp;quot;shell&amp;quot;).&lt;br /&gt;
The syntax is as follows:&lt;br /&gt;
:&#039;&#039;&#039;FolderWhereOniSplitIs\OniSplit.exe -create:trbs TargetFolderForCreatedTRBS -cel FolderWhereTheModelIs\name_of_the_model.dae&#039;&#039;&#039;&lt;br /&gt;
:or &#039;&#039;&#039;FolderWhereOniSplitIs\OniSplit.exe -create:trbs TargetFolderForCreatedTRBS -cel:0.1 FolderWhereTheModelIs\name_of_the_model.dae&#039;&#039;&#039;&lt;br /&gt;
The &#039;&#039;&#039;-cel&#039;&#039;&#039; option enables the generation of the shell. The optional parameter (default 0.07) defines the thickness of the shell.&lt;br /&gt;
&lt;br /&gt;
Note that the shells may not be good-looking in every situation without some further tweaking. Rextract the TRBS or ONCC, tweak the shell, and reimport normally (without &#039;&#039;&#039;-cel&#039;&#039;&#039; this time).&lt;br /&gt;
:Some examples of automatically generated shells (not tweaked in any way) can be seen here: http://geyser.oni2.net/edition/celshading/&lt;br /&gt;
&lt;br /&gt;
===New models===&lt;br /&gt;
====Matching body part centers====&lt;br /&gt;
There is actually no such thing as a &amp;quot;standard&amp;quot; pose for 3D characters: the width of the stance, the stiffness of the spine, the angle at which the arms extend from the body - all that varies a lot between models. Therefore the model of your dreams (Gally, Master Chief, Eva-01, whatever) will typically come with a somewhat &amp;quot;random&amp;quot; pose, which has nothing to do with either Oni&#039;s default pose, or even with the &#039;&#039;&#039;-noanim&#039;&#039;&#039; &amp;quot;standard&amp;quot; exported by OniSplit. Another problem is that, if you roundtripped your character through OBJ (which doesn&#039;t support relative placement and rotation), then all the bones are essentially defined in world space, i.e., their centers are at the world&#039;s origin, and their axes are aligned with the world axes.&lt;br /&gt;
&lt;br /&gt;
What can we do about this? Here&#039;s what:&lt;br /&gt;
#First, make sure that the model that you want to import into Oni is split into 19 separate body parts, and that they overlap nicely even under extreme rotations (see below). The &amp;quot;extremes&amp;quot; are something that you can fix later, but you really need the character to be split into 19 body parts. If some of those parts are missing (e.g., [[Barabas]] has no visible shoulder parts), you will still need placeholder meshes (see Barabas as an example). So, get all those meshes ready, alongside each other, at the root of the scene (no hierarchy needed right now).&lt;br /&gt;
#Now, load an Oni character exported with OniSplit into the same scene. This character will be your posing figure, so make sure it is similar (in height and &amp;quot;width&amp;quot;) to the one that you want to import (i.e., don&#039;t use Konoko to match Master Chief, and don&#039;t use Barabas to match Gally). Tweak the rotations of the Oni character until it overlaps with the &amp;quot;random&amp;quot; pose of the new character.&lt;br /&gt;
#Sometimes you can&#039;t make everything overlap just with rotations, and in that case you have to actually translate bones with respect to their parents. By doing this you are actually modifying the skeleton of the Oni character, bringing it closer to the proportions of the new character. If this is the case, and if you want the new character to use Oni&#039;s animations, you will have to make sure that the length of the legs stays roughly the same. If the legs of the new character have about the same length as those of an Oni character (measured between the hip joint and the sole of the feet, or between the pelvis center and the sole of the feet), then the animations may look a bit different, but at least during basic stances and movements the feet will stay roughly in contact with the ground, not above or below.&lt;br /&gt;
#Now, you can inspect the Oni character, which you have posed in a way that is consistent with the &amp;quot;random&amp;quot; arrangement of the new body parts. Try selecting the body parts of the &amp;quot;posing&amp;quot; Oni character, one at a time, and inspect the values of the translation and rotation of the mesh with respect to its parent (i.e., &amp;quot;Local&amp;quot;), in the &amp;quot;Transform&amp;quot; panel (far right). Try switching to &amp;quot;Center&amp;quot; in the &amp;quot;Select&amp;quot; panel (top right corner), and inspect not only the values in the &amp;quot;Transform&amp;quot; panel, but also the color-coded local axes, which can be seen sticking out of the center of every selected mesh, in the viewport. Try to interpret all this, in terms of the &amp;quot;translation array&amp;quot; ([[TRTA]]) and Oni&#039;s conventional neutral pose (see above).&lt;br /&gt;
#The next (and last) step is to ensure that every part of the new character is parented correctly (the thighs to the pelvis, the calves to the thighs, etc), &#039;&#039;and&#039;&#039; that the center of every new body part is placed in the same way as the center of the corresponding body part of the &amp;quot;posed&amp;quot; Oni character. To see the centers of &#039;&#039;all&#039;&#039; body parts of the Oni character, all at once, just select all of its meshes, and either select &amp;quot;Center&amp;quot; in the &amp;quot;Select&amp;quot; panel, top right, or check &amp;quot;Centers&amp;quot; in the drop-down &amp;quot;eye&amp;quot; menu, in the viewport.&lt;br /&gt;
#Basically, the only thing that you will be doing is: reparenting the bodyparts of the new character to each other (by drag-and-dropping them in the &amp;quot;Explorer/Scene_Root&amp;quot; viewport), and matching the translations and rotations of their respective centers to the centers of their counterparts in the posing mesh, which we know to be correct. Therefore, make sure that &amp;quot;Center&amp;quot; is selected the whole time: we are &#039;&#039;not&#039;&#039; moving the meshes themselves, only redefining their relation to each other and their local frames of reference. Some of the matching can be done automatically, but it won&#039;t always work, so be ready to copy some values by hand, from one mesh to the other.&lt;br /&gt;
#The basic order in which you proceed is this.&lt;br /&gt;
#*Select the new pelvis. It already overlaps with the &amp;quot;posing&amp;quot; pelvis, and it needs no parent. The only thing that&#039;s wrong with it is the position and rotation of its center. So, what you do is, you select the new pelvis (or rather its &amp;quot;Center&amp;quot;), and then in the drop-down Transform menu, click &amp;quot;Match all transforms&amp;quot;, and immediately pick the pelvis of the posing Oni character (in &amp;quot;Explorer&amp;quot;). This should make the center of the new pelvis collapse onto the center of the posing pelvis, which is where we want it to be.&lt;br /&gt;
#*Actually it seems that, in the latest version of ModTool, the automating matching of transformations is done in global coordinates, not in the local frame of reference. ([[User:geyser|IIRC]], in previous versions of XSI, it was possible to match transforms in the &amp;quot;Local&amp;quot; sense.) This means that the rotation will probably match correctly, but the translations will typically be off, so you may have to copy them manually.&lt;br /&gt;
#*Basically, after you &amp;quot;Match all transforms&amp;quot;, check the orientation of the new pelvis&#039;s center (the triplet of Euler angles in the &amp;quot;Transform&amp;quot; panel, and the color-coded axes sticking out of the center, in the viewport). Make sure that the axes look the same as for the posing pelvis. If the Euler angles look different but the axes look OK, then you are probably looking at equivalent Euler angles.&lt;br /&gt;
#*Now, select the left thigh (which is not parented to the new pelvis yet). Drag and drop it into the new pelvis in the &amp;quot;Explorer&amp;quot; viewport (i.e., reparent it). Normally, no meshes should move when you do this. But if you move or rotate the center of the new pelvis now, the new left thigh will also move and rotate, because it is already relative to the pelvis. This is why you need to do the pelvis first.&lt;br /&gt;
#*There is still one thing wrong with the left thigh, and that is the placement and rotation of its center - it is still, e.g., at the world&#039;s origin (in this pose), and we want it to be where the center of the posing left thigh is. So, we select the new left thigh&#039;s center, then choose &amp;quot;Match all transforms&amp;quot; in the Transform drop-down, and pick the &amp;quot;posing&amp;quot; left thigh in &amp;quot;Explorer&amp;quot;. Same as above, check the rotation (Euler angles and local axes), and fix the translation manually if needed. Now our new left thigh should also be OK.&lt;br /&gt;
#*All the other body parts are done the same way. Be sure to proceed from the root of the hierarchy to the extremities, and check your results from time to time. Make sure you don&#039;t match the posing body parts to the new body parts instead of the other way round. In other words, look carefully at the first steps detailed above, and make sure that you know what you&#039;re doing.&lt;br /&gt;
All of the above is done in ModTool. I have no idea about how you&#039;d do this in Blender, never tried. [[User:Geyser|AFAIK]], not only is Blender incapable of matching transforms in the local sense, but manual setting of transforms can be done in the global sense only. This means that you would probably need to reduce the new model to Oni&#039;s neutral pose, or use a skeleton.&lt;br /&gt;
&lt;br /&gt;
====Making joints look nice====&lt;br /&gt;
Apart from the consideration regarding the pose (see above), you should be aware of the specific nature of Oni&#039;s body parts.&lt;br /&gt;
Have a good look at an Oni model before you import a new one. Especially look at the generous overlaps between the body parts.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re importing a skinned character, you may have to completely remodel the following regions: elbows, knees, waist, diaphragm.&lt;br /&gt;
E.g., it&#039;s not enough to just cut the leg at the knee. Both the thigh part and the calf part should wrap around the knee joint, and intersect with the other mesh over about 1 world unit (10 cm). Same for the elbow.&lt;br /&gt;
&lt;br /&gt;
The bulk of the shoulder parts (except for Barabas, who doesn&#039;t have any) is supposed to bridge the gap between the chest and the arms for the more &amp;quot;extreme&amp;quot; kind of animations. Oni&#039;s characters mostly use capsule-shaped primitives for shoulders, so if your new model doesn&#039;t have anything that you can use, you can always borrow shoulder parts from an Oni thug, or whoever.&lt;br /&gt;
&lt;br /&gt;
As for the spine, large overlaps (and clever overall decomposition into pelvis/mid/chest) are needed to allow for the extreme bending of the spine (think [[Backbreaker]]).&lt;br /&gt;
Feet and fists can be resolved rather easily (you just extrude them a bit towards the calf/wrist), but you should also mind such things as two-handed aiming overlays.&lt;br /&gt;
&lt;br /&gt;
====Working example====&lt;br /&gt;
{|align=right&lt;br /&gt;
|http://geyser.oni2.net/edition/characters/gally/GLB_shot.png&lt;br /&gt;
|}&lt;br /&gt;
For the sake of this sorta tutorial, we shall pretend three things:&lt;br /&gt;
*Berserker Gally from GUNNM Martian Memory (a PSX game) is, like, the coolest model ever (see picture on the right);&lt;br /&gt;
*we want to make into, like, the coolest Oni character mod ever made, or die trying;&lt;br /&gt;
*as the provider of the (ripped) model, I am not your &amp;lt;strike&amp;gt;bitch&amp;lt;/strike&amp;gt; housemaid (meaning that, although I &#039;&#039;could&#039;&#039; rip an OniSplit-ready DAE or even an Oni-ready TRBS, I will &#039;&#039;not&#039;&#039;);&lt;br /&gt;
*as the writer of the tutorial, I am not your maid either (maybe I could explain it better, with screenshots at every step, but then you wouldn&#039;t suffer, and you wouldn&#039;t learn half as well).&lt;br /&gt;
We shall proceed in steps. The ripped model is provided as-is [http://geyser.oni2.net/edition/characters/gally/GLB_ripped.zip HERE] (well, not really as-is; I roundtripped it through 3D Exploration)&lt;br /&gt;
#Start a &amp;quot;File/New scene&amp;quot; in XSI, and open this thing with &amp;quot;File/Import/OBJ file&amp;quot;. In an &amp;quot;Explorer&amp;quot; window you shall see that there are 15 &amp;quot;bone-something&amp;quot; objects, and 19 &amp;quot;part-something&amp;quot; objects.&lt;br /&gt;
#Don&#039;t go thinking that the 19 &amp;quot;parts&amp;quot; are the ones you need for Oni, because they&#039;re not. They&#039;re just meshes. As you will soon find out,&lt;br /&gt;
#*there are no shoulder parts,&lt;br /&gt;
#*parts 7 to 11 part all belong to the head,&lt;br /&gt;
#*part 18 is pelvis, mid and chest combined, and&lt;br /&gt;
#*the open hands are in a separate OBJ file.&lt;br /&gt;
#There is a bunch of basic things that you want to do before actually adapting this character for Oni&lt;br /&gt;
##The first thing you want to do is combine the head meshes into one. Just comment out the &amp;quot;g&amp;quot; tags for parts 8 through 11, in the OBJ file, and you should get [http://geyser.oni2.net/edition/characters/gally/GLB_merged.zip THIS]. Reimport it into a new scene, and see what changed.&lt;br /&gt;
##Don&#039;t mind the &amp;quot;bone&amp;quot; objects for now. I just happened to include them in the rip, but I&#039;m not sure why.&lt;br /&gt;
##Sooner or later you&#039;ll want to select all the objects (or just &amp;quot;Select all&amp;quot; and deselect the light and camera) and rotate them by -90° along X, so that Gally is upright.&lt;br /&gt;
#Now you want to split the body mesh (part 18) into three parts and to add some placeholder meshes for the shoulders.&lt;br /&gt;
##The shoulders you can get from Barabas. Drop his DAE into the &amp;quot;Scene_Root&amp;quot;, reparent the shoulders to &amp;quot;Scene_Root&amp;quot;, delete the rest of Barabas, and then scale/move the shoulders around until they fit inside Gally&#039;s chest. Try to keep them symmetric.&lt;br /&gt;
##As for the splitting, here is what you do. You duplicate part 18, twice, then hide all the duplicates but one, delete faraway polys, move the adjacent vertices around a bit, and then close the mesh with new polygons (N for making a new triangle, then Esc and Ctrl+Shift+A before creating a new one, to avoid making a quad). While you&#039;re editing the body, you may notice that some quads were apparently triangulated even though they are not perfectly flat, and the triangulation is not done the same way on both sides of the body. You can fix it now (Dissolve, Subdivide, re-Dissolve), or you can save it for later.&lt;br /&gt;
##When you&#039;re done, you can add the hand meshes from the extra OBJ file. To place them correctly, you can use the coordinates of the tips of &amp;quot;bone_4&amp;quot; and &amp;quot;bone_7&amp;quot; (aha! I knew they&#039;d come in handy)&lt;br /&gt;
##When you&#039;re done with that too, you want to get her ready for a &amp;quot;matching session&amp;quot; with an Oni character such as Konoko. Select all objects, then &amp;quot;Freeze all transforms&amp;quot; (from the drop-down menu of the &amp;quot;Transform&amp;quot; panel), then scale the whole bunch by 2 along all axes (don&#039;t ask, just do it), and &amp;quot;Freeze all transforms&amp;quot; again.&lt;br /&gt;
##Now every object (including Barabas&#039;s shoulders) has unit scaling, 0 rotation and 0 translation. Since all the meshes are parented to the scene root, &amp;quot;0 rotation and 0 translation&amp;quot; means that all their centers are at the world&#039;s origin, and the axes of the centers are aligned with the world axes (you can check that by switching to &amp;quot;Center&amp;quot; in the &amp;quot;Select&amp;quot; panel, or by enabling the drawing of Centers in the &amp;quot;eye&amp;quot; drop-down menu of any viewport). If you haven&#039;t done it already, you can rename the &amp;quot;part-something&amp;quot; meshes to the standard names used by OniSplit.&lt;br /&gt;
#Now is a good time to save your work, either as an XSI scene or model, or as Collada. I prefer Collada for some reason, but you must be careful to export only the selection (you don&#039;t want the &amp;quot;Scene_Root&amp;quot; to be exported, or the camera, or the light). Just select all the objects (including the &amp;quot;bone-somethings&amp;quot;, because they might come in handy again), then &amp;quot;File/Crosswalk/Export&amp;quot;, set the exported type to COLLADA, the filename to something sensible, and in the Settings, make sure that &amp;quot;Selection Only&amp;quot; and &amp;quot;Keep Referenced Paths Relative&amp;quot; are ON, and that &amp;quot;Verbose&amp;quot; and &amp;quot;XSI Extra&amp;quot; are OFF. You should get something like [http://geyser.oni2.net/edition/characters/gally/GLB_almost.zip THIS] (tweaked a bit in a text editor, to remove the link to TXMPTextures_babamid, and to make the hands and the rest of Gally use the same material GLB).&lt;br /&gt;
#Now there&#039;s only a few things left to do. Our last step will be the &amp;quot;matching&amp;quot; of Gally&#039;s body parts to those of a modified Konoko. But before that, there are some preliminaries.&lt;br /&gt;
##Start a new scene in XSI, and drag-drop the Gally you just saved into it. Delete the fists if you want to, and name everything according to OniSplit&#039;s standard, if you haven&#039;t already.&lt;br /&gt;
##Use OniSplit to &amp;quot;extract&amp;quot; &#039;&#039;&#039;ONCCkonoko_generic&#039;&#039;&#039; to .dae, with the &#039;&#039;&#039;-noanim&#039;&#039;&#039; tag, and drag-and-drop her into the same scene.&lt;br /&gt;
##*If you named Gally&#039;s meshes correctly, then Konoko&#039;s meshes will be disambiguated with a &amp;quot;2&amp;quot;. This is not a problem.&lt;br /&gt;
##*Note how the height of Konoko&#039;s pelvis (and hip joints) is consistent with Gally&#039;s. That&#039;s what the factor 2 was for.&lt;br /&gt;
##*Also note that Gally&#039;s upper body is rather small in proportion to her legs, and that her calves are slightly longer.&lt;br /&gt;
##Rotate Konoko&#039;s arms and shoulders to match Gally&#039;s pose. Try (0, +-65, 180) for shoulders and (0, +-65, 0) for arms.&lt;br /&gt;
##Now translate Konoko&#039;s body parts (&#039;&#039;not&#039;&#039; the centers) so that their centers match the supposed centers of Gally&#039;s.&lt;br /&gt;
##*Work from the pelvis down the tree, because if you move, e.g., &amp;quot;mid&amp;quot;, then all the upper body will move too. So, do &amp;quot;mid&amp;quot; first, and don&#039;t touch it afterward.&lt;br /&gt;
##*Use Gally&#039;s &amp;quot;skeleton&amp;quot; to pinpoint the supposed centers of her meshes. To see Konoko&#039;s centers while you move the objects, use the viewport&#039;s &amp;quot;eye&amp;quot; settings.&lt;br /&gt;
##*Shoulders, mid and chest can be tricky because the original Gally has no shoulders or mid, and chest has translation 0, unlike in Oni (probably the spine is meant only to twist, not to bend). Just try to place all those bones in proportion with the head-neck distance and approximate shoulder width (which is a bit narrower than Konoko&#039;s. Maybe it&#039;s better to use [[Shinatama Too]] instead of Konoko, here. In any case, don&#039;t be afraid to translate Konoko&#039;s body parts away from the original locations, as long as this &amp;quot;compact Konoko&amp;quot; gets close to Gally&#039;s proportions.&lt;br /&gt;
##*[http://geyser.oni2.net/edition/characters/gally/GLB_compact.zip HERE] is what you should get. Don&#039;t laugh too hard, and instead look at how well I matched the centers of Konoko&#039;s body parts with the tips of Gally&#039;s &amp;quot;bones&amp;quot;. The only thing that&#039;s wrong at this point is that the shoulder parts are too far from their centers, and may end up sticking out of Gally&#039;s chest or back. To fix this, you can move, scale and rotate those parts in any way you like. Just remember to &amp;quot;Freeze all transforms&amp;quot; when you&#039;re done, especially if you&#039;ve used scaling.&lt;br /&gt;
#When you&#039;re happy with the overlap, you are ready to match Gally&#039;s body parts to Konoko&#039;s; both in terms of hierarchy ([[TRIA]]) and in terms of relative placement ([[TRTA]]).&lt;br /&gt;
#*Switch to &amp;quot;Center&amp;quot; in the &amp;quot;Select&amp;quot; panel, select &amp;quot;pelvis&amp;quot; (Gally&#039;s), then click &amp;quot;Match all transforms&amp;quot; in the &amp;quot;Transform&amp;quot; drop-down, and pick &amp;quot;pelvis2&amp;quot; (Konoko&#039;s). Check the result by alternatively selecting &amp;quot;pelvis&amp;quot; and &amp;quot;pelvis2&amp;quot;. Look not only at the values in the &amp;quot;Transform&amp;quot; panel, but also, in any viewport, at the center (white circle) and the local axes (colored) lines. The rotation should be OK, but the translation may be off. If it is, just fix it manually, and check the result in the viewport, alternatively selecting &amp;quot;pelvis&amp;quot; and &amp;quot;pelvis2&amp;quot; until you&#039;re sure that both centers are the same.&lt;br /&gt;
#*When you&#039;re done with &amp;quot;pelvis&amp;quot;, move on to &amp;quot;left_thigh&amp;quot;. Until now it was a sibling of &amp;quot;pelvis&amp;quot;, and a child of &amp;quot;Scene_Root&amp;quot;. Now that &amp;quot;pelvis&amp;quot; is done, you can make &amp;quot;left_thigh&amp;quot; a child of &amp;quot;pelvis&amp;quot;, by drag-and-dropping it onto &amp;quot;pelvis&amp;quot; in the &amp;quot;Explorer&amp;quot; viewport. Then you need to match the relative transforms of this center with respect to the center of &amp;quot;pelvis&amp;quot;. Make sure &amp;quot;Center&amp;quot; is selected in the &amp;quot;Select&amp;quot; panel, then select &amp;quot;left_thigh&amp;quot;, choose &amp;quot;Match all transforms&amp;quot; in the &amp;quot;Transform&amp;quot; drop-down, and pick &amp;quot;left_thigh2&amp;quot; (Konoko&#039;s posing thigh). Again, the rotation will probably be correct, but the translation will probably be off, and you will have to fix it manually. Check the result by alternatively selecting &amp;quot;left_thigh&amp;quot; and &amp;quot;left_thigh2&amp;quot;, until you&#039;re happy.&lt;br /&gt;
#*Now that you&#039;ve gotten the idea, do the same for all the other body parts (reparent Gally&#039;s, and then match Gally&#039;s centers to Konoko&#039;s). Make sure you do one mesh at a time, and progress from the root of the tree (the pelvis) towards the extremities. Try not to forget any mesh, especially early on, or you will have to start over.&lt;br /&gt;
#When the reparenting and matching is over, you should get something like [http://geyser.oni2.net/edition/characters/gally/GLB_matched.zip THIS]. You can check that everything is OK simply by enabling the drawing of centers (either with the &amp;quot;eye&amp;quot; menu of a viewport, or with the &amp;quot;Center&amp;quot; filter), and then by alternatively middle-clicking &amp;quot;pelvis&amp;quot; and &amp;quot;pelvis2&amp;quot; (this selects the whole tree of either Gally, which we are unsure about, or the &amp;quot;compact Konoko&amp;quot;, which we know to be OK because we only tweaked her [[TRTA]] a bit). If the centers and the local axes look the same for both Gally and Konoko, then Gally is OK too. &lt;br /&gt;
#And that&#039;s it, we&#039;re done. Now select all of Gally&#039;s meshes (as a tree, with Ctrl+T or middle-click), export to Collada (&amp;quot;selection only&amp;quot;), import into Oni (DAE to TRBS, TGA to TXMP, ONCC from &#039;&#039;&#039;konoko_generic&#039;&#039;&#039; and TRMA from &#039;&#039;&#039;ninjabot_tx&#039;&#039;&#039;) and it should Just Work. And indeed it does. [http://geyser.oni2.net/edition/characters/gally/GLB_ready.zip HERE] is the input and [http://geyser.oni2.net/edition/characters/gally/level0_GUNNM.zip HERE] is the Oni-ready plugin (Windows only).&lt;br /&gt;
#If there&#039;s a problem with any of these steps, just say so. I&#039;m not sure how I could explain it any better without screenshots.&lt;br /&gt;
#This can be done in well under an hour - if you don&#039;t have to type a tutorial as you go, that is. Once you get the hang of this, you can save some time by completely skipping the &amp;quot;compact Konoko&amp;quot; part, and placing the new character&#039;s centers directly where you want them -- especially if the pose is as simple as this one, and/or if the model comes with a skeleton, or very clear anatomy, such as a robot. Challenges such as the [[AE:Iron Demon]] or the [[AE:BGI|BGI]] troopers/mecha come readily to mind, and could both use a tutorial.&lt;br /&gt;
&lt;br /&gt;
[[Category:Modding tutorials]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Importing_character_models&amp;diff=38798</id>
		<title>Importing character models</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Importing_character_models&amp;diff=38798"/>
		<updated>2022-11-20T22:17:46Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Modding tools - Updated Blender and XSI, removed 3D Exploration and Meshlab */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article covers the importing of new character models into Oni, but also how to export models from Oni. Generally speaking, you are going to want to use [[wikipedia:COLLADA|COLLADA]] as the &amp;quot;passthrough&amp;quot; format between your 3D program and Oni, as this is exactly what COLLADA was designed for. In this article, COLLADA is referred to as &amp;quot;Collada&amp;quot; (because who enjoys being shouted at?), or by &amp;quot;.dae file&amp;quot; (because that is the file suffix for COLLADA).&lt;br /&gt;
&lt;br /&gt;
==Modding tools==&lt;br /&gt;
===OniSplit===&lt;br /&gt;
This is the program that we use to get models into and out of Oni. It is a command line tool. There are GUI wrappers for OniSplit that cover most of its functions (see [[Vago (tool)]], but modders sometimes have to call it from the command line (or use the direct command line input feature in a GUI) to take full advantage of OniSplit&#039;s abilities.&lt;br /&gt;
&lt;br /&gt;
===3D programs===&lt;br /&gt;
====Blender====&lt;br /&gt;
[[Blender]] is the community&#039;s current 3D software of choice, allowing for 3D modeling, animating, and more.&lt;br /&gt;
&lt;br /&gt;
Blender rocks when it comes to [[Lightmapping levels|lightmapping levels]]. XSI is closed source and can only lightmap one mesh at a time with one lightmap texture per mesh. Blender is more flexible because of its free-for-all scripting API, and a nice touch is that it supports radiosity, i.e., emissive materials -- and that&#039;s exactly how Oni&#039;s lighting was done initially (see [[OBLS]]).&lt;br /&gt;
&lt;br /&gt;
====XSI====&lt;br /&gt;
Softimage XSI is a Windows-only 3D software that went discontinued in 2014, and [https://www.moddb.com/downloads/autodesk-softimage-mod-tool-75 a free version of it from 2008] used to to be the community&#039;s modding tool of choice before moving on to Blender. A number of Oni-related addons, tools and tutorials were developed for it can be still found and used. It has detailed documentation and is versatile, whether working with characters or levels, though highly obsolete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===File converters===&lt;br /&gt;
====Autodesk FBX====&lt;br /&gt;
Check out {{AutodeskFBX}} (primarily the FBX converter) if your tool can reliably import/export FBX but has trouble with Collada.&lt;br /&gt;
&lt;br /&gt;
==Basic importing and exporting==&lt;br /&gt;
===Exporting from Oni to Collada===&lt;br /&gt;
OniSplit allows you to export .dae files from both [[TRBS]] and [[ONCC]]. Though all the 3D data is in the TRBS, the textures are listed in the [[TRMA]] file, which is only visible from the ONCC, not the TRBS. Thus, if you want to use the textures while editing the model, convert the ONCC, not the TRBS, into Collada. The instructions below assume that you want the textured model, and thus illustrate how to export the ONCC.&lt;br /&gt;
&lt;br /&gt;
First, you need to find the class name for the character you want to export. You can accomplish this by going into Oni, loading the level in which the desired character appears, and then enabling the shapeshifter cheat -- but you have to do this by turning on [[Developer Mode]], not by entering the &amp;quot;shapeshifter&amp;quot; cheat code, because the regular cheat code does not display the console output that you need. Once Dev Mode is on, press F8 until you reach the desired character. You should see the message &amp;quot;character class &#039;&#039;number&#039;&#039; &#039;&#039;&#039;&#039;&#039;string&#039;&#039;&#039;&#039;&#039;&amp;quot;. The number is unimportant, but write down the string, because that is the class name which provides the basis for the names of the ONCC and TRBS.&lt;br /&gt;
&lt;br /&gt;
In this example, we&#039;ll export one of Konoko&#039;s models. For Konoko, we don&#039;t even need to open Oni to find the name of an ONCC because we have [[Konoko#In-game_outfits|this handy table]]. Let&#039;s use Konoko in her police uniform; you can see from the table that this is ONCCk3 and that it&#039;s found in level2_Final.&lt;br /&gt;
&lt;br /&gt;
Next, you need to decide on the pose in which your character will be exported. See the &amp;quot;Poses&amp;quot; section below for guidance. Without making this example more complicated, we only have two choices for pose: default (folded) and -noanim (standing at attention); we are going to use the second option, for a more visually pleasing result. Here are the steps for getting your desired character in .dae format. Substitute backward slashes for forward ones if you are in Windows.&lt;br /&gt;
&lt;br /&gt;
:1. Create a couple of folders in a convenient place. One folder will receive a whole bunch of files, and the second folder will hold the exported model. We&#039;ll call these paths &amp;quot;splitOutput/&amp;quot; and &amp;quot;modelOutput/&amp;quot; respectively.&lt;br /&gt;
:2. On the command line, go to the directory &amp;quot;Oni/GameDataFolder/&amp;quot;, where &amp;quot;Oni/&amp;quot; means the path to your game.&lt;br /&gt;
:3. Split the desired level&#039;s data into its component resources with OniSplit. Where you see just &amp;quot;onisplit&amp;quot; in the following commands, you should take that to mean &amp;quot;C:\path\to\OniSplit.exe&amp;quot; in Windows or &amp;quot;mono /path/to/OniSplit.exe&amp;quot; on Macs (Mono is a third-party package that you need to run .NET applications in macOS):&lt;br /&gt;
::&amp;lt;tt&amp;gt;onisplit -export splitOutput/ level2_Final.dat&amp;lt;/tt&amp;gt;&lt;br /&gt;
:4. Convert the desired character&#039;s model data into Collada:&lt;br /&gt;
::&amp;lt;tt&amp;gt;onisplit -extract:dae modelOutput/ -noanim splitOutput/ONCCk3.oni&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create the file &#039;&#039;&#039;ONCCk3.dae&#039;&#039;&#039;, and its supporting textures in TGA format, in modelOutput/. Note that only the highest level of detail (LOD) model will be exported using this method. See [[XML:TRBS]] for a method which exports all 5 LOD models.&lt;br /&gt;
&lt;br /&gt;
Note that if you want to extract the model with a pose besides folded or -noanim, you need to have the animation data (the [[TRAC]] and [[TRAM]] .oni files) in the same folder as the model data (the ONCC and its related files). In vanilla (un-modded) Oni, animations for many characters (including Konoko) are only in level0_Final, and, as you saw above, model data is found in whichever level that character appears in. Extracting a model in the pose of your choice will be simpler if you have the [[AE]] installed, as it globalizes character data, placing it all in the level0_Final files in the AE&#039;s GameDataFolder. With vanilla Oni, you will have to split both level0_Final and level&#039;&#039;x&#039;&#039;_Final and then combine their files into one folder before you can perform the &amp;quot;-extract:dae&amp;quot; operation using the &amp;quot;-anim&amp;quot; tag that is discussed below.&lt;br /&gt;
&lt;br /&gt;
===Importing from Collada into Oni===&lt;br /&gt;
When importing characters, the simplest method is to generate a whole body set ([[TRBS]]) from one .dae file. To convert your 3D model, let&#039;s say that you saved it in Collada format with the name &amp;quot;TRBSnewchar.dae&amp;quot;. Run the command:&lt;br /&gt;
:&amp;lt;tt&amp;gt;onisplit -create:trbs DAEtoONI/ TRBSnewchar.dae&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create &#039;&#039;&#039;TRBSnewchar.oni&#039;&#039;&#039; in the folder DAEtoONI. Because it was created from a single .dae file, this TRBS will contain 5 identical models for the 5 levels of detail (LOD) that Oni supports for each character. You have to import by XML in order to specify a different .dae for every LOD; see [[XML:TRBS]] for more info.&lt;br /&gt;
&lt;br /&gt;
Textures are currently ignored upon creating the TRBS (however, the TRBS will of course retain the changes you may have made to the UV coordinates if you were editing a model exported from Oni). Possibly a future version of OniSplit can automatically generate a TRMA and TXMPs if the .dae file has textures.&lt;br /&gt;
&lt;br /&gt;
Note that your file should be named appropriately if you want it to be looked up by name from one or more of Oni&#039;s existing ONCCs, or a new one of your own creation.&lt;br /&gt;
&lt;br /&gt;
To actually test the model in-game, you should [[Making a mod package|create a mod package]] for it, place the package in Oni/AE/packages/, and select it in the AE Installer. The older method of testing your work is to rebuild the level by running &amp;quot;onisplit -import&amp;quot; on a folder containing your TRBS and all the other .oni files for a level, but this only creates a set of level files that you can use on your computer, and is inherently a disorganized approach to keeping track of your work. Creating an AE package will allow you to share your work with other players.&lt;br /&gt;
&lt;br /&gt;
Please note that a final character mod package should contain multiple LOD models for your character. Filling all 5 slots with distinct models is not necessary; many modders create only two or three LOD models and fill the lower LOD slots with the simpler model(s) and the highest slot with the full-detail model, e.g.:&lt;br /&gt;
:# TRBSnewchar_low.dae&lt;br /&gt;
:# TRBSnewchar_low.dae&lt;br /&gt;
:# TRBSnewchar_mid.dae&lt;br /&gt;
:# TRBSnewchar_mid.dae&lt;br /&gt;
:# TRBSnewchar_high.dae&lt;br /&gt;
&lt;br /&gt;
An ONCC contains much more information than just links to TRBS and TRMA, and thus can not be generated automatically. See [[XML:ONCC]] on how to create such a file, and then import the character with this class data into Oni. The easiest way to try out an imported character in Oni is to name your imported TRBS so that it replaces an existing one and no ONCC editing is needed. The next step up is to clone an existing ONCC (in XML) and modify it to link to your new TRBS file(s).&lt;br /&gt;
&lt;br /&gt;
==Poses==&lt;br /&gt;
===Oni&#039;s default orientation===&lt;br /&gt;
This pose, where the body parts are all at zero rotation, is usually referred to in the community as the &amp;quot;folded pose&amp;quot;. The primary axis of a body part, in its own frame of reference, is X. When you move down an arm or leg, or up the spine, you are moving along the positive X direction of every body part.&lt;br /&gt;
When all the bones are aligned with their parents, you get something like this:&lt;br /&gt;
 14-o-13-o-12-o-11-o 3-o-2-o-1-o       ^ z&lt;br /&gt;
                   |           |       ^&lt;br /&gt;
            :)10-o-9-o-8-o-7-o-0  &amp;lt; &amp;lt; &amp;lt;^&amp;lt; &amp;lt; &amp;lt;&lt;br /&gt;
                   |           |   x   ^&lt;br /&gt;
 18-o-17-o-16-o-15-o 6-o-5-o-4-o       ^&lt;br /&gt;
This is a conventional reference used in all of Oni. For any animation of any character in Oni, the rotations of the body parts are calculated with respect to a default pose such as this one. This allows the characters to share animations, even if their &amp;quot;skeletons&amp;quot; ([[TRTA]]) have slightly different proportions.&lt;br /&gt;
&lt;br /&gt;
In the default pose, the XYZ axes of all the bones are oriented the same way. Thus, in the default pose, you can see the &amp;quot;true&amp;quot; translations (offsets) of every body part with respect to its parent, as stored in the &amp;quot;translation array&amp;quot; (TRTA). For example, in Konoko&#039;s case, the &amp;quot;mid&amp;quot; section (part 7), is translated by 1.67 WU along X (i.e., 16.7 cm towards the top of the spine), and by 0.25 along Y (i.e., 2.5 cm towards the front of the spine). Remember that this translation is &#039;&#039;in the &amp;quot;local&amp;quot; frame of reference of the pelvis&#039;&#039;, i.e., with respect to the &#039;&#039;origin&#039;&#039; of the pelvis &#039;&#039;and&#039;&#039; to its local XYZ axes (which are generally different from the world axes). Basically, the local X of the pelvis always points up the spine, the local Y points forward, the local Z points left, and the same goes for &amp;quot;mid&amp;quot;, &amp;quot;chest&amp;quot;, &amp;quot;neck&amp;quot;, and &amp;quot;head&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===-noanim pose===&lt;br /&gt;
[[Image:Konoko_bodyparts.png|thumbnail|right|283px]]&lt;br /&gt;
Supplying the &#039;&#039;&#039;-noanim&#039;&#039;&#039; switch to OniSplit yields the &amp;quot;standing at attention&amp;quot; pose, a much less visually awkward pose than the default &amp;quot;folded pose&amp;quot;. Note that &amp;quot;-noanim&amp;quot; goes in between the destination directory and the source file name:&lt;br /&gt;
:&#039;&#039;&#039;onisplit -extract:dae modelOutput/ -noanim ONCCkonoko_generic.oni&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The result will look something the picture on the right, but the model will have her legs together and her arms by her side.&lt;br /&gt;
&lt;br /&gt;
To produce this pose, these rotations are used:&lt;br /&gt;
:(0,90,90) for the pelvis&lt;br /&gt;
:(0,180,0) for both thighs&lt;br /&gt;
:(90,90,90) for the left shoulder&lt;br /&gt;
:(-90,-90,90) for the right shoulder&lt;br /&gt;
:(0,90,0) for the left biceps&lt;br /&gt;
:(0,-90,0) for the right biceps&lt;br /&gt;
:(-90,0,0) for the left hand/fist&lt;br /&gt;
:(90,0,0) for the right hand/fist&lt;br /&gt;
:(0,0,0) for all other parts&lt;br /&gt;
The placement of the pelvis is adjusted for Konoko, so that the soles of her feet are at Y=0. For male characters the feet will be at Y&amp;lt;0.&lt;br /&gt;
&lt;br /&gt;
===Idle pose===&lt;br /&gt;
If you use &#039;&#039;&#039;-extract:dae TargetFolder ONCCkonoko_generic.oni&#039;&#039;&#039;, taking care that you have the TRAC/TRAM files next to the ONCC, OniSplit will look up the idle animation from the ONCC&#039;s TRAC and apply the rotations from the first frame of the animation to the body parts.&lt;br /&gt;
&lt;br /&gt;
Keep in mind that this idle pose exported by OniSplit is just an arbitrary natural-looking pose, as opposed to the default &amp;quot;folded&amp;quot; orientation or the &amp;quot;at attention&amp;quot; &#039;&#039;&#039;-noanim&#039;&#039;&#039; pose. A frame from an idle animation is certainly &#039;&#039;not&#039;&#039; a standard pose for you to match when importing a new model (unless you are swapping body parts between Oni characters that use the same idle pose, in which case you don&#039;t have to match anything anyway).&lt;br /&gt;
&lt;br /&gt;
===Any pose===&lt;br /&gt;
When exporting from ONCC, you can use the &#039;&#039;&#039;-anim&#039;&#039;&#039; tag to specify any TRAM, as long as it can be found in the character&#039;s TRAC (and as long as it&#039;s not an overlay animation). Or, you can just start from the -noanim or idle pose, and tweak the rotations to match any pose you like.&lt;br /&gt;
&lt;br /&gt;
==Things to try==&lt;br /&gt;
===Bastardizing===&lt;br /&gt;
This is possibly the easiest kind of modding, that doesn&#039;t require texturing skills or even, in most cases, attentive handling of poses and joints. The idea is to:&lt;br /&gt;
#take two Oni characters (for simplicity, two characters who use the same skeleton: e.g., the Konokos from {{C|13}} and {{C|10}})&lt;br /&gt;
#load both of them simultaneously into Mod Tool or Blender. In Mod Tool, just drag-and-drop the .dae files, but &amp;quot;Select none&amp;quot; (Ctrl+Shift+A) before you do, to make sure that you drop both into &amp;quot;Scene_Root&amp;quot;)&lt;br /&gt;
#reparent some body parts (rename if needed) and trim the rest (since the orientations and joint offsets match, you don&#039;t need to rotate/move anything)&lt;br /&gt;
#export, adapt the TRMA if needed, rebuild the level and play&lt;br /&gt;
This allows one to recombine Oni&#039;s characters into &amp;quot;new&amp;quot; ones very easily. Probably the easiest thing is to add sunglasses to any Konoko model ^_^ (or Konoko&#039;s head to any female character)&lt;br /&gt;
&lt;br /&gt;
===Cel-shading===&lt;br /&gt;
An effect similar to cel-shading can be obtained by enclosing the mesh in a shell painted in black and facing inwards.&lt;br /&gt;
:As of 0.9.8, OniSplit can perform this operation with every body part, in an automatic way, with one control parameter (a sorta &amp;quot;margin&amp;quot;, or effective thickness of the &amp;quot;shell&amp;quot;).&lt;br /&gt;
The syntax is as follows:&lt;br /&gt;
:&#039;&#039;&#039;FolderWhereOniSplitIs\OniSplit.exe -create:trbs TargetFolderForCreatedTRBS -cel FolderWhereTheModelIs\name_of_the_model.dae&#039;&#039;&#039;&lt;br /&gt;
:or &#039;&#039;&#039;FolderWhereOniSplitIs\OniSplit.exe -create:trbs TargetFolderForCreatedTRBS -cel:0.1 FolderWhereTheModelIs\name_of_the_model.dae&#039;&#039;&#039;&lt;br /&gt;
The &#039;&#039;&#039;-cel&#039;&#039;&#039; option enables the generation of the shell. The optional parameter (default 0.07) defines the thickness of the shell.&lt;br /&gt;
&lt;br /&gt;
Note that the shells may not be good-looking in every situation without some further tweaking. Rextract the TRBS or ONCC, tweak the shell, and reimport normally (without &#039;&#039;&#039;-cel&#039;&#039;&#039; this time).&lt;br /&gt;
:Some examples of automatically generated shells (not tweaked in any way) can be seen here: http://geyser.oni2.net/edition/celshading/&lt;br /&gt;
&lt;br /&gt;
===New models===&lt;br /&gt;
====Matching body part centers====&lt;br /&gt;
There is actually no such thing as a &amp;quot;standard&amp;quot; pose for 3D characters: the width of the stance, the stiffness of the spine, the angle at which the arms extend from the body - all that varies a lot between models. Therefore the model of your dreams (Gally, Master Chief, Eva-01, whatever) will typically come with a somewhat &amp;quot;random&amp;quot; pose, which has nothing to do with either Oni&#039;s default pose, or even with the &#039;&#039;&#039;-noanim&#039;&#039;&#039; &amp;quot;standard&amp;quot; exported by OniSplit. Another problem is that, if you roundtripped your character through OBJ (which doesn&#039;t support relative placement and rotation), then all the bones are essentially defined in world space, i.e., their centers are at the world&#039;s origin, and their axes are aligned with the world axes.&lt;br /&gt;
&lt;br /&gt;
What can we do about this? Here&#039;s what:&lt;br /&gt;
#First, make sure that the model that you want to import into Oni is split into 19 separate body parts, and that they overlap nicely even under extreme rotations (see below). The &amp;quot;extremes&amp;quot; are something that you can fix later, but you really need the character to be split into 19 body parts. If some of those parts are missing (e.g., [[Barabas]] has no visible shoulder parts), you will still need placeholder meshes (see Barabas as an example). So, get all those meshes ready, alongside each other, at the root of the scene (no hierarchy needed right now).&lt;br /&gt;
#Now, load an Oni character exported with OniSplit into the same scene. This character will be your posing figure, so make sure it is similar (in height and &amp;quot;width&amp;quot;) to the one that you want to import (i.e., don&#039;t use Konoko to match Master Chief, and don&#039;t use Barabas to match Gally). Tweak the rotations of the Oni character until it overlaps with the &amp;quot;random&amp;quot; pose of the new character.&lt;br /&gt;
#Sometimes you can&#039;t make everything overlap just with rotations, and in that case you have to actually translate bones with respect to their parents. By doing this you are actually modifying the skeleton of the Oni character, bringing it closer to the proportions of the new character. If this is the case, and if you want the new character to use Oni&#039;s animations, you will have to make sure that the length of the legs stays roughly the same. If the legs of the new character have about the same length as those of an Oni character (measured between the hip joint and the sole of the feet, or between the pelvis center and the sole of the feet), then the animations may look a bit different, but at least during basic stances and movements the feet will stay roughly in contact with the ground, not above or below.&lt;br /&gt;
#Now, you can inspect the Oni character, which you have posed in a way that is consistent with the &amp;quot;random&amp;quot; arrangement of the new body parts. Try selecting the body parts of the &amp;quot;posing&amp;quot; Oni character, one at a time, and inspect the values of the translation and rotation of the mesh with respect to its parent (i.e., &amp;quot;Local&amp;quot;), in the &amp;quot;Transform&amp;quot; panel (far right). Try switching to &amp;quot;Center&amp;quot; in the &amp;quot;Select&amp;quot; panel (top right corner), and inspect not only the values in the &amp;quot;Transform&amp;quot; panel, but also the color-coded local axes, which can be seen sticking out of the center of every selected mesh, in the viewport. Try to interpret all this, in terms of the &amp;quot;translation array&amp;quot; ([[TRTA]]) and Oni&#039;s conventional neutral pose (see above).&lt;br /&gt;
#The next (and last) step is to ensure that every part of the new character is parented correctly (the thighs to the pelvis, the calves to the thighs, etc), &#039;&#039;and&#039;&#039; that the center of every new body part is placed in the same way as the center of the corresponding body part of the &amp;quot;posed&amp;quot; Oni character. To see the centers of &#039;&#039;all&#039;&#039; body parts of the Oni character, all at once, just select all of its meshes, and either select &amp;quot;Center&amp;quot; in the &amp;quot;Select&amp;quot; panel, top right, or check &amp;quot;Centers&amp;quot; in the drop-down &amp;quot;eye&amp;quot; menu, in the viewport.&lt;br /&gt;
#Basically, the only thing that you will be doing is: reparenting the bodyparts of the new character to each other (by drag-and-dropping them in the &amp;quot;Explorer/Scene_Root&amp;quot; viewport), and matching the translations and rotations of their respective centers to the centers of their counterparts in the posing mesh, which we know to be correct. Therefore, make sure that &amp;quot;Center&amp;quot; is selected the whole time: we are &#039;&#039;not&#039;&#039; moving the meshes themselves, only redefining their relation to each other and their local frames of reference. Some of the matching can be done automatically, but it won&#039;t always work, so be ready to copy some values by hand, from one mesh to the other.&lt;br /&gt;
#The basic order in which you proceed is this.&lt;br /&gt;
#*Select the new pelvis. It already overlaps with the &amp;quot;posing&amp;quot; pelvis, and it needs no parent. The only thing that&#039;s wrong with it is the position and rotation of its center. So, what you do is, you select the new pelvis (or rather its &amp;quot;Center&amp;quot;), and then in the drop-down Transform menu, click &amp;quot;Match all transforms&amp;quot;, and immediately pick the pelvis of the posing Oni character (in &amp;quot;Explorer&amp;quot;). This should make the center of the new pelvis collapse onto the center of the posing pelvis, which is where we want it to be.&lt;br /&gt;
#*Actually it seems that, in the latest version of ModTool, the automating matching of transformations is done in global coordinates, not in the local frame of reference. ([[User:geyser|IIRC]], in previous versions of XSI, it was possible to match transforms in the &amp;quot;Local&amp;quot; sense.) This means that the rotation will probably match correctly, but the translations will typically be off, so you may have to copy them manually.&lt;br /&gt;
#*Basically, after you &amp;quot;Match all transforms&amp;quot;, check the orientation of the new pelvis&#039;s center (the triplet of Euler angles in the &amp;quot;Transform&amp;quot; panel, and the color-coded axes sticking out of the center, in the viewport). Make sure that the axes look the same as for the posing pelvis. If the Euler angles look different but the axes look OK, then you are probably looking at equivalent Euler angles.&lt;br /&gt;
#*Now, select the left thigh (which is not parented to the new pelvis yet). Drag and drop it into the new pelvis in the &amp;quot;Explorer&amp;quot; viewport (i.e., reparent it). Normally, no meshes should move when you do this. But if you move or rotate the center of the new pelvis now, the new left thigh will also move and rotate, because it is already relative to the pelvis. This is why you need to do the pelvis first.&lt;br /&gt;
#*There is still one thing wrong with the left thigh, and that is the placement and rotation of its center - it is still, e.g., at the world&#039;s origin (in this pose), and we want it to be where the center of the posing left thigh is. So, we select the new left thigh&#039;s center, then choose &amp;quot;Match all transforms&amp;quot; in the Transform drop-down, and pick the &amp;quot;posing&amp;quot; left thigh in &amp;quot;Explorer&amp;quot;. Same as above, check the rotation (Euler angles and local axes), and fix the translation manually if needed. Now our new left thigh should also be OK.&lt;br /&gt;
#*All the other body parts are done the same way. Be sure to proceed from the root of the hierarchy to the extremities, and check your results from time to time. Make sure you don&#039;t match the posing body parts to the new body parts instead of the other way round. In other words, look carefully at the first steps detailed above, and make sure that you know what you&#039;re doing.&lt;br /&gt;
All of the above is done in ModTool. I have no idea about how you&#039;d do this in Blender, never tried. [[User:Geyser|AFAIK]], not only is Blender incapable of matching transforms in the local sense, but manual setting of transforms can be done in the global sense only. This means that you would probably need to reduce the new model to Oni&#039;s neutral pose, or use a skeleton.&lt;br /&gt;
&lt;br /&gt;
====Making joints look nice====&lt;br /&gt;
Apart from the consideration regarding the pose (see above), you should be aware of the specific nature of Oni&#039;s body parts.&lt;br /&gt;
Have a good look at an Oni model before you import a new one. Especially look at the generous overlaps between the body parts.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re importing a skinned character, you may have to completely remodel the following regions: elbows, knees, waist, diaphragm.&lt;br /&gt;
E.g., it&#039;s not enough to just cut the leg at the knee. Both the thigh part and the calf part should wrap around the knee joint, and intersect with the other mesh over about 1 world unit (10 cm). Same for the elbow.&lt;br /&gt;
&lt;br /&gt;
The bulk of the shoulder parts (except for Barabas, who doesn&#039;t have any) is supposed to bridge the gap between the chest and the arms for the more &amp;quot;extreme&amp;quot; kind of animations. Oni&#039;s characters mostly use capsule-shaped primitives for shoulders, so if your new model doesn&#039;t have anything that you can use, you can always borrow shoulder parts from an Oni thug, or whoever.&lt;br /&gt;
&lt;br /&gt;
As for the spine, large overlaps (and clever overall decomposition into pelvis/mid/chest) are needed to allow for the extreme bending of the spine (think [[Backbreaker]]).&lt;br /&gt;
Feet and fists can be resolved rather easily (you just extrude them a bit towards the calf/wrist), but you should also mind such things as two-handed aiming overlays.&lt;br /&gt;
&lt;br /&gt;
====Working example====&lt;br /&gt;
{|align=right&lt;br /&gt;
|http://geyser.oni2.net/edition/characters/gally/GLB_shot.png&lt;br /&gt;
|}&lt;br /&gt;
For the sake of this sorta tutorial, we shall pretend three things:&lt;br /&gt;
*Berserker Gally from GUNNM Martian Memory (a PSX game) is, like, the coolest model ever (see picture on the right);&lt;br /&gt;
*we want to make into, like, the coolest Oni character mod ever made, or die trying;&lt;br /&gt;
*as the provider of the (ripped) model, I am not your &amp;lt;strike&amp;gt;bitch&amp;lt;/strike&amp;gt; housemaid (meaning that, although I &#039;&#039;could&#039;&#039; rip an OniSplit-ready DAE or even an Oni-ready TRBS, I will &#039;&#039;not&#039;&#039;);&lt;br /&gt;
*as the writer of the tutorial, I am not your maid either (maybe I could explain it better, with screenshots at every step, but then you wouldn&#039;t suffer, and you wouldn&#039;t learn half as well).&lt;br /&gt;
We shall proceed in steps. The ripped model is provided as-is [http://geyser.oni2.net/edition/characters/gally/GLB_ripped.zip HERE] (well, not really as-is; I roundtripped it through 3D Exploration)&lt;br /&gt;
#Start a &amp;quot;File/New scene&amp;quot; in XSI, and open this thing with &amp;quot;File/Import/OBJ file&amp;quot;. In an &amp;quot;Explorer&amp;quot; window you shall see that there are 15 &amp;quot;bone-something&amp;quot; objects, and 19 &amp;quot;part-something&amp;quot; objects.&lt;br /&gt;
#Don&#039;t go thinking that the 19 &amp;quot;parts&amp;quot; are the ones you need for Oni, because they&#039;re not. They&#039;re just meshes. As you will soon find out,&lt;br /&gt;
#*there are no shoulder parts,&lt;br /&gt;
#*parts 7 to 11 part all belong to the head,&lt;br /&gt;
#*part 18 is pelvis, mid and chest combined, and&lt;br /&gt;
#*the open hands are in a separate OBJ file.&lt;br /&gt;
#There is a bunch of basic things that you want to do before actually adapting this character for Oni&lt;br /&gt;
##The first thing you want to do is combine the head meshes into one. Just comment out the &amp;quot;g&amp;quot; tags for parts 8 through 11, in the OBJ file, and you should get [http://geyser.oni2.net/edition/characters/gally/GLB_merged.zip THIS]. Reimport it into a new scene, and see what changed.&lt;br /&gt;
##Don&#039;t mind the &amp;quot;bone&amp;quot; objects for now. I just happened to include them in the rip, but I&#039;m not sure why.&lt;br /&gt;
##Sooner or later you&#039;ll want to select all the objects (or just &amp;quot;Select all&amp;quot; and deselect the light and camera) and rotate them by -90° along X, so that Gally is upright.&lt;br /&gt;
#Now you want to split the body mesh (part 18) into three parts and to add some placeholder meshes for the shoulders.&lt;br /&gt;
##The shoulders you can get from Barabas. Drop his DAE into the &amp;quot;Scene_Root&amp;quot;, reparent the shoulders to &amp;quot;Scene_Root&amp;quot;, delete the rest of Barabas, and then scale/move the shoulders around until they fit inside Gally&#039;s chest. Try to keep them symmetric.&lt;br /&gt;
##As for the splitting, here is what you do. You duplicate part 18, twice, then hide all the duplicates but one, delete faraway polys, move the adjacent vertices around a bit, and then close the mesh with new polygons (N for making a new triangle, then Esc and Ctrl+Shift+A before creating a new one, to avoid making a quad). While you&#039;re editing the body, you may notice that some quads were apparently triangulated even though they are not perfectly flat, and the triangulation is not done the same way on both sides of the body. You can fix it now (Dissolve, Subdivide, re-Dissolve), or you can save it for later.&lt;br /&gt;
##When you&#039;re done, you can add the hand meshes from the extra OBJ file. To place them correctly, you can use the coordinates of the tips of &amp;quot;bone_4&amp;quot; and &amp;quot;bone_7&amp;quot; (aha! I knew they&#039;d come in handy)&lt;br /&gt;
##When you&#039;re done with that too, you want to get her ready for a &amp;quot;matching session&amp;quot; with an Oni character such as Konoko. Select all objects, then &amp;quot;Freeze all transforms&amp;quot; (from the drop-down menu of the &amp;quot;Transform&amp;quot; panel), then scale the whole bunch by 2 along all axes (don&#039;t ask, just do it), and &amp;quot;Freeze all transforms&amp;quot; again.&lt;br /&gt;
##Now every object (including Barabas&#039;s shoulders) has unit scaling, 0 rotation and 0 translation. Since all the meshes are parented to the scene root, &amp;quot;0 rotation and 0 translation&amp;quot; means that all their centers are at the world&#039;s origin, and the axes of the centers are aligned with the world axes (you can check that by switching to &amp;quot;Center&amp;quot; in the &amp;quot;Select&amp;quot; panel, or by enabling the drawing of Centers in the &amp;quot;eye&amp;quot; drop-down menu of any viewport). If you haven&#039;t done it already, you can rename the &amp;quot;part-something&amp;quot; meshes to the standard names used by OniSplit.&lt;br /&gt;
#Now is a good time to save your work, either as an XSI scene or model, or as Collada. I prefer Collada for some reason, but you must be careful to export only the selection (you don&#039;t want the &amp;quot;Scene_Root&amp;quot; to be exported, or the camera, or the light). Just select all the objects (including the &amp;quot;bone-somethings&amp;quot;, because they might come in handy again), then &amp;quot;File/Crosswalk/Export&amp;quot;, set the exported type to COLLADA, the filename to something sensible, and in the Settings, make sure that &amp;quot;Selection Only&amp;quot; and &amp;quot;Keep Referenced Paths Relative&amp;quot; are ON, and that &amp;quot;Verbose&amp;quot; and &amp;quot;XSI Extra&amp;quot; are OFF. You should get something like [http://geyser.oni2.net/edition/characters/gally/GLB_almost.zip THIS] (tweaked a bit in a text editor, to remove the link to TXMPTextures_babamid, and to make the hands and the rest of Gally use the same material GLB).&lt;br /&gt;
#Now there&#039;s only a few things left to do. Our last step will be the &amp;quot;matching&amp;quot; of Gally&#039;s body parts to those of a modified Konoko. But before that, there are some preliminaries.&lt;br /&gt;
##Start a new scene in XSI, and drag-drop the Gally you just saved into it. Delete the fists if you want to, and name everything according to OniSplit&#039;s standard, if you haven&#039;t already.&lt;br /&gt;
##Use OniSplit to &amp;quot;extract&amp;quot; &#039;&#039;&#039;ONCCkonoko_generic&#039;&#039;&#039; to .dae, with the &#039;&#039;&#039;-noanim&#039;&#039;&#039; tag, and drag-and-drop her into the same scene.&lt;br /&gt;
##*If you named Gally&#039;s meshes correctly, then Konoko&#039;s meshes will be disambiguated with a &amp;quot;2&amp;quot;. This is not a problem.&lt;br /&gt;
##*Note how the height of Konoko&#039;s pelvis (and hip joints) is consistent with Gally&#039;s. That&#039;s what the factor 2 was for.&lt;br /&gt;
##*Also note that Gally&#039;s upper body is rather small in proportion to her legs, and that her calves are slightly longer.&lt;br /&gt;
##Rotate Konoko&#039;s arms and shoulders to match Gally&#039;s pose. Try (0, +-65, 180) for shoulders and (0, +-65, 0) for arms.&lt;br /&gt;
##Now translate Konoko&#039;s body parts (&#039;&#039;not&#039;&#039; the centers) so that their centers match the supposed centers of Gally&#039;s.&lt;br /&gt;
##*Work from the pelvis down the tree, because if you move, e.g., &amp;quot;mid&amp;quot;, then all the upper body will move too. So, do &amp;quot;mid&amp;quot; first, and don&#039;t touch it afterward.&lt;br /&gt;
##*Use Gally&#039;s &amp;quot;skeleton&amp;quot; to pinpoint the supposed centers of her meshes. To see Konoko&#039;s centers while you move the objects, use the viewport&#039;s &amp;quot;eye&amp;quot; settings.&lt;br /&gt;
##*Shoulders, mid and chest can be tricky because the original Gally has no shoulders or mid, and chest has translation 0, unlike in Oni (probably the spine is meant only to twist, not to bend). Just try to place all those bones in proportion with the head-neck distance and approximate shoulder width (which is a bit narrower than Konoko&#039;s. Maybe it&#039;s better to use [[Shinatama Too]] instead of Konoko, here. In any case, don&#039;t be afraid to translate Konoko&#039;s body parts away from the original locations, as long as this &amp;quot;compact Konoko&amp;quot; gets close to Gally&#039;s proportions.&lt;br /&gt;
##*[http://geyser.oni2.net/edition/characters/gally/GLB_compact.zip HERE] is what you should get. Don&#039;t laugh too hard, and instead look at how well I matched the centers of Konoko&#039;s body parts with the tips of Gally&#039;s &amp;quot;bones&amp;quot;. The only thing that&#039;s wrong at this point is that the shoulder parts are too far from their centers, and may end up sticking out of Gally&#039;s chest or back. To fix this, you can move, scale and rotate those parts in any way you like. Just remember to &amp;quot;Freeze all transforms&amp;quot; when you&#039;re done, especially if you&#039;ve used scaling.&lt;br /&gt;
#When you&#039;re happy with the overlap, you are ready to match Gally&#039;s body parts to Konoko&#039;s; both in terms of hierarchy ([[TRIA]]) and in terms of relative placement ([[TRTA]]).&lt;br /&gt;
#*Switch to &amp;quot;Center&amp;quot; in the &amp;quot;Select&amp;quot; panel, select &amp;quot;pelvis&amp;quot; (Gally&#039;s), then click &amp;quot;Match all transforms&amp;quot; in the &amp;quot;Transform&amp;quot; drop-down, and pick &amp;quot;pelvis2&amp;quot; (Konoko&#039;s). Check the result by alternatively selecting &amp;quot;pelvis&amp;quot; and &amp;quot;pelvis2&amp;quot;. Look not only at the values in the &amp;quot;Transform&amp;quot; panel, but also, in any viewport, at the center (white circle) and the local axes (colored) lines. The rotation should be OK, but the translation may be off. If it is, just fix it manually, and check the result in the viewport, alternatively selecting &amp;quot;pelvis&amp;quot; and &amp;quot;pelvis2&amp;quot; until you&#039;re sure that both centers are the same.&lt;br /&gt;
#*When you&#039;re done with &amp;quot;pelvis&amp;quot;, move on to &amp;quot;left_thigh&amp;quot;. Until now it was a sibling of &amp;quot;pelvis&amp;quot;, and a child of &amp;quot;Scene_Root&amp;quot;. Now that &amp;quot;pelvis&amp;quot; is done, you can make &amp;quot;left_thigh&amp;quot; a child of &amp;quot;pelvis&amp;quot;, by drag-and-dropping it onto &amp;quot;pelvis&amp;quot; in the &amp;quot;Explorer&amp;quot; viewport. Then you need to match the relative transforms of this center with respect to the center of &amp;quot;pelvis&amp;quot;. Make sure &amp;quot;Center&amp;quot; is selected in the &amp;quot;Select&amp;quot; panel, then select &amp;quot;left_thigh&amp;quot;, choose &amp;quot;Match all transforms&amp;quot; in the &amp;quot;Transform&amp;quot; drop-down, and pick &amp;quot;left_thigh2&amp;quot; (Konoko&#039;s posing thigh). Again, the rotation will probably be correct, but the translation will probably be off, and you will have to fix it manually. Check the result by alternatively selecting &amp;quot;left_thigh&amp;quot; and &amp;quot;left_thigh2&amp;quot;, until you&#039;re happy.&lt;br /&gt;
#*Now that you&#039;ve gotten the idea, do the same for all the other body parts (reparent Gally&#039;s, and then match Gally&#039;s centers to Konoko&#039;s). Make sure you do one mesh at a time, and progress from the root of the tree (the pelvis) towards the extremities. Try not to forget any mesh, especially early on, or you will have to start over.&lt;br /&gt;
#When the reparenting and matching is over, you should get something like [http://geyser.oni2.net/edition/characters/gally/GLB_matched.zip THIS]. You can check that everything is OK simply by enabling the drawing of centers (either with the &amp;quot;eye&amp;quot; menu of a viewport, or with the &amp;quot;Center&amp;quot; filter), and then by alternatively middle-clicking &amp;quot;pelvis&amp;quot; and &amp;quot;pelvis2&amp;quot; (this selects the whole tree of either Gally, which we are unsure about, or the &amp;quot;compact Konoko&amp;quot;, which we know to be OK because we only tweaked her [[TRTA]] a bit). If the centers and the local axes look the same for both Gally and Konoko, then Gally is OK too. &lt;br /&gt;
#And that&#039;s it, we&#039;re done. Now select all of Gally&#039;s meshes (as a tree, with Ctrl+T or middle-click), export to Collada (&amp;quot;selection only&amp;quot;), import into Oni (DAE to TRBS, TGA to TXMP, ONCC from &#039;&#039;&#039;konoko_generic&#039;&#039;&#039; and TRMA from &#039;&#039;&#039;ninjabot_tx&#039;&#039;&#039;) and it should Just Work. And indeed it does. [http://geyser.oni2.net/edition/characters/gally/GLB_ready.zip HERE] is the input and [http://geyser.oni2.net/edition/characters/gally/level0_GUNNM.zip HERE] is the Oni-ready plugin (Windows only).&lt;br /&gt;
#If there&#039;s a problem with any of these steps, just say so. I&#039;m not sure how I could explain it any better without screenshots.&lt;br /&gt;
#This can be done in well under an hour - if you don&#039;t have to type a tutorial as you go, that is. Once you get the hang of this, you can save some time by completely skipping the &amp;quot;compact Konoko&amp;quot; part, and placing the new character&#039;s centers directly where you want them -- especially if the pose is as simple as this one, and/or if the model comes with a skeleton, or very clear anatomy, such as a robot. Challenges such as the [[AE:Iron Demon]] or the [[AE:BGI|BGI]] troopers/mecha come readily to mind, and could both use a tutorial.&lt;br /&gt;
&lt;br /&gt;
[[Category:Modding tutorials]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=OniSplit&amp;diff=38796</id>
		<title>OniSplit</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=OniSplit&amp;diff=38796"/>
		<updated>2022-11-20T21:55:21Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Commands - added Blender support */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCfloat|side=right}}&lt;br /&gt;
{{Hatnote|Before reading this page, it&#039;s a good idea to be familiar with basic Oni [[game data terminology]].}}&lt;br /&gt;
&#039;&#039;&#039;OniSplit&#039;&#039;&#039;, written by [[User_talk:Neo|Neo]], is an integral part of the [[Anniversary Edition]] and an essential modding tool on its own. It is a command line tool which can import and export almost all kinds of Oni game data, including textures, sound, 3D models, level geometry and combat animations. Its name comes from its original purpose, which was breaking Oni&#039;s level data files into individual resources. Later, the ability to convert those resources&#039; data between Oni&#039;s format and standard file formats was added. OniSplit incorporates the latest [[OBD|knowledge about Oni&#039;s game data]], and it is currently the community&#039;s main modding tool.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Subpages:&#039;&#039; [[/Change_log|Change log]] (past versions), [[/WIP|WIP notes]] (upcoming versions)&lt;br /&gt;
&lt;br /&gt;
==Getting it==&lt;br /&gt;
===Download links===&lt;br /&gt;
* Latest release of OniSplit: [http://mods.oni2.net/node/38 v0.9.99.2] ([http://websvn.illy.bz/dl.php?repname=Oni2&amp;amp;path=%2FOniSplit%2F&amp;amp;isdir=1 source code])&lt;br /&gt;
* The current GUI for OniSplit is [[Vago (tool)|Vago]]. &#039;&#039;&#039;You should try the GUI to see if it does what you need before working with OniSplit on the command line.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Requirements===&lt;br /&gt;
*Windows: [https://dotnet.microsoft.com/en-us/download/dotnet-framework .NET framework]&lt;br /&gt;
*macOS: [https://www.mono-project.com/download/stable/ Mono framework]&lt;br /&gt;
&lt;br /&gt;
==Workflow==&lt;br /&gt;
OniSplit is used in up to four different stages when modding:&lt;br /&gt;
{|&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|&amp;lt;span style=&amp;quot;font-size:150%&amp;quot;&amp;gt;&#039;&#039;&#039;OUT&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|&#039;&#039;Exporting&#039;&#039; - using the &amp;lt;tt&amp;gt;-export&amp;lt;/tt&amp;gt; command, a [[Dat|level data file]] is broken into its component resources, .oni files.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;border-style: solid; border-width: 0 0 1px 0&amp;quot;|&#039;&#039;Extracting&#039;&#039; - using the &amp;lt;tt&amp;gt;-extract&amp;lt;/tt&amp;gt; commands, .oni files are converted to standard-format files that can be edited in various third-party programs.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|&amp;lt;center&amp;gt;&amp;lt;span style=&amp;quot;font-size:150%&amp;quot;&amp;gt;&#039;&#039;&#039;IN&#039;&#039;&#039;&amp;lt;/span&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&#039;&#039;Creating&#039;&#039; - using the &amp;lt;tt&amp;gt;-create&amp;lt;/tt&amp;gt; commands, standard-format files are converted into .oni files.&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Importing&#039;&#039; - using the &amp;lt;tt&amp;gt;-import&amp;lt;/tt&amp;gt; command, a folder of .oni files is combined into a level data file.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note that &amp;quot;extracting&amp;quot; refers to a conversion from one format to another, but &amp;quot;exporting&amp;quot; only refers to the creation of .oni files from a .dat file. When exporting, no conversion or re-formatting is taking place; the data is simply being copied out of a .dat (any connected binary data in .raw/.sep files will be concatenated to the data from the .dat when making the .oni).&lt;br /&gt;
&lt;br /&gt;
==Beginner&#039;s tips==&lt;br /&gt;
{{Divhide|show=yes|For users new to the command line or to OniSplit}}&lt;br /&gt;
In Windows, there are several options through which you can use OniSplit - out of which it is recommended to get Vago and CMDer:&lt;br /&gt;
* [[Vago (tool)|Vago]] is a GUI for OniSplit which allows you to handle all general conversions, save your sessions as project files, input manual commands if needed, and more. The two downsides of it is that it doesn&#039;t support Blender yet, forcing the users input commands manually, which in turn are not stored upon ending the session.&lt;br /&gt;
* [https://cmder.app/ CMDer] is an excellent alternative to cmd.exe. It can be customized to allow starting it from any folder you pick with the context menu, and it also stores the most recently used commands after ending the session. Currently it is highly useful for Blender-related operations.&lt;br /&gt;
* Command Prompt/cmd.exe. Windows&#039; default command line interpreter, it&#039;s a poor choice as it does not store most recently used commands.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On Macs, the command line is found in the Terminal app (/Applications/Utilities) (press Command-Spacebar and type &amp;quot;Terminal&amp;quot; to get there faster).&lt;br /&gt;
&lt;br /&gt;
===OniSplit syntax===&lt;br /&gt;
The basic syntax is:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Windows&#039;&#039;&#039;||&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background:rgb(235,235,235); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;OniSplit.exe&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(175,175,255); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;-create:trbs&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(255,156,156); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;C:\Games\Oni\SomeFolder&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(175,175,255); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;-normals&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(156,255,156); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;C:\Games\Oni\Modding\TRBSMyNewChar.dae&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Mac&#039;&#039;&#039;||&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background:rgb(235,235,235); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;mono OniSplit.exe&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(175,175,255); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;-create:trbs&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(255,156,156); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;/Games/Oni/SomeFolder&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(175,175,255); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;-normals&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(156,255,156); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;/Games/Oni/Modding/TRBSMyNewChar.dae&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Here&#039;s how it breaks down:&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width:130px&amp;quot;|&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background:rgb(235,235,235); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;&#039;&#039;&#039;Invocation&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|Windows can refer to the program directly, but Macs use Mono to run the .NET app; note also that if OniSplit.exe is not in the Command Prompt/Terminal&#039;s current directory, you must provide the full path to it or set the path variable.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background:rgb(175,175,255); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;&#039;&#039;&#039;Option&#039;&#039;&#039;&amp;lt;/span&amp;gt;||The command.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background:rgb(255,156,156); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;&#039;&#039;&#039;Path to folder&#039;&#039;&#039;&amp;lt;/span&amp;gt;||Whether destination or source, the path which is a folder comes first. &amp;lt;u&amp;gt;Use the full path to the folder (starting from &amp;quot;C:\&amp;quot;, or &amp;quot;/&amp;quot; on Macs).&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background:rgb(175,175,255); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;&#039;&#039;&#039;Option flags&#039;&#039;&#039;&amp;lt;/span&amp;gt;||The flags that can optionally go with this command, separated by spaces.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background:rgb(156,255,156); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;&#039;&#039;&#039;Path to file&#039;&#039;&#039;&amp;lt;/span&amp;gt;||Whether destination or source, the path of the file comes second. &amp;lt;u&amp;gt;Use the full path to the file (starting from &amp;quot;C:\&amp;quot;, or &amp;quot;/&amp;quot; on Macs).&amp;lt;/u&amp;gt; One exception to this parameter being a file is when using &amp;lt;tt&amp;gt;-create&amp;lt;/tt&amp;gt; to make a level, in which case this is where you supply the source folder.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===CLI tips===&lt;br /&gt;
*Command line interfaces (CLI) usually supply an auto-complete feature to save on typing. If you&#039;ve typed enough of a file/folder name to identify it, press the Tab key and the rest should fill in. In Windows, you may not get the right path name autocompleted on the first try if there are multiple possible autocompletions based on the names in that directory, so keep pressing Tab to cycle through all possibilities. On Macs, if you have not typed enough of the name to narrow it down to a single autocompletion, you will hear an error sound.  Double-tap Tab to see a list of possible autocompletions, then keep typing until you have narrowed it down to one of those and then hit Tab to fill in the rest of its name.&lt;br /&gt;
&lt;br /&gt;
*Note that you can also drag files/folders into the window and the path will magically appear; in cases where you don&#039;t need to use a wildcard, this is the fastest way to build an OniSplit command.&lt;br /&gt;
&lt;br /&gt;
===Wildcards===&lt;br /&gt;
Wildcards can be used to supply patterns to CLI programs. The wildcard is simply the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; character. For instance:&lt;br /&gt;
 OniSplit.exe -export:TRAM* &amp;lt;destination&amp;gt; &amp;lt;source .dat&amp;gt;&lt;br /&gt;
will export all the TRAMs in the source .dat into the destination folder. Using &amp;quot;TRAMKON*&amp;quot; would export all of Konoko&#039;s animations.&lt;br /&gt;
&lt;br /&gt;
===Spaces in paths===&lt;br /&gt;
Command line interfaces (CLI) do not recognize spaces as a possible part of a path name because spaces are what separate the terms in your commands. The best course of action is to not use paths with spaces in their names! But if you must, you can use quotes to tell the CLI that a certain string is a single path:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;C:\Games\Oni\&amp;gt;&#039;&#039;&#039;OniSplit.exe -list &amp;quot;My Mod Folder\level5_Final.dat&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This works in the Mac Terminal too, but you can also use the escape character, &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;. Also, other characters like &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; need to be escaped as well if you do not use quotes:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;MyMac%&#039;&#039;&#039; mono OniSplit.exe -list My\ Mods\ \(In\ Progress\)/level5_Final.dat&lt;br /&gt;
&lt;br /&gt;
But as mentioned, the best practice is to not use any characters besides the alphabet and numbers. It makes your life simpler, and if you ask for help on the forum with a command, no one wants to have to read your long path with lots of spaces or escaped characters in it ;-)&lt;br /&gt;
&lt;br /&gt;
===Reading the commands below===&lt;br /&gt;
*The following commands should be complete, but the current list can be obtained by calling OniSplit with the &amp;lt;tt&amp;gt;-help&amp;lt;/tt&amp;gt; option. You should also use &amp;lt;tt&amp;gt;-version&amp;lt;/tt&amp;gt; to make sure you&#039;re using the latest version, the number of which is given in the &amp;quot;Download links&amp;quot; section above.&lt;br /&gt;
&lt;br /&gt;
*Sample usages are given after certain commands. These are in DOS style, so if you are on a Mac, simply flip the &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;s to &amp;lt;tt&amp;gt;/&amp;lt;/tt&amp;gt;s and make &amp;quot;C:\&amp;quot; into a leading &amp;quot;/&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*Optional flags are listed in square brackets simply to indicate that they&#039;re optional; don&#039;t enter the brackets when typing a command.&lt;br /&gt;
&lt;br /&gt;
Note that only the .dat file from a level&#039;s data files is mentioned. The .raw and .sep files will be accessed by OniSplit as necessary when working with the .dat file that you gave the name of.&lt;br /&gt;
{{Divhide|end}}&lt;br /&gt;
&lt;br /&gt;
==Commands==&lt;br /&gt;
===Conversion between .dat and .oni===&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width:430px&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-list &amp;lt;file name&amp;gt;&amp;lt;/code&amp;gt;||Lists the named resources contained in a .dat (see [[OBD:File_types/Named|HERE]] for info on unnamed resources)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-export &amp;lt;destination directory&amp;gt; &amp;lt;dat file&amp;gt;&amp;lt;/code&amp;gt;||Breaks .dat file into .oni files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-export:&amp;lt;pattern&amp;gt; &amp;lt;destination directory&amp;gt; &amp;lt;dat file&amp;gt;&amp;lt;/code&amp;gt;||Exports named resource (wildcards also allowed) from .dat file&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;-import &amp;lt;source directory&amp;gt; &amp;lt;new dat file&amp;gt;&amp;lt;/code&amp;gt;||Compiles level files from source directory using the name you supply for the .dat file; tries to get target file format from source SNDD, but it&#039;s better to use the :sep or :nosep variants below&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&amp;lt;span style=&amp;quot;padding-left:20px&amp;quot;&amp;gt;To create level5_Final.dat/.raw[/.sep] from the files in MyNewLevel\: &amp;lt;code&amp;gt;OniSplit.exe -import C:\Oni\MyNewLevel\ C:\Oni\GameDataFolder\level5_Final.dat&amp;lt;/code&amp;gt;&amp;lt;span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-import:sep &amp;lt;source directory&amp;gt; &amp;lt;new dat file&amp;gt;&amp;lt;/code&amp;gt;||Imports target file (.dat) from source directory; uses .dat/.raw/.sep format (Mac and PC Demo)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-import:nosep &amp;lt;source directory&amp;gt; &amp;lt;new dat file&amp;gt;&amp;lt;/code&amp;gt;||Imports target file (.dat) from source directory; uses .dat/.raw format (PC retail)&lt;br /&gt;
|}&lt;br /&gt;
:Note that &amp;lt;tt&amp;gt;-import&amp;lt;/tt&amp;gt; will search subdirectories too. If you find having hundreds or thousand of files .oni in one directory to be unmanageable you can always group them in subdirectories any way you like. The only exception is that a subdirectory named &amp;quot;noimport&amp;quot; or &amp;quot;_noimport&amp;quot; is always ignored.&lt;br /&gt;
&lt;br /&gt;
===Management of .oni files===&lt;br /&gt;
Sometimes you want to move some .oni files out of a larger folder of .onis. You could do this manually, but OniSpit knows which files depend on others. It will also look for those dependencies in subfolders beneath the level of the file you supply the name of. The filename field supports wildcards. This is mostly used by the [[AE]] Installer rather than modders themselves.&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;-deps &amp;lt;oni file&amp;gt;&amp;lt;/code&amp;gt;||Displays a list of .oni files that the specified .oni file depends on&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-copy &amp;lt;destination directory&amp;gt; &amp;lt;oni file&amp;gt;&amp;lt;/code&amp;gt;||Copies .oni file and its dependencies; skips file if it already exists at destination&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-move &amp;lt;destination directory&amp;gt; &amp;lt;oni file&amp;gt;&amp;lt;/code&amp;gt;||Moves an .oni file and its dependencies; skips file if it already exists at destination&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-move:overwrite &amp;lt;destination directory&amp;gt; &amp;lt;oni file&amp;gt;&amp;lt;/code&amp;gt;||Moves an .oni file and its dependencies; overwrites any existing .oni files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-move:delete &amp;lt;destination directory&amp;gt; &amp;lt;oni file&amp;gt;&amp;lt;/code&amp;gt;||Moves an .oni file and its dependencies; doesn&#039;t overwrite; deletes source files&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Conversion between .oni/.dat and 3rd party formats===&lt;br /&gt;
====Textures====&lt;br /&gt;
Unless mentioned otherwise, source filenames support wildcards. See [[Modifying textures|HERE]] for a detailed tutorial. The &amp;lt;tt&amp;gt;-extract&amp;lt;/tt&amp;gt; commands can work with .oni files (a single file or several files if you use the wildcard), or rip all the TXMPs from a .dat file.&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:dds &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts all textures (TXMP) from a Oni .dat/.oni file into DDS files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:tga &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts all textures (TXMP) from a Oni .dat/.oni file into TGA files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:png &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts all textures (TXMP) from a Oni .dat/.oni file into PNG files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-create:txmp &amp;lt;destination directory&amp;gt;&amp;lt;br&amp;gt;[-genmipmaps] [-nouwrap] [-novwrap]&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;[-format:bgr32|bgra32|bgr555|bgra5551|bgra4444|dxt1]&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;[-envmap:texture_name] &amp;lt;image file&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=top|Creates .oni file from image file (PNG, TGA, or DDS)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Models====&lt;br /&gt;
[[M3GM]]s, [[ONWC]]s, [[ONCC]]s can be exported to the Wavefront .obj and COLLADA .dae formats. For details see [[Importing character models]] and [[Importing weapon models]]. The generic &amp;lt;tt&amp;gt;-extract&amp;lt;/tt&amp;gt; commands can work with .oni files (a single file, or several files if you use the wildcard), or rip all the TXMP from a .dat file. TRBS and ONCC support additional &amp;lt;tt&amp;gt;-noanim&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;-anim&amp;lt;/tt&amp;gt; options for &amp;lt;tt&amp;gt;-extract:dae&amp;lt;/tt&amp;gt;; see [[Importing character models]] for details. Imported geometry must only contain triangles.&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width:540px&amp;quot;|&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:obj &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts 3D data in .oni file (or all M3GM, ONWC and ONCC instances in a .dat) into Wavefront OBJ files&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:dae &amp;lt;destination directory&amp;gt; [-noanim] &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts 3D data in .oni file (or all M3GM, ONWC and ONCC instances in a .dat) into Collada DAE files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-create:m3gm &amp;lt;destination directory&amp;gt; [-tex:texture_name] &amp;lt;OBJ file&amp;gt;&amp;lt;/code&amp;gt;||Creates a M3GM .oni from an .obj file&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-create:trbs &amp;lt;destination directory&amp;gt; [-cel] [-normals] &amp;lt;DAE file&amp;gt;&amp;lt;/code&amp;gt;||Creates a TRBS .oni from a .dae file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note on -noanim parameter: Normally OniSplit exports the character with an idle animation. If you use -noanim the character is exported in &amp;quot;I&amp;quot; pose, also the pelvis has the coordinates x=0, y=0, z=0.&lt;br /&gt;
&lt;br /&gt;
====Levels====&lt;br /&gt;
OniSplit can convert AKEV files (level geometry) and the associated file types to and from DAE format:&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:dae &amp;lt;destination directory&amp;gt; &amp;lt;AKEV.oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts 3D data in AKEV and related resources from dependencies into Collada file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The next two steps are used on a folder in which you have placed the DAE and XML-formatted instances of the required files, as well as textures in TGA format. See [http://oni.bungie.org/forum/viewtopic.php?id=1515 HERE] for details.&lt;br /&gt;
{|&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;-create &amp;lt;destination directory&amp;gt;&amp;lt;br&amp;gt;[-genmipmaps] [-format:dxt1]&amp;lt;br&amp;gt;&amp;lt;source directory&amp;gt;&amp;lt;/code&amp;gt;||Converts all AKEV and related instances to .oni files&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;-import:nosep &amp;lt;source directory&amp;gt;&amp;lt;br&amp;gt;&amp;lt;target file name&amp;gt;.dat&amp;lt;/code&amp;gt;||The standard command for creating .dat/.raw files from .oni files (remember to use the import:sep option on Mac!)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Sounds====&lt;br /&gt;
The sounds in Windows Oni are stored in WAV format, and on Macs are stored in AIFF format. This also means creating each of your SNDD files in both formats in order to work on both platforms.&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:wav &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Rips sound data from an SNDD .oni file (or all SNDDs from a .dat) as .wav files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:aif &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Rips sound data from an SNDD .oni file (or all SNDDs from a .dat) as .aif files&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Text====&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:txt &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Rips text data from a SUBT .oni file (or all SUBTs from a .dat) as .txt files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-create:subt &amp;lt;destination directory&amp;gt; &amp;lt;TXT file&amp;gt;&amp;lt;/code&amp;gt;||Creates a SUBT .oni file from a .txt file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====XML====&lt;br /&gt;
One of the latest features is conversion of .oni files to and from an XML file, or an XML metafile and related 3rd-party format files. XML files are easier to read and edit.&lt;br /&gt;
::Currently XML export/import is limited to files that do not have raw/sep parts. 2-way conversion is known to work for [[BINA]], [[CONS]], [[DOOR]], [[DPge]], [[FILM]], [[HPge]], [[IGHH]], [[IPge]], [[M3GM]], [[OBAN]], [[ONCC]], [[ONCV]], [[ONLD]], [[ONLV]], [[ONGS]], [[ONSK]], [[ONVL]], [[ONWC]], [[OPge]], [[OSBD]], [[PSpc]], [[PSpL]], [[PSUI]], [[TRAC]], [[TRAM]], [[TRIG]], [[TRGE]], [[TRMA]], [[TRSC]], [[TXMB]], [[TXMP]], [[WMCL]], [[WMDD]], [[WMM_]], [[WPge]].&lt;br /&gt;
:::For detailed examples and tutorials, see [[XML|HERE]]&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:xml &amp;lt;destination directory&amp;gt; &amp;lt;oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts .oni file and all related resources to XML files and 3rd-party formats&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-create &amp;lt;destination directory&amp;gt; &amp;lt;XML file&amp;gt;&amp;lt;/code&amp;gt;||Creates an .oni file from an XML file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Blender support====&lt;br /&gt;
[[Blender]] by default has a number of issues with most of Oni&#039;s assets, however, OniSplit allows exporting them to Blender-readable files with the &amp;lt;tt&amp;gt;-blender&amp;lt;/tt&amp;gt; flag.&lt;br /&gt;
&lt;br /&gt;
[[Category:Completed modding tools]][[Category:Bi-platform modding tools]][[Category:Modding tutorials]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=OniSplit&amp;diff=38795</id>
		<title>OniSplit</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=OniSplit&amp;diff=38795"/>
		<updated>2022-11-20T21:42:47Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Beginner&amp;#039;s tips - recommended Vago and CMDer*/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCfloat|side=right}}&lt;br /&gt;
{{Hatnote|Before reading this page, it&#039;s a good idea to be familiar with basic Oni [[game data terminology]].}}&lt;br /&gt;
&#039;&#039;&#039;OniSplit&#039;&#039;&#039;, written by [[User_talk:Neo|Neo]], is an integral part of the [[Anniversary Edition]] and an essential modding tool on its own. It is a command line tool which can import and export almost all kinds of Oni game data, including textures, sound, 3D models, level geometry and combat animations. Its name comes from its original purpose, which was breaking Oni&#039;s level data files into individual resources. Later, the ability to convert those resources&#039; data between Oni&#039;s format and standard file formats was added. OniSplit incorporates the latest [[OBD|knowledge about Oni&#039;s game data]], and it is currently the community&#039;s main modding tool.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Subpages:&#039;&#039; [[/Change_log|Change log]] (past versions), [[/WIP|WIP notes]] (upcoming versions)&lt;br /&gt;
&lt;br /&gt;
==Getting it==&lt;br /&gt;
===Download links===&lt;br /&gt;
* Latest release of OniSplit: [http://mods.oni2.net/node/38 v0.9.99.2] ([http://websvn.illy.bz/dl.php?repname=Oni2&amp;amp;path=%2FOniSplit%2F&amp;amp;isdir=1 source code])&lt;br /&gt;
* The current GUI for OniSplit is [[Vago (tool)|Vago]]. &#039;&#039;&#039;You should try the GUI to see if it does what you need before working with OniSplit on the command line.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Requirements===&lt;br /&gt;
*Windows: [https://dotnet.microsoft.com/en-us/download/dotnet-framework .NET framework]&lt;br /&gt;
*macOS: [https://www.mono-project.com/download/stable/ Mono framework]&lt;br /&gt;
&lt;br /&gt;
==Workflow==&lt;br /&gt;
OniSplit is used in up to four different stages when modding:&lt;br /&gt;
{|&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|&amp;lt;span style=&amp;quot;font-size:150%&amp;quot;&amp;gt;&#039;&#039;&#039;OUT&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|&#039;&#039;Exporting&#039;&#039; - using the &amp;lt;tt&amp;gt;-export&amp;lt;/tt&amp;gt; command, a [[Dat|level data file]] is broken into its component resources, .oni files.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;border-style: solid; border-width: 0 0 1px 0&amp;quot;|&#039;&#039;Extracting&#039;&#039; - using the &amp;lt;tt&amp;gt;-extract&amp;lt;/tt&amp;gt; commands, .oni files are converted to standard-format files that can be edited in various third-party programs.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|&amp;lt;center&amp;gt;&amp;lt;span style=&amp;quot;font-size:150%&amp;quot;&amp;gt;&#039;&#039;&#039;IN&#039;&#039;&#039;&amp;lt;/span&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&#039;&#039;Creating&#039;&#039; - using the &amp;lt;tt&amp;gt;-create&amp;lt;/tt&amp;gt; commands, standard-format files are converted into .oni files.&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Importing&#039;&#039; - using the &amp;lt;tt&amp;gt;-import&amp;lt;/tt&amp;gt; command, a folder of .oni files is combined into a level data file.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note that &amp;quot;extracting&amp;quot; refers to a conversion from one format to another, but &amp;quot;exporting&amp;quot; only refers to the creation of .oni files from a .dat file. When exporting, no conversion or re-formatting is taking place; the data is simply being copied out of a .dat (any connected binary data in .raw/.sep files will be concatenated to the data from the .dat when making the .oni).&lt;br /&gt;
&lt;br /&gt;
==Beginner&#039;s tips==&lt;br /&gt;
{{Divhide|show=yes|For users new to the command line or to OniSplit}}&lt;br /&gt;
In Windows, there are several options through which you can use OniSplit - out of which it is recommended to get Vago and CMDer:&lt;br /&gt;
* [[Vago (tool)|Vago]] is a GUI for OniSplit which allows you to handle all general conversions, save your sessions as project files, input manual commands if needed, and more. The two downsides of it is that it doesn&#039;t support Blender yet, forcing the users input commands manually, which in turn are not stored upon ending the session.&lt;br /&gt;
* [https://cmder.app/ CMDer] is an excellent alternative to cmd.exe. It can be customized to allow starting it from any folder you pick with the context menu, and it also stores the most recently used commands after ending the session. Currently it is highly useful for Blender-related operations.&lt;br /&gt;
* Command Prompt/cmd.exe. Windows&#039; default command line interpreter, it&#039;s a poor choice as it does not store most recently used commands.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On Macs, the command line is found in the Terminal app (/Applications/Utilities) (press Command-Spacebar and type &amp;quot;Terminal&amp;quot; to get there faster).&lt;br /&gt;
&lt;br /&gt;
===OniSplit syntax===&lt;br /&gt;
The basic syntax is:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Windows&#039;&#039;&#039;||&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background:rgb(235,235,235); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;OniSplit.exe&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(175,175,255); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;-create:trbs&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(255,156,156); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;C:\Games\Oni\SomeFolder&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(175,175,255); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;-normals&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(156,255,156); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;C:\Games\Oni\Modding\TRBSMyNewChar.dae&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Mac&#039;&#039;&#039;||&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background:rgb(235,235,235); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;mono OniSplit.exe&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(175,175,255); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;-create:trbs&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(255,156,156); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;/Games/Oni/SomeFolder&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(175,175,255); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;-normals&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:rgb(156,255,156); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;/Games/Oni/Modding/TRBSMyNewChar.dae&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Here&#039;s how it breaks down:&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width:130px&amp;quot;|&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background:rgb(235,235,235); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;&#039;&#039;&#039;Invocation&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|Windows can refer to the program directly, but Macs use Mono to run the .NET app; note also that if OniSplit.exe is not in the Command Prompt/Terminal&#039;s current directory, you must provide the full path to it or set the path variable.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background:rgb(175,175,255); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;&#039;&#039;&#039;Option&#039;&#039;&#039;&amp;lt;/span&amp;gt;||The command.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background:rgb(255,156,156); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;&#039;&#039;&#039;Path to folder&#039;&#039;&#039;&amp;lt;/span&amp;gt;||Whether destination or source, the path which is a folder comes first. &amp;lt;u&amp;gt;Use the full path to the folder (starting from &amp;quot;C:\&amp;quot;, or &amp;quot;/&amp;quot; on Macs).&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background:rgb(175,175,255); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;&#039;&#039;&#039;Option flags&#039;&#039;&#039;&amp;lt;/span&amp;gt;||The flags that can optionally go with this command, separated by spaces.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background:rgb(156,255,156); border-radius:0.33em; padding:0.15em&amp;quot;&amp;gt;&#039;&#039;&#039;Path to file&#039;&#039;&#039;&amp;lt;/span&amp;gt;||Whether destination or source, the path of the file comes second. &amp;lt;u&amp;gt;Use the full path to the file (starting from &amp;quot;C:\&amp;quot;, or &amp;quot;/&amp;quot; on Macs).&amp;lt;/u&amp;gt; One exception to this parameter being a file is when using &amp;lt;tt&amp;gt;-create&amp;lt;/tt&amp;gt; to make a level, in which case this is where you supply the source folder.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===CLI tips===&lt;br /&gt;
*Command line interfaces (CLI) usually supply an auto-complete feature to save on typing. If you&#039;ve typed enough of a file/folder name to identify it, press the Tab key and the rest should fill in. In Windows, you may not get the right path name autocompleted on the first try if there are multiple possible autocompletions based on the names in that directory, so keep pressing Tab to cycle through all possibilities. On Macs, if you have not typed enough of the name to narrow it down to a single autocompletion, you will hear an error sound.  Double-tap Tab to see a list of possible autocompletions, then keep typing until you have narrowed it down to one of those and then hit Tab to fill in the rest of its name.&lt;br /&gt;
&lt;br /&gt;
*Note that you can also drag files/folders into the window and the path will magically appear; in cases where you don&#039;t need to use a wildcard, this is the fastest way to build an OniSplit command.&lt;br /&gt;
&lt;br /&gt;
===Wildcards===&lt;br /&gt;
Wildcards can be used to supply patterns to CLI programs. The wildcard is simply the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; character. For instance:&lt;br /&gt;
 OniSplit.exe -export:TRAM* &amp;lt;destination&amp;gt; &amp;lt;source .dat&amp;gt;&lt;br /&gt;
will export all the TRAMs in the source .dat into the destination folder. Using &amp;quot;TRAMKON*&amp;quot; would export all of Konoko&#039;s animations.&lt;br /&gt;
&lt;br /&gt;
===Spaces in paths===&lt;br /&gt;
Command line interfaces (CLI) do not recognize spaces as a possible part of a path name because spaces are what separate the terms in your commands. The best course of action is to not use paths with spaces in their names! But if you must, you can use quotes to tell the CLI that a certain string is a single path:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;C:\Games\Oni\&amp;gt;&#039;&#039;&#039;OniSplit.exe -list &amp;quot;My Mod Folder\level5_Final.dat&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This works in the Mac Terminal too, but you can also use the escape character, &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;. Also, other characters like &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; need to be escaped as well if you do not use quotes:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;MyMac%&#039;&#039;&#039; mono OniSplit.exe -list My\ Mods\ \(In\ Progress\)/level5_Final.dat&lt;br /&gt;
&lt;br /&gt;
But as mentioned, the best practice is to not use any characters besides the alphabet and numbers. It makes your life simpler, and if you ask for help on the forum with a command, no one wants to have to read your long path with lots of spaces or escaped characters in it ;-)&lt;br /&gt;
&lt;br /&gt;
===Reading the commands below===&lt;br /&gt;
*The following commands should be complete, but the current list can be obtained by calling OniSplit with the &amp;lt;tt&amp;gt;-help&amp;lt;/tt&amp;gt; option. You should also use &amp;lt;tt&amp;gt;-version&amp;lt;/tt&amp;gt; to make sure you&#039;re using the latest version, the number of which is given in the &amp;quot;Download links&amp;quot; section above.&lt;br /&gt;
&lt;br /&gt;
*Sample usages are given after certain commands. These are in DOS style, so if you are on a Mac, simply flip the &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;s to &amp;lt;tt&amp;gt;/&amp;lt;/tt&amp;gt;s and make &amp;quot;C:\&amp;quot; into a leading &amp;quot;/&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*Optional flags are listed in square brackets simply to indicate that they&#039;re optional; don&#039;t enter the brackets when typing a command.&lt;br /&gt;
&lt;br /&gt;
Note that only the .dat file from a level&#039;s data files is mentioned. The .raw and .sep files will be accessed by OniSplit as necessary when working with the .dat file that you gave the name of.&lt;br /&gt;
{{Divhide|end}}&lt;br /&gt;
&lt;br /&gt;
==Commands==&lt;br /&gt;
===Conversion between .dat and .oni===&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width:430px&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-list &amp;lt;file name&amp;gt;&amp;lt;/code&amp;gt;||Lists the named resources contained in a .dat (see [[OBD:File_types/Named|HERE]] for info on unnamed resources)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-export &amp;lt;destination directory&amp;gt; &amp;lt;dat file&amp;gt;&amp;lt;/code&amp;gt;||Breaks .dat file into .oni files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-export:&amp;lt;pattern&amp;gt; &amp;lt;destination directory&amp;gt; &amp;lt;dat file&amp;gt;&amp;lt;/code&amp;gt;||Exports named resource (wildcards also allowed) from .dat file&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;-import &amp;lt;source directory&amp;gt; &amp;lt;new dat file&amp;gt;&amp;lt;/code&amp;gt;||Compiles level files from source directory using the name you supply for the .dat file; tries to get target file format from source SNDD, but it&#039;s better to use the :sep or :nosep variants below&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&amp;lt;span style=&amp;quot;padding-left:20px&amp;quot;&amp;gt;To create level5_Final.dat/.raw[/.sep] from the files in MyNewLevel\: &amp;lt;code&amp;gt;OniSplit.exe -import C:\Oni\MyNewLevel\ C:\Oni\GameDataFolder\level5_Final.dat&amp;lt;/code&amp;gt;&amp;lt;span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-import:sep &amp;lt;source directory&amp;gt; &amp;lt;new dat file&amp;gt;&amp;lt;/code&amp;gt;||Imports target file (.dat) from source directory; uses .dat/.raw/.sep format (Mac and PC Demo)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-import:nosep &amp;lt;source directory&amp;gt; &amp;lt;new dat file&amp;gt;&amp;lt;/code&amp;gt;||Imports target file (.dat) from source directory; uses .dat/.raw format (PC retail)&lt;br /&gt;
|}&lt;br /&gt;
:Note that &amp;lt;tt&amp;gt;-import&amp;lt;/tt&amp;gt; will search subdirectories too. If you find having hundreds or thousand of files .oni in one directory to be unmanageable you can always group them in subdirectories any way you like. The only exception is that a subdirectory named &amp;quot;noimport&amp;quot; or &amp;quot;_noimport&amp;quot; is always ignored.&lt;br /&gt;
&lt;br /&gt;
===Management of .oni files===&lt;br /&gt;
Sometimes you want to move some .oni files out of a larger folder of .onis. You could do this manually, but OniSpit knows which files depend on others. It will also look for those dependencies in subfolders beneath the level of the file you supply the name of. The filename field supports wildcards. This is mostly used by the [[AE]] Installer rather than modders themselves.&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;-deps &amp;lt;oni file&amp;gt;&amp;lt;/code&amp;gt;||Displays a list of .oni files that the specified .oni file depends on&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-copy &amp;lt;destination directory&amp;gt; &amp;lt;oni file&amp;gt;&amp;lt;/code&amp;gt;||Copies .oni file and its dependencies; skips file if it already exists at destination&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-move &amp;lt;destination directory&amp;gt; &amp;lt;oni file&amp;gt;&amp;lt;/code&amp;gt;||Moves an .oni file and its dependencies; skips file if it already exists at destination&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-move:overwrite &amp;lt;destination directory&amp;gt; &amp;lt;oni file&amp;gt;&amp;lt;/code&amp;gt;||Moves an .oni file and its dependencies; overwrites any existing .oni files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-move:delete &amp;lt;destination directory&amp;gt; &amp;lt;oni file&amp;gt;&amp;lt;/code&amp;gt;||Moves an .oni file and its dependencies; doesn&#039;t overwrite; deletes source files&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Conversion between .oni/.dat and 3rd party formats===&lt;br /&gt;
====Textures====&lt;br /&gt;
Unless mentioned otherwise, source filenames support wildcards. See [[Modifying textures|HERE]] for a detailed tutorial. The &amp;lt;tt&amp;gt;-extract&amp;lt;/tt&amp;gt; commands can work with .oni files (a single file or several files if you use the wildcard), or rip all the TXMPs from a .dat file.&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:dds &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts all textures (TXMP) from a Oni .dat/.oni file into DDS files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:tga &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts all textures (TXMP) from a Oni .dat/.oni file into TGA files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:png &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts all textures (TXMP) from a Oni .dat/.oni file into PNG files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-create:txmp &amp;lt;destination directory&amp;gt;&amp;lt;br&amp;gt;[-genmipmaps] [-nouwrap] [-novwrap]&amp;lt;br&amp;gt;&amp;lt;nowiki&amp;gt;[-format:bgr32|bgra32|bgr555|bgra5551|bgra4444|dxt1]&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;[-envmap:texture_name] &amp;lt;image file&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=top|Creates .oni file from image file (PNG, TGA, or DDS)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Models====&lt;br /&gt;
[[M3GM]]s, [[ONWC]]s, [[ONCC]]s can be exported to the Wavefront .obj and COLLADA .dae formats. For details see [[Importing character models]] and [[Importing weapon models]]. The generic &amp;lt;tt&amp;gt;-extract&amp;lt;/tt&amp;gt; commands can work with .oni files (a single file, or several files if you use the wildcard), or rip all the TXMP from a .dat file. TRBS and ONCC support additional &amp;lt;tt&amp;gt;-noanim&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;-anim&amp;lt;/tt&amp;gt; options for &amp;lt;tt&amp;gt;-extract:dae&amp;lt;/tt&amp;gt;; see [[Importing character models]] for details. Imported geometry must only contain triangles.&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width:540px&amp;quot;|&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:obj &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts 3D data in .oni file (or all M3GM, ONWC and ONCC instances in a .dat) into Wavefront OBJ files&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:dae &amp;lt;destination directory&amp;gt; [-noanim] &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts 3D data in .oni file (or all M3GM, ONWC and ONCC instances in a .dat) into Collada DAE files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-create:m3gm &amp;lt;destination directory&amp;gt; [-tex:texture_name] &amp;lt;OBJ file&amp;gt;&amp;lt;/code&amp;gt;||Creates a M3GM .oni from an .obj file&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-create:trbs &amp;lt;destination directory&amp;gt; [-cel] [-normals] &amp;lt;DAE file&amp;gt;&amp;lt;/code&amp;gt;||Creates a TRBS .oni from a .dae file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note on -noanim parameter: Normally OniSplit exports the character with an idle animation. If you use -noanim the character is exported in &amp;quot;I&amp;quot; pose, also the pelvis has the coordinates x=0, y=0, z=0.&lt;br /&gt;
&lt;br /&gt;
====Levels====&lt;br /&gt;
OniSplit can convert AKEV files (level geometry) and the associated file types to and from DAE format:&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:dae &amp;lt;destination directory&amp;gt; &amp;lt;AKEV.oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts 3D data in AKEV and related resources from dependencies into Collada file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The next two steps are used on a folder in which you have placed the DAE and XML-formatted instances of the required files, as well as textures in TGA format. See [http://oni.bungie.org/forum/viewtopic.php?id=1515 HERE] for details.&lt;br /&gt;
{|&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;-create &amp;lt;destination directory&amp;gt;&amp;lt;br&amp;gt;[-genmipmaps] [-format:dxt1]&amp;lt;br&amp;gt;&amp;lt;source directory&amp;gt;&amp;lt;/code&amp;gt;||Converts all AKEV and related instances to .oni files&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;-import:nosep &amp;lt;source directory&amp;gt;&amp;lt;br&amp;gt;&amp;lt;target file name&amp;gt;.dat&amp;lt;/code&amp;gt;||The standard command for creating .dat/.raw files from .oni files (remember to use the import:sep option on Mac!)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Sounds====&lt;br /&gt;
The sounds in Windows Oni are stored in WAV format, and on Macs are stored in AIFF format. This also means creating each of your SNDD files in both formats in order to work on both platforms.&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:wav &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Rips sound data from an SNDD .oni file (or all SNDDs from a .dat) as .wav files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:aif &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Rips sound data from an SNDD .oni file (or all SNDDs from a .dat) as .aif files&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Text====&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:txt &amp;lt;destination directory&amp;gt; &amp;lt;dat/oni file&amp;gt;&amp;lt;/code&amp;gt;||Rips text data from a SUBT .oni file (or all SUBTs from a .dat) as .txt files&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-create:subt &amp;lt;destination directory&amp;gt; &amp;lt;TXT file&amp;gt;&amp;lt;/code&amp;gt;||Creates a SUBT .oni file from a .txt file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====XML====&lt;br /&gt;
One of the latest features is conversion of .oni files to and from an XML file, or an XML metafile and related 3rd-party format files. XML files are easier to read and edit.&lt;br /&gt;
::Currently XML export/import is limited to files that do not have raw/sep parts. 2-way conversion is known to work for [[BINA]], [[CONS]], [[DOOR]], [[DPge]], [[FILM]], [[HPge]], [[IGHH]], [[IPge]], [[M3GM]], [[OBAN]], [[ONCC]], [[ONCV]], [[ONLD]], [[ONLV]], [[ONGS]], [[ONSK]], [[ONVL]], [[ONWC]], [[OPge]], [[OSBD]], [[PSpc]], [[PSpL]], [[PSUI]], [[TRAC]], [[TRAM]], [[TRIG]], [[TRGE]], [[TRMA]], [[TRSC]], [[TXMB]], [[TXMP]], [[WMCL]], [[WMDD]], [[WMM_]], [[WPge]].&lt;br /&gt;
:::For detailed examples and tutorials, see [[XML|HERE]]&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;-extract:xml &amp;lt;destination directory&amp;gt; &amp;lt;oni file&amp;gt;&amp;lt;/code&amp;gt;||Extracts .oni file and all related resources to XML files and 3rd-party formats&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;-create &amp;lt;destination directory&amp;gt; &amp;lt;XML file&amp;gt;&amp;lt;/code&amp;gt;||Creates an .oni file from an XML file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Completed modding tools]][[Category:Bi-platform modding tools]][[Category:Modding tutorials]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Creating_an_animation_rig_in_Blender&amp;diff=37842</id>
		<title>Creating an animation rig in Blender</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Creating_an_animation_rig_in_Blender&amp;diff=37842"/>
		<updated>2022-05-21T17:05:16Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Overview of the rig */ clarified why do we have T-Pose, Pose 1 and Pose 2 collections in the rig&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This tutorial shows you how to create the [http://mods.oni2.net/node/388 animation rig for Blender] (made by geyser) from scratch, with some improvements.&lt;br /&gt;
&lt;br /&gt;
The purpose of this rig is to give us much better tools to animate, compared to our [http://oni.bungie.org/forum/viewtopic.php?pid=23698#p23698 previous process in Softimage XSI] by EdT, which allowed us to animate exclusively with Forward Kinematics. While FK may work for simple, short animations done on characters with a small amount of bones, it does not work well for Oni characters and animations, as it&#039;s too labor-intensive and inefficient.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If you are looking for information on how to use the rig, please refer to the article on that available [[Using_the_Rigify_animation_rig|HERE.]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Prerequisite tutorials==&lt;br /&gt;
I highly recommend watching the tutorials below if you feel you&#039;re lacking knowledge in any of these subjects:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
General Blender basics:&lt;br /&gt;
* [https://www.youtube.com/watch?v=RG8qK5zPqgM Wolf&#039;s 45-Minute Crash Course for Blender Virgins]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Blender Character Rigging overview showing that you can create a Rigify rig in less than a minute at 5:43, and also rig a character while at it:&lt;br /&gt;
* [https://youtu.be/f2pTkW-1JkE?t=343 Character Rigging - Blender 2.80 Fundamentals]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Practical and intuitive explanation of what Inverse and Forward Kinematics (IK/FK) are - this is explained in Maya, but same principles apply in every 3D editing program including Blender:&lt;br /&gt;
* [https://www.youtube.com/watch?v=p6PYKyxR0aY Animating with IK and FK]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Basics of using Rigify:&lt;br /&gt;
* [https://www.youtube.com/watch?v=vKgH5zXIYmM Rigify Tutorial #08 - Posing the Rigify rig] by CGDive&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Rigify Bone Groups and Layers:&lt;br /&gt;
* [https://www.youtube.com/watch?v=5FK4jDCAOkk Rigify Tutorial 7-1: Rigify Bone Groups and Layers (Overview)] by CGDive&lt;br /&gt;
* [https://www.youtube.com/watch?v=JZZHCmKFcMs Rigify Tutorial 7-2: Rigify Bone Groups and Layers (Practice)] by CGDive&lt;br /&gt;
* [https://www.youtube.com/watch?v=2XldUB2eT-o Rigify Tutorial 7-3: Rigify Bone Groups and Layers (Advanced)] by CGDive&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Changing Rigify Custom Shapes and Widgets:&lt;br /&gt;
* [https://www.youtube.com/watch?v=beVtWATcw9U Rigify - Custom Shapes/Widgets] by CGDive&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Blender custom properties and &#039;&#039;&#039;drivers&#039;&#039;&#039; (drivers in the rig described here are used to set the influence of its controllers&#039; bone constraints through the Pose1 and Pose2 bone locations):&lt;br /&gt;
* [https://www.youtube.com/watch?v=_197jQFh22E Custom properties and drivers in blender made easy] by Pierrick Picaut&lt;br /&gt;
&lt;br /&gt;
===Tracking constraint tutorials===&lt;br /&gt;
These explain constraints like Damped Track which are used by Rigify – you can skip this if you want, but it might give you a better idea of how Rigify&#039;s MCH (Mechanical) layers work, or come in handy in the distant future; other than that, you don&#039;t need to know them to animate for Oni:&lt;br /&gt;
* [https://www.youtube.com/watch?v=aGBOu-dNZ-w Tracking Constraints - Blender 2.80 Fundamentals]&lt;br /&gt;
* [https://www.youtube.com/watch?v=5FK4jDCAOkk Camera Track To vs Damped Track Constraints | Pros &amp;amp; Cons Explained With Examples | Blender] by 5 minutes Blender&lt;br /&gt;
&lt;br /&gt;
==Things to know before starting==&lt;br /&gt;
There are several things worth knowing before you start creating the rig.&lt;br /&gt;
&lt;br /&gt;
===Tools and relevant tutorials===&lt;br /&gt;
[[Image:Cmder.png|200px|right|thumb|Screenshot showing Cmder&#039;s capabilities within the context of modding Oni]]&lt;br /&gt;
* [http://mods.oni2.net/node/38 &#039;&#039;&#039;Current version of OniSplit.&#039;&#039;&#039;] This is the tool needed to import and export assets out of Oni. &#039;&#039;&#039;DO NOT USE OniSplit GUI or Vago for importing Oni assets into Blender&#039;&#039;&#039; - neither of these weren&#039;t updated in a long time, and thus they don&#039;t support OniSplit&#039;s v0.9.99.2 -blender option. You can still use them for other purposes though, such as sounds and converting .oni files to XMLs, etc.&lt;br /&gt;
* [https://cmder.net/ &#039;&#039;&#039;Cmder&#039;&#039;&#039;] (Windows only) - because OniSplit is a command line tool, it is highly recommended to get any upgrade to Windows&#039; Command Prompt. As shown in the screenshot on the right, Cmder allows you to start it from the context menu in any selected folder, and it also remembers your most recently used commands, vastly improving your workflow when you&#039;re forced to use any command line tools.&lt;br /&gt;
* [https://docs.blender.org/manual/en/2.81/addons/rigging/rigify.html &#039;&#039;&#039;Rigify&#039;&#039;&#039;] - it&#039;s a plugin for Blender designed to automate a lot of rigging work. The rig described here is generated using Rigify.&lt;br /&gt;
* [https://docs.google.com/document/d/175uJGklYASAgrFjxuUG4-kJRDoMTjjP7GvNxSj1GscU/edit &#039;&#039;&#039;Oni-Blender tutorial&#039;&#039;&#039;] by EdT. Please read this in entirety to know likely-to-happen issues and refer to this as your guide for OniSplit commands relating to Blender.&lt;br /&gt;
* [http://oni.bungie.org/forum/viewtopic.php?pid=23230#p23230 &#039;&#039;&#039;Brief overview on creating TRAMs&#039;&#039;&#039;] by EdT - while this was written with XSI in mind, this is still relevant as the process for preparing the XML files for Oni is still the same. Also the next post in that thread, called &#039;&#039;&#039;Brief walk through on modifying a TRAM,&#039;&#039;&#039; is an example of that overview put into practice.&lt;br /&gt;
&lt;br /&gt;
===Assorted issues in Blender===&lt;br /&gt;
Please refer to [[Blender#Oni-specific_issues_with_Blender|THIS]] section of the &amp;quot;Blender&amp;quot; article for issues that you will run into while Oni modding.&lt;br /&gt;
&lt;br /&gt;
==Overview of the rig==&lt;br /&gt;
Here is an overview of how the rig works: As stated before, our previous animating process was limited to FK only, which is inefficient for Oni. So instead we desperately needed an IK/FK capable rig, to which we would be able to snap a character, so we could animate him/her.&lt;br /&gt;
&lt;br /&gt;
At the same time, the rig would have to be capable of the opposite thing - snapping itself to the animated character. That&#039;s because most often the way we start out with making a new animation is copying the first or last frame of the preceeding animation. This functionality has been implemented, and is called Pose Matching. The way it works is simple - it uses bone constraints in rig controller bones targeting the character model in order to snap the rig to the model.&lt;br /&gt;
&lt;br /&gt;
The rig uploaded on Oni Mod Depot contains three Konokos by default: One T-Posed Konoko and two animated ones, all stored in their own collections. The T-Posed Konoko is there because it was easiest to build the rig off a T-Pose, while the remaining two ones, stored in Pose 1 and Pose 2 collections, is where you are supposed to store your animated characters, to which you can Pose Match, and thus check if Pose Matching works as intended.&lt;br /&gt;
&lt;br /&gt;
Because Oni does not store its animations in form of an armature, but rather as locations and rotations of 19 objects organized in a parent-child relationship, this forces us to use the earlier mentioned object and bone constraints. This is also creates a big problem: in order to animate, rotation and location data from the 19 character body parts have to be transformed onto the rig, and then the body parts have to be constrained to the rig. Once you are done animating and you want to export your animation, you have to do the reverse: transform the animation from the rig onto the 19 body parts, and then disable the constraints. This is quite inconvenient, because all of the constraints (and there&#039;s a lot of them) in both the body parts and rig have to be turned on and off.&lt;br /&gt;
&lt;br /&gt;
The general workflow of making animations using this rig is the following, assuming you want to make a single animation (i.e. you don&#039;t want to make a throw animation):&lt;br /&gt;
&lt;br /&gt;
# Open up a Blender scene containing the rig.&lt;br /&gt;
# Delete either the model in Pose1 or Pose2.&lt;br /&gt;
# (OPTIONAL) Assuming you want to animate a different character, delete the T-posed model.&lt;br /&gt;
## Import your desired character with textures using -noanim.&lt;br /&gt;
# Import the animation you are using as a starting point.&lt;br /&gt;
## If you did point 3, apply the textures on the animated model.&lt;br /&gt;
# Using the RigBoneConstraintTargetSetter script available [[Blender#Rig_bone_constraint_target_setting_script|HERE]], set the targets of the rig&#039;s bone constraints to be the body parts of the animation you&#039;ve imported.&lt;br /&gt;
# Using the Pose Matching functionality, constrain the rig to the imported animation (Set the IK-FK sliders on rig limbs to 1, as Pose Matching works only through FK controllers)&lt;br /&gt;
# For each frame that you want to remain in your animation, while having all the bones selected (or the ones you want), press Ctrl+A, select Apply Visual Transform to Pose and keyframe it.&lt;br /&gt;
# Disable bone constraints on the rig using the BoneConstraintEnabler script available [[Blender#Script_for_enabling.2Fdisabling_bone_constraints_in_the_selected_armature|HERE]]. &lt;br /&gt;
# &#039;&#039;&#039;Make your animation.&#039;&#039;&#039;&lt;br /&gt;
# Once your animation is ready, use the Visual Transformer script available [[Blender#Visual_transformer_script|HERE]] to bake the rig keyframes into the character model.&lt;br /&gt;
# Using the ObjectConstraintEnabler script available [[Blender#Script_for_enabling.2Fdisabling_constraints_in_selected_objects|HERE]], disable the object constraints on the character model. &#039;&#039;&#039;The character model should now be animated and have the needed rotations and locations.&lt;br /&gt;
# Export the animation as a DAE.&lt;br /&gt;
&lt;br /&gt;
==Importing animations and preparing the Blender scene==&lt;br /&gt;
&#039;&#039;&#039;The actual tutorial starts here.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
For detailed explanation of the required OniSplit commands, please refer to the &#039;&#039;&#039;Oni-Blender Tutorial by EdT&#039;&#039;&#039; listed in the &#039;&#039;&#039;Tools and relevant tutorials&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:ARB SceneUponImportingKonokos.png|400px|right|thumb|Expected result by the end of this header]]&lt;br /&gt;
&lt;br /&gt;
# Using OniSplit, export any character you want as a DAE (-extract:dae) using -noanim (T-Pose) and -blender arguments. &lt;br /&gt;
## As per EdT&#039;s &#039;&#039;&#039;Oni-Blender Tutorial&#039;&#039;&#039;, you should get &amp;lt;mark&amp;gt;&amp;lt;tt&amp;gt;AnimationDaeWriter: custom axis conversion&amp;lt;/tt&amp;gt;&amp;lt;/mark&amp;gt; in OniSplit output if you&#039;ve used the -blender argument. If you didn&#039;t get that on the output, it means something most likely went wrong and you won&#039;t be able to import the model into Blender (or you will be able to import it but it will be wrong).&lt;br /&gt;
## Assuming you wanted a textured model and thus you&#039;ve exported an ONCC, you should now get a &#039;&#039;&#039;DAE file&#039;&#039;&#039; and an &#039;&#039;&#039;&#039;&#039;images&#039;&#039;&#039;&#039;&#039; folder containing the textures for it.&lt;br /&gt;
# Using OniSplit, export any two animations as an XML (-extract:xml) using -anim-body (lets you specify the character you want) and -blender arguments.&lt;br /&gt;
## You should get &#039;&#039;&#039;one DAE and an XML file for each animation, totalling four files.&#039;&#039;&#039; &lt;br /&gt;
# Open up Blender and set your scene&#039;s frame rate to 60 FPS. If you don&#039;t, the keyframes of the imported animations will get tightened up together, because Blender&#039;s default scene framerate is 24 FPS.&lt;br /&gt;
# Import the -noanim model into Blender first (&#039;&#039;&#039;MAKE SURE YOU CHECK THE &#039;&#039;Import Unit&#039;&#039; BOX&#039;&#039;&#039;, otherwise you will import the model with arbitrary units which will break everything and will be basically unadjustable later)&lt;br /&gt;
# Import the animations into Blender (&#039;&#039;&#039;ALSO MAKE SURE YOU CHECK THE &#039;&#039;Import Unit&#039;&#039; BOX EACH TIME&#039;&#039;&#039;)&lt;br /&gt;
# At this point the -noanim/T-posed model in the scene should have no suffix in its body part names, while the animated models should have &#039;&#039;.001&#039;&#039; and &#039;&#039;.002&#039;&#039; suffixes. This is intended; the T-posed model will serve for building the metarig and editing the rig once it&#039;s generated, while the animated models are needed for pose matching purposes, where the suffixes are useful for setting up the bone constraints.&lt;br /&gt;
# Create three new collections in the Outliner, name them &#039;&#039;T-pose&#039;&#039;, &#039;&#039;Pose 1&#039;&#039; and &#039;&#039;Pose 2&#039;&#039;. These three collections allow you to quickly hide the respective models from the Viewport using the eye icon in the Outliner.&lt;br /&gt;
## Move the T-Posed model to &#039;&#039;T-pose&#039;&#039;, and move &#039;&#039;.001&#039;&#039; and &#039;&#039;.002&#039;&#039; animated models to &#039;&#039;Pose 1&#039;&#039; and &#039;&#039;Pose 2&#039;&#039; collections respectively.&lt;br /&gt;
# If you&#039;ve imported the textured model, [[#Broken_alpha_transparency_and_textures_on_animated_models|apply textures to the animated models and fix the alpha transparency issue.]]&lt;br /&gt;
# At this point, your scene should look as shown in the screenshot on the right.&lt;br /&gt;
# You can hide the Pose 1 and Pose 2 collections - they won&#039;t be changed in this tutorial anymore.&lt;br /&gt;
&lt;br /&gt;
==Adjusting T-posed model&#039;s Z location==&lt;br /&gt;
At this moment the T-posed model is sunk to the ground. That&#039;s because the pelvis location is set to 0,0,0. All of the animations in Oni have their heights adjusted [[XML:TRAM#List_of_tags.2C_types.2C_and_flags|(through the &amp;lt;Height&amp;gt; tags)]] so that the pelvis is roughly at Z ~ 0.9, so that the characters appear standing on the floor instead of, again, sinking into it. For this reason, we want to adjust the position of the pelvis so that the feet soles are aligned with the floor.&lt;br /&gt;
&lt;br /&gt;
[[Image:PelvisZLocation.png|400px|right|thumb|Expected result by the end of this header]]&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;li value=&amp;quot;10&amp;quot;&amp;gt;Adjust the Z position of the T-posed model&#039;s Pelvis in one of the two ways:&amp;lt;/li&amp;gt;&lt;br /&gt;
## Simply switch to Front Ortographic view (Num 1) and move the Pelvis along the Z axis so that the feet soles are roughly aligned with the floor. This will work, but if you want 100% accuracy, use the method below.&lt;br /&gt;
## The 3D Cursor snapping method:&lt;br /&gt;
### Select one of the feet in Object mode.&lt;br /&gt;
### Switch to Edit mode.&lt;br /&gt;
### Select one of the lowest-reaching vertices on the foot and Snap Cursor to Active. (Shift + S, 3)&lt;br /&gt;
### Switch back to object mode.&lt;br /&gt;
### Select the Pelvis.&lt;br /&gt;
### Snap Selection to Cursor. (Shift+S, 8)&lt;br /&gt;
### Set the X and Y locations of the pelvis to 0.&lt;br /&gt;
### Invert the Z location of the pelvis.&lt;br /&gt;
### The pelvis should be now at Z ~ 0.9 with feet soles perfectly aligned with the floor.&lt;br /&gt;
# At this point, your scene should look as shown in the screenshot on the right.&lt;br /&gt;
&lt;br /&gt;
==Creating the Rigify metarig and adding limb flexion==&lt;br /&gt;
This part describes how to create a Rigify metarig and how to adjust it so that it matches the T-posed model body parts.&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;li value=&amp;quot;12&amp;quot;&amp;gt;Before you proceed to create the rig, you need to add small rotations to the limbs, which will allow Rigify to know in which direction the elbows and knees are going to bend. Otherwise, the rig will not function properly.&amp;lt;/li&amp;gt;&lt;br /&gt;
## Add the following Z rotations to the respective body parts in accordance with the list below:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Z rotation !! Bones&lt;br /&gt;
|-&lt;br /&gt;
| -5 || &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;right_thigh &amp;lt;li&amp;gt;left_thigh &amp;lt;li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| -10 || &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;right_calf &amp;lt;li&amp;gt;left_calf &amp;lt;li&amp;gt;right_wrist &amp;lt;li&amp;gt;left_wrist &amp;lt;/ul&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 5 || &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;right_biceps &amp;lt;li&amp;gt;left_biceps &amp;lt;li&amp;gt; right_handfist &amp;lt;li&amp;gt;left_handfist &amp;lt;li&amp;gt;right_foot &amp;lt;li&amp;gt;left_foot&amp;lt;/ul&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;li value=&amp;quot;13&amp;quot;&amp;gt;Enable Rigify in Blender if you haven&#039;t already - you can do that by going to Edit / Preferences / Addons and looking it up, as Rigify comes with by Blender by default.&amp;lt;/li&amp;gt;&lt;br /&gt;
# Add a Basic Human Metarig  to the scene. ( Add Menu / Armature / Basic / Basic Human (Meta-Rig) )&lt;br /&gt;
## Scale the rig by 10 or so that it&#039;s roughly the size of the character.&lt;br /&gt;
## Apply the scale. ( Object / Apply / Scale )&lt;br /&gt;
# Go to Metarig&#039;s Object Data Properties tab and:&lt;br /&gt;
## Open Viewport Display,&lt;br /&gt;
## Check &#039;&#039;In Front&#039;&#039; box to make the metarig easier to select when your Viewport is in Solid or Material Preview shading modes,&lt;br /&gt;
## Check the &#039;&#039;Axes&#039;&#039; box to see the local axes of each bones - this makes their rolls easier to understand.&lt;br /&gt;
# Remove the following bones from the Metarig:&lt;br /&gt;
*pelvis.L&lt;br /&gt;
*pelvis.R&lt;br /&gt;
*breast.L&lt;br /&gt;
*breast.R&lt;br /&gt;
*spine.005&lt;br /&gt;
*spine.006&lt;br /&gt;
# &amp;lt;li value=&amp;quot;17&amp;quot;&amp;gt;Go to Edit mode, select Bone Properties tab and change the &#039;&#039;Connected&#039;&#039; box of the following Metarig&#039;s bones accordingly to the below table:&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bone || Connected&lt;br /&gt;
|-&lt;br /&gt;
| spine.003 || Disable&lt;br /&gt;
|-&lt;br /&gt;
| spine.004 || Enable&lt;br /&gt;
|-&lt;br /&gt;
| shoulder.l || Enable&lt;br /&gt;
|-&lt;br /&gt;
| shoulder.r || Enable&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;li value=&amp;quot;18&amp;quot;&amp;gt;The default Rigify bone layer order is highly unergonomic. For this reason, reassign the following bones to bone layers in accordance with the table below. You can reassign bones&#039; bone layers by selecting them and pressing M. Make sure you have enabled User Tooltips in Preferences / Interface - that way when you move your cursor over the layer box, a tooltip will display the layer number.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bones !! Bone layer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;spine &amp;lt;li&amp;gt;spine.001 &amp;lt;li&amp;gt;spine.002 &amp;lt;li&amp;gt;spine.003 &amp;lt;li&amp;gt;spine.004 &amp;lt;li&amp;gt;shoulder.l &amp;lt;li&amp;gt;shoulder.r &amp;lt;/ul&amp;gt; || 8&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;upper_arm.L &amp;lt;li&amp;gt;forearm.L &amp;lt;li&amp;gt;hand.L &amp;lt;/ul&amp;gt; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;upper_arm.R &amp;lt;li&amp;gt;forearm.R &amp;lt;li&amp;gt;hand.R &amp;lt;/ul&amp;gt; || 16&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;thigh.L &amp;lt;li&amp;gt;shin.L &amp;lt;li&amp;gt;foot.L &amp;lt;li&amp;gt;toe.L &amp;lt;li&amp;gt;heel.02.L &amp;lt;/ul&amp;gt; || 4&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;thigh.R &amp;lt;li&amp;gt;shin.R &amp;lt;li&amp;gt;foot.R &amp;lt;li&amp;gt;toe.R &amp;lt;li&amp;gt;heel.02.R &amp;lt;/ul&amp;gt; || 20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;li value=&amp;quot;19&amp;quot;&amp;gt;Go to Pose mode, select Bone Properties tab and open the Rigify Type box.&amp;lt;/li&amp;gt;&lt;br /&gt;
# Set &#039;&#039;Limb Segments&#039;&#039; and &#039;&#039;B-Bone Segments&#039;&#039; to 1 on the bones listed below. Because Oni uses rigid body parts, Limb Segments and Bendy bones are not needed.&lt;br /&gt;
* upper_arm.L&lt;br /&gt;
* upper_arm.R&lt;br /&gt;
* thigh.L&lt;br /&gt;
* thigh.R&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;li value=&amp;quot;20&amp;quot;&amp;gt; Disable &#039;&#039;Assign Tweak Layers&#039;&#039; checkbox on the bones listed below.&amp;lt;/li&amp;gt;&lt;br /&gt;
* upper_arm.L&lt;br /&gt;
* upper_arm.R&lt;br /&gt;
* thigh.L&lt;br /&gt;
* thigh.R&lt;br /&gt;
* spine&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;li value=&amp;quot;21&amp;quot;&amp;gt; Remove &#039;&#039;rig type&#039;&#039; on the &#039;&#039;spine.004&#039;&#039; bone.&amp;lt;/li&amp;gt;&lt;br /&gt;
# Set &#039;&#039;rig type&#039;&#039; on &#039;&#039;spine.003&#039;&#039; bone to &#039;&#039;spines.super_head&#039;&#039;. &lt;br /&gt;
# Enable the &#039;&#039;Connect chain&#039;&#039; checkbox on the &#039;&#039;spine.003&#039;&#039; bone.&lt;br /&gt;
# Disable the &#039;&#039;Widget&#039;&#039; checkbox on &#039;&#039;shoulder.L&#039;&#039; and &#039;&#039;shoulder.R bones&#039;&#039;.&lt;br /&gt;
# Set &#039;&#039;pivot_position&#039;&#039; on the &#039;&#039;spine&#039;&#039; bone to 1.&lt;br /&gt;
# Enable the &#039;&#039;Custom Pivot Control&#039;&#039; checkbox on the &#039;&#039;spine&#039;&#039; bone.&lt;br /&gt;
# Assign Tweak Layer of spine.003 to 9.&lt;br /&gt;
# Assign FK layers for the following bones in accordance with the table below:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bones !! Bone layer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;spine &amp;lt;li&amp;gt;spine.003&amp;lt;/ul&amp;gt; || 9&lt;br /&gt;
|-&lt;br /&gt;
| upper_arm.L || 1&lt;br /&gt;
|-&lt;br /&gt;
| upper_arm.R || 17&lt;br /&gt;
|-&lt;br /&gt;
| thigh.L &amp;lt;/ul&amp;gt; || 5&lt;br /&gt;
|-&lt;br /&gt;
| thigh.R &amp;lt;/ul&amp;gt; || 21&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;li value=&amp;quot;29&amp;quot;&amp;gt;Now you need to adjust metarig&#039;s bones so that they match up with character body parts. In order to reduce the amount of needed work, switch to Edit Mode and check the X-Axis Mirror either in Options or the Tool tab.&amp;lt;/li&amp;gt;&lt;br /&gt;
# Switch to Object mode and using the Snapping Cursor to Active, and Snapping Selection to Cursor in the Snap menu (Shift + S), keep snapping cursor to model&#039;s body parts, selecting the Metarig, switching to Edit mode, selecting the appropriate bone and snapping it to 3D Cursor. &#039;&#039;&#039;I believe it is intuitive which bones should be snapped to which body parts, therefore there is no need for a table describing that, with the exception of hints on what should be done about spine.004, hand.L, hand.R, toe.L, toe.R, heel.02.L and heel.02.R.&#039;&#039;&#039;&lt;br /&gt;
## There is actually nothing you need to do about the heel bones, leave them as they are.&lt;br /&gt;
## Snap the tails of spine.004, hand.L and hand.R to their heads and move them along the axis they&#039;re pointing at, to some whatever point that makes sense to you, e.g. furthest reaching vertex on the hand. No need to be precise here, and thus snapping - just move the tail so that it is roughly where you want it to be.&lt;br /&gt;
## In order to keep the toe bones aligned and properly positioned, do the following for each toe bone:&lt;br /&gt;
### Select the foot in object mode,&lt;br /&gt;
### Snap cursor to the furthest and lowest reaching vertex on the foot,&lt;br /&gt;
### Copy the X location of that vertex,&lt;br /&gt;
### Snap the bone to cursor,&lt;br /&gt;
### Paste the X location to the bone&#039;s head,&lt;br /&gt;
### Snap bone&#039;s tail to the head,&lt;br /&gt;
### Move the head along the Y axis by some amount will make it easy to select but not too big.&lt;br /&gt;
# In edit mode, set the following rolls for the Metarig bones as described below (if you don&#039;t, body parts, mainly shoulders, will get badly rotated after constraining them to the rig after its generation):&lt;br /&gt;
## shoulder.L, 90 degrees,&lt;br /&gt;
## shoulder.R, -90 degrees,&lt;br /&gt;
## &#039;&#039;All&#039;&#039; other bones, 0 degrees.&lt;br /&gt;
# Now we have to set up how our Rigify rig layers will be named and set up. Go to the Object Data Properties tab, open up Rigify Layer Names, and set the table according to the screenshot below, marked as Point 32.&lt;br /&gt;
# The metarig is now correctly adjusted. Your scene should look as shown in the screenshot below, marked as Point 33.&lt;br /&gt;
# We highly recommend to save your project here and to continue your work in a new file (i.e. save, then save as a new file and continue your work on the new file), so that you can revert to the version you had until now and adjust the Metarig if needed. You can skip this, work on a single file, adjust the metarig, delete your current rig and generate a new one, but it may or may not be less convenient to rename.&lt;br /&gt;
# Generate the rig. Congratulations, you have generated the rig and can move to constraining the character to it. Your scene should look as shown in the screenshot below, marked as Point 35. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:RigifyLayerNames.png|300px|frameless]] || [[Image:Metarig.png|400px|frameless]] || [[Image:Rig.png|400px|frameless]]&lt;br /&gt;
|-&lt;br /&gt;
! Point 32, Rigify layer names for the rig !! Point 33, fully adjusted Metarig. !! Point 35, generated rig.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Constraining the character to the rig and adding the Axis Correction Empties==&lt;br /&gt;
Now we get to constrain the character to the rig and later edit the rig. Unfortunately, there&#039;s even more work in editing the rig than with the metarig.&lt;br /&gt;
# &amp;lt;li value=&amp;quot;36&amp;quot;&amp;gt;Hide the metarig, it won&#039;t be needed anymore.&amp;lt;/li&amp;gt;&lt;br /&gt;
# On the Pelvis of the T-posed character, add two Copy Rotation object constraints with the settings according to the table below. &amp;quot;x&amp;quot; means there&#039;s nothing set.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Setting !! Copy Rotation !! Copy Rotation.001&lt;br /&gt;
|-&lt;br /&gt;
| Target || rig || x&lt;br /&gt;
|-&lt;br /&gt;
| Order || ZYX Euler || Default&lt;br /&gt;
|-&lt;br /&gt;
| Mix || Replace || After Original&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;li value=&amp;quot;37&amp;quot;&amp;gt;Copy the constraints to all of the remaining body parts.&amp;lt;/li&amp;gt;&lt;br /&gt;
# At this point, the character is folded into Oni&#039;s default pose, described [[Importing_character_models#Oni.27s_default_orientation|HERE.]] This is hard to work with, so disable all of the object constraints with the ObjectConstraintEnabler script available [[Blender#Script_for_enabling.2Fdisabling_constraints_in_selected_objects|HERE]]. We will also fix the folded pose in a moment.&lt;br /&gt;
# Add a &#039;&#039;Copy Location&#039;&#039; constraint to the &#039;&#039;Pelvis&#039;&#039; and:&lt;br /&gt;
## Set the &#039;&#039;Target to &#039;&#039;rig&#039;&#039;,&lt;br /&gt;
## Set the &#039;&#039;Bone to ORG-spine&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;li value=&amp;quot;40&amp;quot;&amp;gt;Now we need to fix the folded pose. This is done through a set of Empties with specified rotations, which are added to the rotation of each body part through the &#039;&#039;Copy Rotation.001&#039;&#039; constraint (this is also why the Mix of that constraint was set to &#039;&#039;After Original&#039;&#039;).&amp;lt;/li&amp;gt;&lt;br /&gt;
## Create a new collection in the Outliner called &amp;quot;&#039;&#039;Axis Correction Empties&#039;&#039;&amp;quot;.&lt;br /&gt;
## Add six Arrows Empties, all with their Name showing in the Viewport Display. ( Object Properties / Viewport Display / Name )&lt;br /&gt;
## Name the empties and place them in the proposed arbitrary postions using cursor snapping, and set their rotations according to the table below - you can place them however you want, as their location does not influence the rig in any way, however, proper placement makes them easy to edit if needed. It&#039;s also proposed to place the empties one meter either in front or behind the given body part.&lt;br /&gt;
&lt;br /&gt;
[[Image:AxisCorrectionEmptyPlacement.png|200px|right|thumb|Proposed Axis Correction Empties&#039; placement]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Empty !! Body Part !! In front of or behind? || X rotation || Y rotation || Z rotation&lt;br /&gt;
|-&lt;br /&gt;
| ACFeet || Either foot || Behind || -90 || -52.5 || 90&lt;br /&gt;
|-&lt;br /&gt;
| ACHandL || left_handfist || Behind || 180 || 0 || 90&lt;br /&gt;
|-&lt;br /&gt;
| ACHandR || right_handfist || Behind || 0 || 0 || 90&lt;br /&gt;
|-&lt;br /&gt;
| ACLimbs || neck || Behind || -90 || 0 || 90&lt;br /&gt;
|-&lt;br /&gt;
| ACPelvis || pelvis || Front || 90 || 8.6 || 90&lt;br /&gt;
|-&lt;br /&gt;
| ACSpine || mid || Front || 90 || 0 || 90&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
::#&amp;lt;li value=&amp;quot;4&amp;quot;&amp;gt; In your Viewport, open the Viewport Overlay and enable Relationship Lines. These are the lines that will show you lines from constrained objects to their targets. They will give you a better sense of how body parts are copying rotations from the Empties you are about to make. You can also turn Relationship Lines off at any point if they&#039;re making the scene hard to read.&amp;lt;/li&amp;gt;&lt;br /&gt;
::# Set the &#039;&#039;Bones&#039;&#039; of &#039;&#039;Copy Rotation&#039;&#039; and &#039;&#039;Targets&#039;&#039; of &#039;&#039;Copy Rotation.001&#039;&#039; constraints in character&#039;s body parts in accordance with the table below. The table may be intimidating, but it should be logical enough and easy to copy and paste the targets and bones - all of the body parts get targeted to a corresponding ORG bone in the rig through &#039;&#039;Copy Rotation&#039;&#039; and get their Axis Correction rotation added through &#039;&#039;Copy Rotation.001&#039;&#039; set to appropriate empty.&lt;br /&gt;
&lt;br /&gt;
[[Image:RigCharacterConstrained.png|600px|right|thumb|Expected result by the end of this header]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Body part !! Copy Rotation / Bone !! Copy Rotation.001 / Target&lt;br /&gt;
|-&lt;br /&gt;
| pelvis || ORG-spine || ACPelvis&lt;br /&gt;
|-&lt;br /&gt;
| mid || ORG-spine.001 || ACSpine&lt;br /&gt;
|-&lt;br /&gt;
| chest || ORG-spine.002 || ACSpine&lt;br /&gt;
|-&lt;br /&gt;
| neck || ORG-spine.003 || ACSpine&lt;br /&gt;
|-&lt;br /&gt;
| head || ORG-spine.004 || ACSpine&lt;br /&gt;
|-&lt;br /&gt;
| right_shoulder || ORG-shoulder.R || ACLimbs&lt;br /&gt;
|-&lt;br /&gt;
| right_biceps || ORG-upper_arm.R || ACLimbs&lt;br /&gt;
|-&lt;br /&gt;
| right_wrist || ORG-forearm.R || ACLimbs&lt;br /&gt;
|-&lt;br /&gt;
| right_handfist || ORG-hand.R || ACHandR&lt;br /&gt;
|-&lt;br /&gt;
| left_shoulder || ORG-shoulder.L || ACLimbs&lt;br /&gt;
|-&lt;br /&gt;
| left_biceps || ORG-upper_arm.L || ACLimbs&lt;br /&gt;
|-&lt;br /&gt;
| left_wrist || ORG-forearm.L || ACLimbs&lt;br /&gt;
|-&lt;br /&gt;
| left_handfist || ORG-hand.L || ACHandL&lt;br /&gt;
|-&lt;br /&gt;
| right_thigh || ORG-thigh.R || ACLimbs&lt;br /&gt;
|-&lt;br /&gt;
| right_calf || ORG-shin.R || ACLimbs&lt;br /&gt;
|-&lt;br /&gt;
| right_foot || ORG-foot.R || ACFeet&lt;br /&gt;
|-&lt;br /&gt;
| left_thigh || ORG-thigh.L || ACLimbs&lt;br /&gt;
|-&lt;br /&gt;
| left_calf || ORG-shin.L || ACLimbs&lt;br /&gt;
|-&lt;br /&gt;
| left_foot || ORG-foot.L || ACFeet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;41&amp;quot;&amp;gt;Enable the object constraints in the character body parts using the ObjectConstraintEnabler script.&amp;lt;/li&amp;gt;&lt;br /&gt;
# At this point, you should be able to pose the character, as shown in the screenshot on the right.&lt;br /&gt;
&lt;br /&gt;
==Removing and editing the rig bones==&lt;br /&gt;
There are still things to do; if you play around posing your character, you will find out the spine behaviour to be somewhat lackluster, and lacking control over the mid and chest bones. This will now be addressed, and later, bone constraints need to be added to rig controller bones. Let&#039;s start off with deleting all the controller bones we don&#039;t need.&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;43&amp;quot;&amp;gt;Select the rig, go to Object Data Properties, Viewport Display and enable In Front. The rig will now always render in front of the character, making it easier to select.&amp;lt;/li&amp;gt;&lt;br /&gt;
# In Edit mode, go to Object Data Properties tab / Skeleton, select Layer 29 (the DEF/Deform) and delete all bones in it.&lt;br /&gt;
# Select layer 28, and move the root bone to layer 24 (Change Bone Layer, default shortcut is M)&lt;br /&gt;
# Remove the bones listed below from the rig. Keep in mind it&#039;s possible to enable just one layer at a time for your convenience. For the record, we will not be editing MCH or ORG layers until later, so you can ignore their layers for now. &#039;&#039;&#039;IMPORTANT NOTE: Be sure to not delete tweak_spine.001 accidentally, as it&#039;s necessary for the rig to function properly.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bone !! Layer&lt;br /&gt;
|-&lt;br /&gt;
| tweak_spine || Torso&lt;br /&gt;
|-&lt;br /&gt;
| tweak_spine.002 || Torso&lt;br /&gt;
|-&lt;br /&gt;
| tweak_spine.003 || Torso (Tweak)&lt;br /&gt;
|-&lt;br /&gt;
| spine_fk.001 || Torso (Tweak)&lt;br /&gt;
|-&lt;br /&gt;
| spine_fk.002 || Torso (Tweak)&lt;br /&gt;
|-&lt;br /&gt;
| upper_arm_tweak.L || Arm.L (IK)&lt;br /&gt;
|-&lt;br /&gt;
| forearm_tweak.L || Arm.L (IK)&lt;br /&gt;
|-&lt;br /&gt;
| hand_tweak.L || Arm.L (IK)&lt;br /&gt;
|-&lt;br /&gt;
| upper_arm_tweak.R || Arm.R (IK)&lt;br /&gt;
|-&lt;br /&gt;
| forearm_tweak.R || Arm.R (IK)&lt;br /&gt;
|-&lt;br /&gt;
| hand_tweak.R || Arm.R (IK)&lt;br /&gt;
|-&lt;br /&gt;
| thigh_tweak.L || Leg.L (IK)&lt;br /&gt;
|-&lt;br /&gt;
| shin_tweak.L || Leg.L (IK)&lt;br /&gt;
|-&lt;br /&gt;
| foot_tweak.L || Leg.L (IK)&lt;br /&gt;
|-&lt;br /&gt;
| thigh_tweak.R || Leg.R (IK)&lt;br /&gt;
|-&lt;br /&gt;
| shin_tweak.R || Leg.R (IK)&lt;br /&gt;
|-&lt;br /&gt;
| foot_tweak.R || Leg.R (IK)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;47&amp;quot;&amp;gt;Using 3D Cursor snapping, snap &#039;&#039;torso&#039;&#039; and &#039;&#039;torso_pivot&#039;&#039; bones to the &#039;&#039;mid&#039;&#039; body part.&amp;lt;/li&amp;gt;&lt;br /&gt;
##Since &#039;&#039;torso&#039;&#039; and &#039;&#039;torso_pivot&#039;&#039; are of the same size, etc. and thus are overlapping each other, feel free to move their tails a bit in the appropriate axis. This applies to all overlapping bones in the rig - if they overlap, move the tail in the axis parallel to the bone.&lt;br /&gt;
#Reparent &#039;&#039;shoulder.L&#039;&#039; and &#039;&#039;shoulder.R&#039;&#039; bones from &#039;&#039;ORG-spine.003&#039;&#039; to &#039;&#039;ORG-spine.002&#039;&#039;.&lt;br /&gt;
# Controller bones are now adjusted, and we can move on to ORG and MCH layers. Select the ORG layer (31), reparent the bones and set their &#039;&#039;Connected&#039;&#039; box according to the table below. &#039;&#039;&#039;x&#039;&#039;&#039; means no change is needed.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bone !! Parent !! Connected&lt;br /&gt;
|-&lt;br /&gt;
| ORG-spine || root || x&lt;br /&gt;
|-&lt;br /&gt;
| ORG-spine.001 || ORG-spine || Yes&lt;br /&gt;
|-&lt;br /&gt;
| ORG-spine.002 || ORG-spine.001 || Yes&lt;br /&gt;
|-&lt;br /&gt;
| ORG-shoulder.L || ORG-spine.002 || x&lt;br /&gt;
|-&lt;br /&gt;
| ORG-shoulder.R || ORG-spine.002 || x&lt;br /&gt;
|-&lt;br /&gt;
| ORG-upper_arm.L || x || No&lt;br /&gt;
|-&lt;br /&gt;
| ORG-upper_arm.R || x || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;50&amp;quot;&amp;gt;Select the MCH layer (3) and remove the following bones:&amp;lt;/li&amp;gt;&lt;br /&gt;
#*MCH-thigh_tweak.L&lt;br /&gt;
#*MCH-thigh_tweak.R&lt;br /&gt;
#*MCH-shin_tweak.L&lt;br /&gt;
#*MCH-shin_tweak.R&lt;br /&gt;
#*MCH-foot_tweak.L&lt;br /&gt;
#*MCH-foot_tweak.R&lt;br /&gt;
# Snap &#039;&#039;MCH-torso.parent&#039;&#039; and &#039;&#039;MCH-torso_pivot&#039;&#039; to the &#039;&#039;mid&#039;&#039; body part. (You can also snap them to &#039;&#039;MCH-spine&#039;&#039; or &#039;&#039;MCH-spine.001&#039;&#039; bones as they&#039;re snapped to &#039;&#039;mid&#039;&#039; as well)&lt;br /&gt;
# With X-Axis mirror enabled, select the MCH-forearm_ik.R bone and extrude it perpendicularly to the axis of the arm. You should now have the MCH-forearm_ik.R.001 and MCH-forearm_ik.L.001 bones. These bones are needed for the wrist snapping function which we&#039;ll implement later.&lt;br /&gt;
&lt;br /&gt;
==Editing the bone constrants of ORG and MCH bone layers==&lt;br /&gt;
Now&#039;s the time to edit and add bone constraints.&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;53&amp;quot;&amp;gt;Switch to Pose mode and add a &#039;&#039;Copy Rotation&#039;&#039; bone constraint to MCH-forearm_ik.R.001 and MCH-forearm_ik.L.001 bones that you&#039;ve added in previous points, targeting MCH-forearm_ik.R and MCH-forearm_ik.L bones (i.e. for the &#039;&#039;MCH-forearm_ik.R.001&#039;&#039;, &#039;&#039;Target&#039;&#039; is &#039;&#039;rig&#039;&#039;, while &#039;&#039;Bone&#039;&#039; should be set to &#039;&#039;MCH-forearm_ik.R.001&#039;&#039;)&amp;lt;/li&amp;gt;&lt;br /&gt;
# Select the ORG layer.&lt;br /&gt;
# Add bone constraints in accordance to the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bone !! Bone Constraint !! Target !! Target/Bone&lt;br /&gt;
|-&lt;br /&gt;
| ORG-spine || Copy Transforms || rig || MCH-WGT-hips&lt;br /&gt;
|-&lt;br /&gt;
| ORG-spine.001 || Copy Rotation || rig || tweak_spine.001&lt;br /&gt;
|-&lt;br /&gt;
| ORG-spine.002 || Copy Transforms || rig || MCH-WGT-chest&lt;br /&gt;
|}&lt;br /&gt;
#&amp;lt;li value=&amp;quot;55&amp;quot;&amp;gt;Delete the &#039;&#039;Stretch to&#039;&#039; bone constraint from &#039;&#039;ORG-spine.003&#039;&#039;.&amp;lt;/li&amp;gt;&lt;br /&gt;
#Set the &#039;&#039;Bone&#039;&#039; in the &#039;&#039;Copy Transforms&#039;&#039; bone constraint in &#039;&#039;ORG-spine.003&#039;&#039; to &#039;&#039;neck&#039;&#039;.&lt;br /&gt;
#Select the MCH layer.&lt;br /&gt;
# Select the MCH-pivot bone.&lt;br /&gt;
## Set the Influence of the Copy Transforms bone constraint to 1.&lt;br /&gt;
## Add a Copy Rotation bone constraint, set it to rig / ORG-spine.002 and set its influence to 0.5.&lt;br /&gt;
# Select the MCH-spine.001 bone, and set the Influence of the Copy Transforms bone constraint to 0.&lt;br /&gt;
# Select the MCH-spine.002 bone.&lt;br /&gt;
## Set the Influence of the Copy Transforms bone constraint to 1.&lt;br /&gt;
## Add a Copy Location bone constraint, and set it to rig / ORG-spine.002.&lt;br /&gt;
# Select the MCH-STR-neck bone.&lt;br /&gt;
## Set the Rotation of the Stretch To bone constraint from Swing to XZ.&lt;br /&gt;
## Add a Damped Track bone constraint.&lt;br /&gt;
### Move it to the top of the bone constraint list.&lt;br /&gt;
### Set it to rig / head.&lt;br /&gt;
### Set the Track Axis to Y if it isn&#039;t already.&lt;br /&gt;
# For both MCH-upper_arm_ik_stretch.L and MCH-upper_arm_ik_stretch.R bones, do the following:&lt;br /&gt;
## Set the Rotation of the Stretch To bone constraint from Swing to XZ.&lt;br /&gt;
## Add a Damped Track bone constraint.&lt;br /&gt;
### Move it to the top of the bone constraint list.&lt;br /&gt;
### Set it to rig / hand_ik (.L or .R appropriately if it&#039;s a right or left hand).&lt;br /&gt;
### Set the Track Axis to Y if it isn&#039;t already.&lt;br /&gt;
# For both MCH-thigh_ik_stretch.L and MCH-thigh_ik_stretch.R bones, do the following:&lt;br /&gt;
## Set the Rotation of the Stretch To bone constraint from Swing to XZ.&lt;br /&gt;
## Add a Damped Track bone constraint.&lt;br /&gt;
### Move it to the top of the bone constraint list.&lt;br /&gt;
### Set it to rig / MCH-foot_roll (.L or .R appropriately if it&#039;s a right or left leg).&lt;br /&gt;
### Set the Track Axis to Y if it isn&#039;t already.&lt;br /&gt;
# Disable the &#039;&#039;Stretch&#039;&#039; checkbox in both of the IK bone constraints in the following bones:&lt;br /&gt;
#*MCH-forearm_ik.L&lt;br /&gt;
#*MCH-forearm_ik.R&lt;br /&gt;
#*MCH-shin_ik.L&lt;br /&gt;
#*MCH-shin_ik.R&lt;br /&gt;
&lt;br /&gt;
==Changing custom shapes of rig controller bones==&lt;br /&gt;
We&#039;re getting close to the end. There&#039;s still a bit of work to do, but all that remains relates to the rig controller bones in Pose mode.&lt;br /&gt;
This short header will focus on changing the shapes of the controller bones - these changes are purely visual and have no functional effect on the rig, however, they do make it more more ergonomic and easier to read.&lt;br /&gt;
[[Image:Rig After Editing Custom Shapes.png|200px|right|thumb|Rig&#039;s expected state at point 69]]&lt;br /&gt;
#&amp;lt;li value=&amp;quot;65&amp;gt;Switch over to all other bone layers except the MCH and ORG layers - all that was related to them is now done.&amp;lt;/li&amp;gt;&lt;br /&gt;
#Select the tweak_spine.001 bone:&lt;br /&gt;
## Set the Custom Object to WGT-rig_thigh_parent.L - this will make it much more easier to read.&lt;br /&gt;
## Set the Scale to 1.5.&lt;br /&gt;
## Disable the &#039;&#039;Scale to Bone Length&#039;&#039; checkbox.&lt;br /&gt;
# Select the spine_fk bone:&lt;br /&gt;
## Disable the &#039;&#039;Scale to Bone Length&#039;&#039; checkbox.&lt;br /&gt;
## Set the Scale to 0.&lt;br /&gt;
#For both hand_ik.R and hand_ik.L bones, disable the &#039;&#039;Scale to Bone Length&#039;&#039; checkbox.&lt;br /&gt;
#For both foot_ik.R and foot_ik.L bones, do the following:&lt;br /&gt;
## Disable the &#039;&#039;Scale to Bone Length&#039;&#039; checkbox.&lt;br /&gt;
## Set the Scale to 2.&lt;br /&gt;
#For both toe.R and toe.L, set the scale to 0. At this point, the rig should look as shown in the screenshot on the right.&lt;br /&gt;
&lt;br /&gt;
==Editing the rig_ui.py script==&lt;br /&gt;
Now we&#039;ll need to edit the Rig Layers panel a bit and add the wrist snapping functionality by putting three code snippets into rig_ui.py and running it.&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;71&amp;quot;&amp;gt; Go to the Scripting tab and select the rig_ui.py script.&lt;br /&gt;
#Right at the start of the script you will see the &amp;lt;code&amp;gt;rig_id&amp;lt;/code&amp;gt; field. Copy its value and save it in some text editor, as you&#039;ll be pasting it in the next few steps. &lt;br /&gt;
#Find the following line (use another text editor if you can&#039;t find it in Blender&#039;s Text Editor):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;        props.bones = &#039;[&amp;quot;upper_arm_ik.L&amp;quot;, &amp;quot;upper_arm_ik_target.L&amp;quot;, &amp;quot;hand_ik.L&amp;quot;]&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add the following code snippet below it - this will add a button and functionality for the wrist snapping on the &#039;&#039;&#039;left&#039;&#039;&#039; arm - using the MCH-forearm_ik.L.001 bone that was created in points 52 and 53.&lt;br /&gt;
Also, replace &amp;lt;code&amp;gt;&#039;&#039;&#039;YOURRIGID&#039;&#039;&#039;&amp;lt;/code&amp;gt; with your &amp;lt;code&amp;gt;rig_id&amp;lt;/code&amp;gt; from point 71.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            group2 = group1.row(align=True)&lt;br /&gt;
            props = group2.operator(&#039;pose.rigify_generic_snap_YOURRIGID&#039;, text=&#039;IK wrist (hand.L)&#039;, icon=&#039;SNAP_ON&#039;)&lt;br /&gt;
            props.output_bones = &#039;[&amp;quot;hand_ik.L&amp;quot;]&#039;&lt;br /&gt;
            props.input_bones = &#039;[&amp;quot;MCH-forearm_ik.L.001&amp;quot;]&#039;&lt;br /&gt;
            props.ctrl_bones = &#039;[&amp;quot;MCH-forearm_ik.L.001&amp;quot;]&#039;&lt;br /&gt;
            props.tooltip = &#039;IK hand to wrist&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;74&amp;quot;&amp;gt; Find the following line:&lt;br /&gt;
&amp;lt;pre&amp;gt;        props.bones = &#039;[&amp;quot;upper_arm_ik.R&amp;quot;, &amp;quot;hand_ik.R&amp;quot;, &amp;quot;upper_arm_ik_target.R&amp;quot;]&#039; &amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following code snippet below it - this will add a button and functionality for the wrist snapping on the &#039;&#039;&#039;right&#039;&#039;&#039; arm. Also, replace &amp;lt;code&amp;gt;&#039;&#039;&#039;YOURRIGID&#039;&#039;&#039;&amp;lt;/code&amp;gt; with your &amp;lt;code&amp;gt;rig_id&amp;lt;/code&amp;gt; from point 71.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            group2 = group1.row(align=True)&lt;br /&gt;
            props = group2.operator(&#039;pose.rigify_generic_snap_YOURRIGID&#039;, text=&#039;IK wrist (hand.R)&#039;, icon=&#039;SNAP_ON&#039;)&lt;br /&gt;
            props.output_bones = &#039;[&amp;quot;hand_ik.R&amp;quot;]&#039;&lt;br /&gt;
            props.input_bones = &#039;[&amp;quot;MCH-forearm_ik.R.001&amp;quot;]&#039;&lt;br /&gt;
            props.ctrl_bones = &#039;[&amp;quot;MCH-forearm_ik.R.001&amp;quot;]&#039;&lt;br /&gt;
            props.tooltip = &#039;IK hand to wrist&#039;&lt;br /&gt;
            if is_selected({&#039;upper_arm_ik.R&#039;, &#039;hand_ik.R&#039;, &#039;upper_arm_parent.R&#039;, &#039;upper_arm_ik_target.R&#039;}):&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;75&amp;quot;&amp;gt; Find the following line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;        row.prop(context.active_object.data, &#039;layers&#039;, index=8, toggle=True, text=&#039;Torso&#039;) &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Change it to the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        row.prop(context.active_object.data, &#039;layers&#039;, index=9, toggle=True, text=&#039;Pose Matching&#039;)&lt;br /&gt;
&lt;br /&gt;
        row = col.row()&lt;br /&gt;
        row.separator()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;76&amp;quot;&amp;gt; Find the following line:&lt;br /&gt;
&amp;lt;pre&amp;gt;        row.prop(context.active_object.data, &#039;layers&#039;, index=9, toggle=True, text=&#039;Torso (Tweak)&#039;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Change it to the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;        row.prop(context.active_object.data, &#039;layers&#039;, index=8, toggle=True, text=&#039;Torso&#039;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:IKWrist.png|200px|right|thumb|Rig&#039;s expected state at point 80.]]&lt;br /&gt;
[[Image:ModifiedRigLayers.png|200px|right|thumb|Rig&#039;s expected state at point 80, with hand_ik.R selected, showing the newly added IK wrist snapping functionality.]]&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;77&amp;quot;&amp;gt;Find the following code:&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        row.prop(context.active_object.data, &#039;layers&#039;, index=21, toggle=True, text=&#039;Leg.R (FK)&#039;)&lt;br /&gt;
&lt;br /&gt;
        row = col.row()&lt;br /&gt;
        row.separator()&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Remove the &amp;lt;code&amp;gt;row = col.row()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;row.seperator()&amp;lt;/code&amp;gt; lines.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;78&amp;quot;&amp;gt; Find the following line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;        row.prop(context.active_object.data, &#039;layers&#039;, index=28, toggle=True, text=&#039;Root&#039;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Change the value of &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt; to 24. Index is the layer number, and Root should be layer 24, not 28. &lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;79&amp;quot;&amp;gt;We recommend backing up your file at this point.&lt;br /&gt;
#Run the script, and move to the Layout tab. Your rig should look as shown in the screenshots on the right.&lt;br /&gt;
&lt;br /&gt;
==Adding the Rigify Axis Correction Empties==&lt;br /&gt;
Before we add the Pose Matching functionality, we need to create Axis Correction Empties that will account for Rigify&#039;s axis orientation.&lt;br /&gt;
#&amp;lt;li value=&amp;quot;81&amp;quot;&amp;gt;Switch to Object Mode.&lt;br /&gt;
#Duplicate the &#039;&#039;Axis Correction Empties&#039;&#039; collection and rename it to &#039;&#039;Rigify Axis Correction Empties&#039;&#039;&lt;br /&gt;
## Rename the ACPelvis.001 to RACHead and move it in the global Z axis so that it is aligned with the head along the Y axis (or 3D cursor snap it)&lt;br /&gt;
## Rename the remaining empties in the newly-made collection by removing the &#039;&#039;.001&#039;&#039; suffix and changing the &#039;&#039;AC&#039;&#039; prefix to &#039;&#039;RAC&#039;&#039;.&lt;br /&gt;
## Set the rotations of the empties according to the table below:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Empty !!  X rotation || Y rotation || Z rotation&lt;br /&gt;
|-&lt;br /&gt;
| RACFeet || 38.1 || 90 || 0&lt;br /&gt;
|-&lt;br /&gt;
| RACHandL ||  -180 || 0 || 90&lt;br /&gt;
|-&lt;br /&gt;
| RACHandR || 0 || 0 || -90&lt;br /&gt;
|-&lt;br /&gt;
| RACHead || -90 || -90 || 0&lt;br /&gt;
|-&lt;br /&gt;
| RACLimbs || 90 || 90 || 0&lt;br /&gt;
|-&lt;br /&gt;
| RACSpine || 180 || -90 || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Adding bone constraints to rig controller bones and drivers==&lt;br /&gt;
This is the final section of this tutorial. Now we just have to add the Pose Matching functionality, so we can constrain the rig to imported animations in Pose 1 and Pose 2 collections. We do that by adding two new bones to the rig, bone constraints to the rig controller bones and then drivers which will control the influence of the bone constraints through the Z location of the newly added bones. We will also &lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;83&amp;quot;&amp;gt;Select the rig, go to Edit mode and select the Pose Matching layer.&lt;br /&gt;
#Add a new bone named &#039;&#039;Pose1&#039;&#039;. &lt;br /&gt;
#Set its transforms as listed below (or make it as big as you want, this is purely a visual/ergonomic matter):&lt;br /&gt;
#*Head X,Y,Z: 1,0,0&lt;br /&gt;
#*Tail X,Y,Z: 1,0,1&lt;br /&gt;
#Duplicate the bone and rename it to &#039;&#039;Pose2&#039;&#039;.&lt;br /&gt;
#Set its transforms as listed below (it will be simply mirrored along the X axis)&lt;br /&gt;
#*Head X,Y,Z: -1,0,0&lt;br /&gt;
#*Tail X,Y,Z: -1,0,1&lt;br /&gt;
#Switch to Pose mode.&lt;br /&gt;
#For both Pose1 and Pose2 bones, select them, go to Bone Properties tab, Viewport Display, Custom Shape and set the Custom Object to WGT-rig_shoulder.L.&lt;br /&gt;
##You can also set the Scale to 10 and disable the &#039;&#039;Scale to Bone Length&#039;&#039; checkbox for them if you want.&lt;br /&gt;
#For now, move both Pose 1 and Pose 2 in Global Z axis so that they are below the &amp;quot;floor&amp;quot; (XY plane).&lt;br /&gt;
#Select the Torso layer and all of the FK layers in the Rig Layers panel.&lt;br /&gt;
#Select the &#039;&#039;hips&#039;&#039; bone.&lt;br /&gt;
##Add &#039;&#039;three&#039;&#039; Copy Rotation bone constraints, and move the one without the suffix to the bottom of the list (so the order of the bone constraints going from the top to bottom is &#039;&#039;Copy Rotation.001&#039;&#039;, &#039;&#039;Copy Rotation.002&#039;&#039;, &#039;&#039;Copy Rotation&#039;&#039;). &#039;&#039;Copy Rotation.001&#039;&#039; and &#039;&#039;Copy Rotation.002&#039;&#039; will be used for pose matching, &#039;&#039;Copy Rotation&#039;&#039; will be used for axis correction.&lt;br /&gt;
##In the &#039;&#039;Copy Rotation&#039;&#039; constraint, set the &#039;&#039;Mix&#039;&#039; to &#039;&#039;After Original&#039;&#039;. &lt;br /&gt;
#Now we&#039;ll have to add the drivers controlling the influence of each Copy Rotation constraint. As shown in Pierrick Picaut&#039;s tutorial, you can do that by right clicking on the Influence value and pressing &#039;&#039;Add Driver&#039;&#039; (same applies to any other property in any other constraint). Once you add a driver, you can edit it either through &#039;&#039;Edit Driver&#039;&#039; or through the Driver Editor - both are selectable within the same menu.&lt;br /&gt;
##Add a driver to the &#039;&#039;Influence&#039;&#039; of each &#039;&#039;Copy Rotation&#039;&#039; constraint in accordance with the table below:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Copy Rotation.001 !! Copy Rotation.002 !! Copy Rotation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*Driver Type: &#039;&#039;Scripted Expression&#039;&#039; (default setting)&lt;br /&gt;
*Expression: &#039;&#039;var&#039;&#039;&lt;br /&gt;
*Amount of input variables: one (default setting)&lt;br /&gt;
*Input Variable type: &#039;&#039;Transform Channel&#039;&#039; (default setting)&lt;br /&gt;
*Input Variable name: &#039;&#039;var&#039;&#039; (default setting)&lt;br /&gt;
*Object: &#039;&#039;rig&#039;&#039;&lt;br /&gt;
*Bone: &#039;&#039;Pose1&#039;&#039;&lt;br /&gt;
*Type: &#039;&#039;Z Location&#039;&#039;&lt;br /&gt;
*Space: &#039;&#039;World Space&#039;&#039; (default setting)&lt;br /&gt;
||&lt;br /&gt;
Same settings as in Copy Rotation.001, with the exception of:&lt;br /&gt;
*Bone: &#039;&#039;Pose2&#039;&#039;&lt;br /&gt;
||&lt;br /&gt;
*Driver Type: &#039;&#039;Scripted Expression&#039;&#039; (default setting)&lt;br /&gt;
*Expression: &#039;&#039;max(var1,var2)&#039;&#039; (press Enter to get rid of the invalid expression error, if you have it)&lt;br /&gt;
*Amount of input variables: two (&#039;&#039;&#039;press &#039;&#039;Add Input Variable&#039;&#039;&#039;&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
First input variable:&lt;br /&gt;
*Input Variable type: &#039;&#039;Transform Channel&#039;&#039; (default setting)&lt;br /&gt;
*Input Variable name: &#039;&#039;var1&#039;&#039;&lt;br /&gt;
*Object: &#039;&#039;rig&#039;&#039;&lt;br /&gt;
*Bone: &#039;&#039;Pose1&#039;&#039;&lt;br /&gt;
*Type: &#039;&#039;Z Location&#039;&#039;&lt;br /&gt;
*Space: &#039;&#039;World Space&#039;&#039; (default setting)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Second input variable:&lt;br /&gt;
*Input Variable type: &#039;&#039;Transform Channel&#039;&#039; (&#039;&#039;&#039;be sure to change it to this&#039;&#039;&#039;, added variables have &#039;&#039;Single Property&#039;&#039; set as default)&lt;br /&gt;
*Input Variable name: &#039;&#039;var2&#039;&#039;&lt;br /&gt;
*Object: &#039;&#039;rig&#039;&#039;&lt;br /&gt;
*Bone: &#039;&#039;Pose2&#039;&#039;&lt;br /&gt;
*Type: &#039;&#039;Z Location&#039;&#039;&lt;br /&gt;
*Space: &#039;&#039;World Space&#039;&#039; (default setting)&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;94&amp;quot;&amp;gt;You can check if the drivers are working by moving Pose1 and Pose2 bones along global Z axis and checking if the Influence of Copy Rotation bone constraints in &#039;&#039;hips&#039;&#039; or Input Variable values in their drivers change.&lt;br /&gt;
#Copy the bone constraints from the &#039;&#039;hips&#039;&#039; bone to the following bones:&lt;br /&gt;
#*tweak_spine.001&lt;br /&gt;
#*chest&lt;br /&gt;
#*shoulder.R&lt;br /&gt;
#*shoulder.L&lt;br /&gt;
#*neck&lt;br /&gt;
#*head&lt;br /&gt;
#*upper_arm_fk.R&lt;br /&gt;
#*upper_arm_fk.L&lt;br /&gt;
#*forearm_fk.R&lt;br /&gt;
#*forearm_fk.L&lt;br /&gt;
#*hand_fk.R&lt;br /&gt;
#*hand_fk.L&lt;br /&gt;
#*thigh_fk.R&lt;br /&gt;
#*thigh_fk.L&lt;br /&gt;
#*shin_fk.R&lt;br /&gt;
#*shin_fk.L&lt;br /&gt;
#*foot_fk.L&lt;br /&gt;
#*foot_fk.R&lt;br /&gt;
#Unfortunately, because Blender at this moment does not copy drivers when copying bone constraints, the bone constraints you&#039;ve just copied are lacking the drivers. Because of this, you have to copy the drivers manually - simply right click on the &#039;&#039;Influence&#039;&#039; value of &#039;&#039;Copy Rotation&#039;&#039; constraint, press &#039;&#039;Copy Driver&#039;&#039;, and go through all bones in the upper list and &#039;&#039;Paste Driver&#039;&#039; onto the Influence of the &#039;&#039;Copy Rotation&#039;&#039; in each bone. &#039;&#039;&#039;Do this for all three &#039;&#039;Copy Rotation&#039;&#039; bone constraints.&#039;&#039;&#039;&lt;br /&gt;
#Add two &#039;&#039;Copy Location&#039;&#039; constraints to &#039;&#039;torso&#039;&#039; and &#039;&#039;torso_pivot&#039;&#039; bones, and make sure they&#039;re named &#039;&#039;Copy Location.001&#039;&#039; and &#039;&#039;Copy Location.002&#039;&#039;.&lt;br /&gt;
#Copy Influence Drivers from any of the bones in point 96 and paste them into the &#039;&#039;Influence&#039;&#039; of &#039;&#039;Copy Location&#039;&#039; constraints in &#039;&#039;torso&#039;&#039; and &#039;&#039;torso_pivot&#039;&#039;, in accordance with the numbers of bone constraints (e.g. copy the driver from &#039;&#039;hips&#039;&#039;&#039; &#039;&#039;Copy Rotation.001&#039;&#039; Influence and paste it into Influence of &#039;&#039;Copy Location.001&#039;&#039; in &#039;&#039;torso&#039;&#039; and &#039;&#039;torso_pivot&#039;&#039;).&lt;br /&gt;
#Set the &#039;&#039;Copy Rotation&#039;&#039; constraints&#039; Axis correction &#039;&#039;Target&#039;&#039; in accordance with the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bone !! Copy Rotation target&lt;br /&gt;
|-&lt;br /&gt;
| hips || RACSpine&lt;br /&gt;
|-&lt;br /&gt;
| tweak_spine.001 || RACHead&lt;br /&gt;
|-&lt;br /&gt;
| chest || RACSpine&lt;br /&gt;
|-&lt;br /&gt;
| neck || RACHead&lt;br /&gt;
|-&lt;br /&gt;
| head || RACHead&lt;br /&gt;
|-&lt;br /&gt;
| shoulder.R  || RACLimbs&lt;br /&gt;
|-&lt;br /&gt;
| shoulder.L || RACLimbs&lt;br /&gt;
|-&lt;br /&gt;
| upper_arm_fk.R || RACLimbs&lt;br /&gt;
|-&lt;br /&gt;
| upper_arm_fk.L || RACLimbs&lt;br /&gt;
|-&lt;br /&gt;
| forearm_fk.R || RACLimbs&lt;br /&gt;
|-&lt;br /&gt;
| forearm_fk.L || RACLimbs&lt;br /&gt;
|-&lt;br /&gt;
| hand_fk.R  || RACHandL&lt;br /&gt;
|-&lt;br /&gt;
| hand_fk.L || RACHandR&lt;br /&gt;
|-&lt;br /&gt;
| thigh_fk.R || RACLimbs&lt;br /&gt;
|-&lt;br /&gt;
| thigh_fk.L || RACLimbs&lt;br /&gt;
|-&lt;br /&gt;
| shin_fk.R || RACLimbs&lt;br /&gt;
|-&lt;br /&gt;
| shin_fk.L || RACLimbs&lt;br /&gt;
|-&lt;br /&gt;
| foot_fk.R || RACFeet&lt;br /&gt;
|-&lt;br /&gt;
| foot_fk.L || RACFeet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Image:RigFinished.png|200px|right|thumb|Finished rig showing the pose matching functionality]]&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;100&amp;quot;&amp;gt; Select any FK (green) bone and set the IK-FK slider to 1. Do this for all four limbs. This has to be done because pose matching works only through FK.&lt;br /&gt;
# Using the [[Blender#Rig_bone_constraint_target_setting_script|RigBoneConstraintTargetSetter script]], set the targets for the &#039;&#039;Copy Rotation.001&#039;&#039; and &#039;&#039;Copy Rotation.002&#039;&#039; bone constraints. You can do that by having the rig in Pose mode, going to the Scripting tab, copying and pasting the script, and running it with &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt; value set to 1, and then set to 2.&lt;br /&gt;
# If you didn&#039;t get any errors, move one of the Pose bones in the global Z axis above the XY plane - the T-posed character should now snap to one of the animations in the &#039;&#039;Pose&#039;&#039; collections, as shown in the screenshot on the right.&lt;br /&gt;
# Congratulations! The rig is now ready to be used.&lt;br /&gt;
&lt;br /&gt;
[[Category:Modding tutorials]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Using_the_Rigify_animation_rig&amp;diff=37838</id>
		<title>Using the Rigify animation rig</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Using_the_Rigify_animation_rig&amp;diff=37838"/>
		<updated>2022-05-20T11:35:05Z</updated>

		<summary type="html">&lt;p&gt;Delano762: Added some basic info to General workflow of animating for Oni using Rigify&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This article is intended to explain the workflow of using the [http://mods.oni2.net/node/388 Rigify-based animation rig for Blender] (made by geyser) for the purpose of making Oni animations, and also how to use it, and what are the Oni-specific additions to it that we&#039;ve made.&lt;br /&gt;
&lt;br /&gt;
==Prerequisite tutorials==&lt;br /&gt;
As this rig is now intented to be used together with BlenderOni, it is necessary to be familiar with either:&lt;br /&gt;
* [[BlenderOni|BlenderOni&#039;s documentation,]]&lt;br /&gt;
* [https://www.youtube.com/watch?v=pA_Y8QBCvPI BlenderOni&#039;s explanatory video,] particularly time ranges from 0:00 - 3:07 and 21:24 - 48:05 (that&#039;s part 1 and 3 of the video).&lt;br /&gt;
&lt;br /&gt;
Besides that, I highly recommend watching the tutorials below if you feel you&#039;re lacking knowledge in any of these subjects:&lt;br /&gt;
&lt;br /&gt;
General Blender basics:&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=RG8qK5zPqgM Wolf&#039;s 45-Minute Crash Course for Blender Virgins]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Practical and intuitive explanation of what Inverse and Forward Kinematics (IK/FK) are - this is explained in Maya, but same principles apply in every 3D editing program including Blender:&lt;br /&gt;
* [https://www.youtube.com/watch?v=p6PYKyxR0aY Animating with IK and FK]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Basics of using Rigify - &#039;&#039;&#039;all you need to know about animating with Rigify is stored in the video below.&#039;&#039;&#039; There is no point in making a tutorial on how to use the rig controllers themselves here - it&#039;s all in the video below:&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=vKgH5zXIYmM Rigify Tutorial #08 - Posing the Rigify rig] by CGDive&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(OPTIONAL) Tutorial on how to create the rig described here - this is strictly optional; the only practical reason to make your own rig is for the purpose of adjusting its controllers to a specific character, however, the advantage that you get out of that is purely visual and a marginal one at that - if you&#039;ve built your rig for Konoko, there&#039;s nothing stopping you from using it on a TCTF SWAT - the limb controllers will be only slightly out of place, which doesn&#039;t impact animating in any way. So ultimately you may want to go through this if you want to learn how this rig works, find this rig confusing, or even just for the bunch of great Youtube tutorials linked in that tutorial.&lt;br /&gt;
&lt;br /&gt;
Also, it&#039;s worth noting that a huge part of this article is in fact copy-pasted from this tutorial.&lt;br /&gt;
&lt;br /&gt;
* [[Creating_an_animation_rig_in_Blender|Creating an animation rig in Blender]]&lt;br /&gt;
&lt;br /&gt;
==Required tools and commands==&lt;br /&gt;
There are several things worth knowing before you start using the rig, tools to get and tutorials to have ready to reference for commands.&lt;br /&gt;
&lt;br /&gt;
===Tools and relevant tutorials===&lt;br /&gt;
* &#039;&#039;&#039;[[BlenderOni|BlenderOni]]&#039;&#039;&#039; - this Blender addon is an integral companion tool for this rig - it contains a number of scripts which automate a lot of operations required to make any use out of the rig. Without those scripts, these operations (e.g. constraining the model to the rig and vice versa) would have to be done manually, which takes a ridiculous amount of time.&lt;br /&gt;
[[Image:Cmder.png|200px|right|thumb|Screenshot showing Cmder&#039;s capabilities within the context of modding Oni]]&lt;br /&gt;
* [http://mods.oni2.net/node/38 &#039;&#039;&#039;Current version of OniSplit.&#039;&#039;&#039;] This is the tool needed to import and export assets out of Oni. &#039;&#039;&#039;DO NOT USE OniSplit GUI or Vago for importing Oni assets into Blender&#039;&#039;&#039; - neither of these weren&#039;t updated in a long time, and thus they don&#039;t support OniSplit&#039;s v0.9.99.2 -blender option. You can still use them for other purposes though, such as sounds and converting .oni files to XMLs, etc.&lt;br /&gt;
* [https://docs.google.com/document/d/175uJGklYASAgrFjxuUG4-kJRDoMTjjP7GvNxSj1GscU/edit &#039;&#039;&#039;Oni-Blender tutorial&#039;&#039;&#039;] by EdT. Please read this in entirety to know likely-to-happen issues and refer to this as your guide for OniSplit commands relating to Blender.&lt;br /&gt;
* [http://oni.bungie.org/forum/viewtopic.php?pid=23230#p23230 &#039;&#039;&#039;Brief overview on creating TRAMs&#039;&#039;&#039;] by EdT - while this was written with XSI in mind, this is still relevant as the process for preparing the XML files for Oni is still the same. Also the next post in that thread, called &#039;&#039;&#039;Brief walk through on modifying a TRAM,&#039;&#039;&#039; is an example of that overview put into practice.&lt;br /&gt;
&lt;br /&gt;
===Optional tools and tutorials===&lt;br /&gt;
* [https://cmder.net/ &#039;&#039;&#039;Cmder&#039;&#039;&#039;] (Windows only) - because OniSplit is a command line tool, it is highly recommended to get any upgrade to Windows&#039; Command Prompt. As shown in the screenshot on the right, Cmder allows you to start it from the context menu in any selected folder, and it also remembers your most recently used commands, vastly improving your workflow when you&#039;re forced to use any command line tools.&lt;br /&gt;
* [https://docs.blender.org/manual/en/2.81/addons/rigging/rigify.html &#039;&#039;&#039;Rigify documentation&#039;&#039;&#039;] - it&#039;s a plugin for Blender designed to automate a lot of rigging work. The rig described here is generated using Rigify. Take a look if you&#039;re interested and want to learn more, but you don&#039;t have to know Rigify&#039;s documentation to use this rig.&lt;br /&gt;
&lt;br /&gt;
==General workflow of animating for Oni using Rigify==&lt;br /&gt;
The most common way to animate characters is to create an armature (also known as a rig) to which the character model is constrained, usually through vertex weights specifying how much a given vertex is controlled by the given controller on a scale from 0 to 1, with all weights summing up to 1. The rig contains a number of controller bones that allow to animate more easily. Then, the animations are usually imported into the game along with the armatures, therefore the animation is stored along with the armature. An example of a game storing animations this way is Halo: Combat Evolved.&lt;br /&gt;
&lt;br /&gt;
Oni character models are divided into 19 rigid body parts organized in a parent-child relation, with the pelvis bone being the root bone, which effectively forms an FK rig. The animations are stored in TRAM files, containing rotation data for each of the 19 body parts, and also location data for the pelvis. There is no armature stored within the game files, therefore in order to use a rig on Oni characters, it is necessary to constrain each of the 19 body parts to the rig bones individually instead of mesh vertices. Also, this automatically means that Oni&#039;s way of storing animations is a destructive one - the data stored in the rig bones that are not direct functional equivalents to Oni character body parts will get lost once the animation is baked into body parts with Visual Transform.&lt;br /&gt;
&lt;br /&gt;
The general workflow of making animations using this rig is the following, assuming you want to make a single animation (i.e. you don&#039;t want to make a throw animation):&lt;br /&gt;
&lt;br /&gt;
# Open up a Blender scene containing the rig.&lt;br /&gt;
# Delete either the model in Pose1 or Pose2.&lt;br /&gt;
# (OPTIONAL) Assuming you want to animate a different character, delete the T-posed model.&lt;br /&gt;
## Import your desired character with textures using -noanim.&lt;br /&gt;
# Import the animation you are using as a starting point. For more detailed information on how to import an Oni animation to Blender, see the next header.&lt;br /&gt;
## If you did point 3, apply the textures on the animated model.&lt;br /&gt;
# Using the &#039;&#039;Set Rig Bone Constraint Targets&#039;&#039; option in BlenderOni, set the targets of the rig&#039;s bone constraints to be the body parts of the animation you&#039;ve imported.&lt;br /&gt;
# Using the Pose Matching functionality, constrain the rig to the imported animation (Set the IK-FK sliders on rig limbs to 1, as Pose Matching works only through FK controllers)&lt;br /&gt;
# For each frame that you want to remain in your animation, while having all the bones selected (or the ones you want), either:&lt;br /&gt;
## Press Ctrl+A, select &#039;&#039;Apply Visual Transform&#039;&#039; to Pose and keyframe it,&lt;br /&gt;
## Or use the &#039;&#039;Bone Visual Transformer&#039;&#039; option in BlenderOni to bake frames within a specified frame range.&lt;br /&gt;
# Disable bone constraints on the rig using the &#039;&#039;Bone Constraint Switch&#039;&#039; option in BlenderOni. &lt;br /&gt;
# &#039;&#039;&#039;Make your animation.&#039;&#039;&#039;&lt;br /&gt;
# Once your animation is ready, use the &#039;&#039;Object Visual Transformer&#039;&#039; option in BlenderOni to bake the rig keyframes into the character model.&lt;br /&gt;
# Using the &#039;&#039;Object Constraint Switch&#039;&#039; option in BlenderOni, disable the object constraints on the character model. &#039;&#039;&#039;The character model should now be animated and have the needed rotations and locations.&lt;br /&gt;
# Export the animation as a DAE.&lt;br /&gt;
&lt;br /&gt;
==Importing Oni animations to Blender==&lt;br /&gt;
This header describes how to import Oni animations to Blender.&lt;br /&gt;
&lt;br /&gt;
For detailed explanation of the required OniSplit commands, please refer to the &#039;&#039;&#039;Oni-Blender Tutorial by EdT&#039;&#039;&#039; listed in the &#039;&#039;&#039;Tools and relevant tutorials&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
# Assuming the character you want to animate isn&#039;t in your rig file, then using OniSplit, export any character you want as a DAE (-extract:dae) using -noanim and -blender arguments. &lt;br /&gt;
## As per EdT&#039;s &#039;&#039;&#039;Oni-Blender Tutorial&#039;&#039;&#039;, you should get &amp;lt;mark&amp;gt;&amp;lt;tt&amp;gt;AnimationDaeWriter: custom axis conversion&amp;lt;/tt&amp;gt;&amp;lt;/mark&amp;gt; in OniSplit output if you&#039;ve used the -blender argument. If you didn&#039;t get that on the output, it means something most likely went wrong and you won&#039;t be able to import the model into Blender (or you will be able to import it but it will be wrong).&lt;br /&gt;
## Assuming you wanted a textured model and thus you&#039;ve exported an ONCC, you should now get a &#039;&#039;&#039;DAE file&#039;&#039;&#039; and an &#039;&#039;&#039;&#039;&#039;images&#039;&#039;&#039;&#039;&#039; folder containing the textures for it.&lt;br /&gt;
# Using OniSplit, export the animation you want as an XML (-extract:xml) using -anim-body (lets you specify the character you want) and -blender arguments.&lt;br /&gt;
## You should get &#039;&#039;&#039;one DAE and one XML file for the animation.&#039;&#039;&#039; &lt;br /&gt;
# Open up a Blender scene containing the rig.&lt;br /&gt;
# Delete either the model either in Pose1 or Pose2 collection. &lt;br /&gt;
# Import the animation into Blender (&#039;&#039;&#039;MAKE SURE YOU CHECK THE &#039;&#039;Import Unit&#039;&#039; BOX EACH TIME&#039;&#039;&#039;, otherwise you will import the model with arbitrary units which will break everything and will be basically unadjustable later))&lt;br /&gt;
# Import the -noanim model into Blender (&#039;&#039;&#039;ALSO MAKE SURE YOU CHECK THE &#039;&#039;Import Unit&#039;&#039; BOX&#039;&#039;&#039;)&lt;br /&gt;
# Move the animated model to either Pose1 or Pose2 collection.&lt;br /&gt;
# If you&#039;ve imported the textured model, [[Blender#Lack_of_textures_on_animated_models|apply textures to the animated models and fix the alpha transparency issue]].&lt;br /&gt;
&lt;br /&gt;
==Added functionalities==&lt;br /&gt;
This header describes functionalities added to the rig by geyser that are not normally present in Rigify.&lt;br /&gt;
&lt;br /&gt;
===Pose matching===&lt;br /&gt;
The way we do animations is we almost universally start by copying the first or last frame of the preceeding animation. For this reason, we needed functionality that would allow us to snap the rig to an animated Oni character. The way it works, it that it uses bone constraints in rig controller bones targeting the character model in order to snap the rig to the model. The influence of the bone constraints is controlled through the Z location of Pose1 and Pose2 bones in the Pose Matching layer, which is done through drivers.&lt;br /&gt;
&lt;br /&gt;
To snap the rig to the animation in one of the Pose collections, simply move the appropriate Pose bone above the XY plane while in Pose mode.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pose1 and Pose2 below the XY plane !! Rig snapped to the animation in Pose 1 collection !! Rig snapped to the animation in Pose 2 collection&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Unposed.png|300px|frameless|center]] || [[Image:Pose1.png|300px|frameless|center]] || [[Image:Pose2.png|300px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Wrist snapping===&lt;br /&gt;
Often when using the IK handles for the arms you will find out that most of the time, you will need the hand to have the same rotation as the forearm. Normally this would mean that you would have to rotate the hands all the time, because IK handles are mainly moved around, and rotated later. For this reason, the wrist snapping functionality was implemented - you can simply copy the rotation of the forearm to the hand by pressing the &amp;quot;IK wrist&amp;quot; button.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Both of the hands after just moving them around... !! Effects of using the IK Wrist button&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:IK Wrist Example1.png|500px|frameless|center]] || [[Image:IK Wrist Example2.png|500px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Modding tutorials]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Using_the_Rigify_animation_rig&amp;diff=37837</id>
		<title>Using the Rigify animation rig</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Using_the_Rigify_animation_rig&amp;diff=37837"/>
		<updated>2022-05-19T16:15:36Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Required tools and commands */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This article is intended to explain the workflow of using the [http://mods.oni2.net/node/388 Rigify-based animation rig for Blender] (made by geyser) for the purpose of making Oni animations, and also how to use it, and what are the Oni-specific additions to it that we&#039;ve made.&lt;br /&gt;
&lt;br /&gt;
==Prerequisite tutorials==&lt;br /&gt;
As this rig is now intented to be used together with BlenderOni, it is necessary to be familiar with either:&lt;br /&gt;
* [[BlenderOni|BlenderOni&#039;s documentation,]]&lt;br /&gt;
* [https://www.youtube.com/watch?v=pA_Y8QBCvPI BlenderOni&#039;s explanatory video,] particularly time ranges from 0:00 - 3:07 and 21:24 - 48:05 (that&#039;s part 1 and 3 of the video).&lt;br /&gt;
&lt;br /&gt;
Besides that, I highly recommend watching the tutorials below if you feel you&#039;re lacking knowledge in any of these subjects:&lt;br /&gt;
&lt;br /&gt;
General Blender basics:&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=RG8qK5zPqgM Wolf&#039;s 45-Minute Crash Course for Blender Virgins]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Practical and intuitive explanation of what Inverse and Forward Kinematics (IK/FK) are - this is explained in Maya, but same principles apply in every 3D editing program including Blender:&lt;br /&gt;
* [https://www.youtube.com/watch?v=p6PYKyxR0aY Animating with IK and FK]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Basics of using Rigify - &#039;&#039;&#039;all you need to know about animating with Rigify is stored in the video below.&#039;&#039;&#039; There is no point in making a tutorial on how to use the rig controllers themselves here - it&#039;s all in the video below:&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=vKgH5zXIYmM Rigify Tutorial #08 - Posing the Rigify rig] by CGDive&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(OPTIONAL) Tutorial on how to create the rig described here - this is strictly optional; the only practical reason to make your own rig is for the purpose of adjusting its controllers to a specific character, however, the advantage that you get out of that is purely visual and a marginal one at that - if you&#039;ve built your rig for Konoko, there&#039;s nothing stopping you from using it on a TCTF SWAT - the limb controllers will be only slightly out of place, which doesn&#039;t impact animating in any way. So ultimately you may want to go through this if you want to learn how this rig works, find this rig confusing, or even just for the bunch of great Youtube tutorials linked in that tutorial.&lt;br /&gt;
&lt;br /&gt;
Also, it&#039;s worth noting that a huge part of this article is in fact copy-pasted from this tutorial.&lt;br /&gt;
&lt;br /&gt;
* [[Creating_an_animation_rig_in_Blender|Creating an animation rig in Blender]]&lt;br /&gt;
&lt;br /&gt;
==Required tools and commands==&lt;br /&gt;
There are several things worth knowing before you start using the rig, tools to get and tutorials to have ready to reference for commands.&lt;br /&gt;
&lt;br /&gt;
===Tools and relevant tutorials===&lt;br /&gt;
* &#039;&#039;&#039;[[BlenderOni|BlenderOni]]&#039;&#039;&#039; - this Blender addon is an integral companion tool for this rig - it contains a number of scripts which automate a lot of operations required to make any use out of the rig. Without those scripts, these operations (e.g. constraining the model to the rig and vice versa) would have to be done manually, which takes a ridiculous amount of time.&lt;br /&gt;
[[Image:Cmder.png|200px|right|thumb|Screenshot showing Cmder&#039;s capabilities within the context of modding Oni]]&lt;br /&gt;
* [http://mods.oni2.net/node/38 &#039;&#039;&#039;Current version of OniSplit.&#039;&#039;&#039;] This is the tool needed to import and export assets out of Oni. &#039;&#039;&#039;DO NOT USE OniSplit GUI or Vago for importing Oni assets into Blender&#039;&#039;&#039; - neither of these weren&#039;t updated in a long time, and thus they don&#039;t support OniSplit&#039;s v0.9.99.2 -blender option. You can still use them for other purposes though, such as sounds and converting .oni files to XMLs, etc.&lt;br /&gt;
* [https://docs.google.com/document/d/175uJGklYASAgrFjxuUG4-kJRDoMTjjP7GvNxSj1GscU/edit &#039;&#039;&#039;Oni-Blender tutorial&#039;&#039;&#039;] by EdT. Please read this in entirety to know likely-to-happen issues and refer to this as your guide for OniSplit commands relating to Blender.&lt;br /&gt;
* [http://oni.bungie.org/forum/viewtopic.php?pid=23230#p23230 &#039;&#039;&#039;Brief overview on creating TRAMs&#039;&#039;&#039;] by EdT - while this was written with XSI in mind, this is still relevant as the process for preparing the XML files for Oni is still the same. Also the next post in that thread, called &#039;&#039;&#039;Brief walk through on modifying a TRAM,&#039;&#039;&#039; is an example of that overview put into practice.&lt;br /&gt;
&lt;br /&gt;
===Optional tools and tutorials===&lt;br /&gt;
* [https://cmder.net/ &#039;&#039;&#039;Cmder&#039;&#039;&#039;] (Windows only) - because OniSplit is a command line tool, it is highly recommended to get any upgrade to Windows&#039; Command Prompt. As shown in the screenshot on the right, Cmder allows you to start it from the context menu in any selected folder, and it also remembers your most recently used commands, vastly improving your workflow when you&#039;re forced to use any command line tools.&lt;br /&gt;
* [https://docs.blender.org/manual/en/2.81/addons/rigging/rigify.html &#039;&#039;&#039;Rigify documentation&#039;&#039;&#039;] - it&#039;s a plugin for Blender designed to automate a lot of rigging work. The rig described here is generated using Rigify. Take a look if you&#039;re interested and want to learn more, but you don&#039;t have to know Rigify&#039;s documentation to use this rig.&lt;br /&gt;
&lt;br /&gt;
==General workflow of animating for Oni using Rigify==&lt;br /&gt;
The general workflow of making animations using this rig is the following, assuming you want to make a single animation (i.e. you don&#039;t want to make a throw animation):&lt;br /&gt;
&lt;br /&gt;
# Open up a Blender scene containing the rig.&lt;br /&gt;
# Delete either the model in Pose1 or Pose2.&lt;br /&gt;
# (OPTIONAL) Assuming you want to animate a different character, delete the T-posed model.&lt;br /&gt;
## Import your desired character with textures using -noanim.&lt;br /&gt;
# Import the animation you are using as a starting point. For more detailed information on how to import an Oni animation to Blender, see the next header.&lt;br /&gt;
## If you did point 3, apply the textures on the animated model.&lt;br /&gt;
# Using the &#039;&#039;Set Rig Bone Constraint Targets&#039;&#039; option in BlenderOni, set the targets of the rig&#039;s bone constraints to be the body parts of the animation you&#039;ve imported.&lt;br /&gt;
# Using the Pose Matching functionality, constrain the rig to the imported animation (Set the IK-FK sliders on rig limbs to 1, as Pose Matching works only through FK controllers)&lt;br /&gt;
# For each frame that you want to remain in your animation, while having all the bones selected (or the ones you want), either:&lt;br /&gt;
## Press Ctrl+A, select &#039;&#039;Apply Visual Transform&#039;&#039; to Pose and keyframe it,&lt;br /&gt;
## Or use the &#039;&#039;Bone Visual Transformer&#039;&#039; option in BlenderOni to bake frames within a specified frame range.&lt;br /&gt;
# Disable bone constraints on the rig using the &#039;&#039;Bone Constraint Switch&#039;&#039; option in BlenderOni. &lt;br /&gt;
# &#039;&#039;&#039;Make your animation.&#039;&#039;&#039;&lt;br /&gt;
# Once your animation is ready, use the &#039;&#039;Object Visual Transformer&#039;&#039; option in BlenderOni to bake the rig keyframes into the character model.&lt;br /&gt;
# Using the &#039;&#039;Object Constraint Switch&#039;&#039; option in BlenderOni, disable the object constraints on the character model. &#039;&#039;&#039;The character model should now be animated and have the needed rotations and locations.&lt;br /&gt;
# Export the animation as a DAE.&lt;br /&gt;
&lt;br /&gt;
==Importing Oni animations to Blender==&lt;br /&gt;
This header describes how to import Oni animations to Blender.&lt;br /&gt;
&lt;br /&gt;
For detailed explanation of the required OniSplit commands, please refer to the &#039;&#039;&#039;Oni-Blender Tutorial by EdT&#039;&#039;&#039; listed in the &#039;&#039;&#039;Tools and relevant tutorials&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
# Assuming the character you want to animate isn&#039;t in your rig file, then using OniSplit, export any character you want as a DAE (-extract:dae) using -noanim and -blender arguments. &lt;br /&gt;
## As per EdT&#039;s &#039;&#039;&#039;Oni-Blender Tutorial&#039;&#039;&#039;, you should get &amp;lt;mark&amp;gt;&amp;lt;tt&amp;gt;AnimationDaeWriter: custom axis conversion&amp;lt;/tt&amp;gt;&amp;lt;/mark&amp;gt; in OniSplit output if you&#039;ve used the -blender argument. If you didn&#039;t get that on the output, it means something most likely went wrong and you won&#039;t be able to import the model into Blender (or you will be able to import it but it will be wrong).&lt;br /&gt;
## Assuming you wanted a textured model and thus you&#039;ve exported an ONCC, you should now get a &#039;&#039;&#039;DAE file&#039;&#039;&#039; and an &#039;&#039;&#039;&#039;&#039;images&#039;&#039;&#039;&#039;&#039; folder containing the textures for it.&lt;br /&gt;
# Using OniSplit, export the animation you want as an XML (-extract:xml) using -anim-body (lets you specify the character you want) and -blender arguments.&lt;br /&gt;
## You should get &#039;&#039;&#039;one DAE and one XML file for the animation.&#039;&#039;&#039; &lt;br /&gt;
# Open up a Blender scene containing the rig.&lt;br /&gt;
# Delete either the model either in Pose1 or Pose2 collection. &lt;br /&gt;
# Import the animation into Blender (&#039;&#039;&#039;MAKE SURE YOU CHECK THE &#039;&#039;Import Unit&#039;&#039; BOX EACH TIME&#039;&#039;&#039;, otherwise you will import the model with arbitrary units which will break everything and will be basically unadjustable later))&lt;br /&gt;
# Import the -noanim model into Blender (&#039;&#039;&#039;ALSO MAKE SURE YOU CHECK THE &#039;&#039;Import Unit&#039;&#039; BOX&#039;&#039;&#039;)&lt;br /&gt;
# Move the animated model to either Pose1 or Pose2 collection.&lt;br /&gt;
# If you&#039;ve imported the textured model, [[Blender#Lack_of_textures_on_animated_models|apply textures to the animated models and fix the alpha transparency issue]].&lt;br /&gt;
&lt;br /&gt;
==Added functionalities==&lt;br /&gt;
This header describes functionalities added to the rig by geyser that are not normally present in Rigify.&lt;br /&gt;
&lt;br /&gt;
===Pose matching===&lt;br /&gt;
The way we do animations is we almost universally start by copying the first or last frame of the preceeding animation. For this reason, we needed functionality that would allow us to snap the rig to an animated Oni character. The way it works, it that it uses bone constraints in rig controller bones targeting the character model in order to snap the rig to the model. The influence of the bone constraints is controlled through the Z location of Pose1 and Pose2 bones in the Pose Matching layer, which is done through drivers.&lt;br /&gt;
&lt;br /&gt;
To snap the rig to the animation in one of the Pose collections, simply move the appropriate Pose bone above the XY plane while in Pose mode.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pose1 and Pose2 below the XY plane !! Rig snapped to the animation in Pose 1 collection !! Rig snapped to the animation in Pose 2 collection&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Unposed.png|300px|frameless|center]] || [[Image:Pose1.png|300px|frameless|center]] || [[Image:Pose2.png|300px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Wrist snapping===&lt;br /&gt;
Often when using the IK handles for the arms you will find out that most of the time, you will need the hand to have the same rotation as the forearm. Normally this would mean that you would have to rotate the hands all the time, because IK handles are mainly moved around, and rotated later. For this reason, the wrist snapping functionality was implemented - you can simply copy the rotation of the forearm to the hand by pressing the &amp;quot;IK wrist&amp;quot; button.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Both of the hands after just moving them around... !! Effects of using the IK Wrist button&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:IK Wrist Example1.png|500px|frameless|center]] || [[Image:IK Wrist Example2.png|500px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Modding tutorials]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37836</id>
		<title>BlenderOni</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37836"/>
		<updated>2022-05-18T15:24:16Z</updated>

		<summary type="html">&lt;p&gt;Delano762: Added image of the BlenderOni panel&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|style=&amp;quot;float:right&amp;quot;&lt;br /&gt;
|[[Image:BlenderOni.png|thumb|130px|BlenderOni version 1.0.1]]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;BlenderOni&#039;&#039;&#039; is a [[Blender]] add-on intended as an integral companion tool for the [[Using_the_Rigify_animation_rig|Animation rig for Blender]]. It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, the vast majority of the add-on&#039;s options can also be used for general Blender tasks. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BlenderOni can be downloaded [http://mods.oni2.net/node/401 HERE.]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
{|style=&amp;quot;float:right&amp;quot;&lt;br /&gt;
|[[Image:Guido_-_Kon_face_07.jpg|thumb|150px|&#039;&#039;Note to self: no more pizza before bed! Nightmares!&#039;&#039; ]]&lt;br /&gt;
|}&lt;br /&gt;
When the Rigify-Oni rig was first released to the public, it was meant to be used together with a number of scripts stored within the Blender scene containing the rig. However, those scripts were not ideal - they were awkward to use as setting up the appropriate values was possible only by changing the script code.&lt;br /&gt;
&lt;br /&gt;
Those scripts have become obsolete with the introduction of BlenderOni, which is essentially little more than those scripts wrapped into a GUI. The scripts are nonetheless archived [[Blender/Obsolete scripts|HERE]] for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
==Tutorial video==&lt;br /&gt;
BlenderOni has its own tutorial video, with the Options explained in Part 2, and Use cases explained in Part 3.&lt;br /&gt;
&lt;br /&gt;
The video can be accessed [https://www.youtube.com/watch?v=pA_Y8QBCvPI HERE].&lt;br /&gt;
&lt;br /&gt;
==Use cases==&lt;br /&gt;
Since BlenderOni is a companion tool for the Rigify-Oni rig, explanation of its intended usage is in the rig documentation, available [[Using_the_Rigify_animation_rig|HERE]].&lt;br /&gt;
&lt;br /&gt;
==Options==&lt;br /&gt;
===Bake Keyframe Rotation Mode===&lt;br /&gt;
Keyframes the rotation data in the selected rotation mode for every selected object, for every frame in the specified frame range. Usually used for converting rotation data from Euler angles to Quaternions if needed. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Change Rotation Mode===&lt;br /&gt;
Changes the rotation mode of every selected object to the selected rotation mode. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Adjust Throw Target===&lt;br /&gt;
Moves the selected object by the specified offset for every frame in the specified frame range. &lt;br /&gt;
If the &amp;quot;Adjust and rotate throw target&amp;quot; operation is selected, the object will also get rotated by 180 degrees in the frame range. &lt;br /&gt;
If the &amp;quot;Adjust back throw target&amp;quot; operation is selected and the object&#039;s location is not { X , Y } = { 0 , 0 }, it gets moved to { X , Y } = { 0 , 0 }.&lt;br /&gt;
&lt;br /&gt;
Used for adjusting the position of the throw target animation, both for forward (Adjust and rotate throw target) and back (Adjust back throw target) throws. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you are importing an animation from Oni, the X, Y and Z fields are supposed to be taken from the &amp;lt;Position&amp;gt; tag. The position tag has the following order:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;x y z&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
BlenderOni takes them in a different order due to differences in axis orientation:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: x, Y: -z, Z: -y&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So given the following &amp;lt;Position&amp;gt; tag with the following example values:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;1 2 -3&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The arguments in BlenderOni should be as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: 1, Y: 3, Z: -2&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have created a new animation and want to adjust it back to { X , Y } = { 0 , 0 }, then the X and Y arguments will be the inversions of the X and Y location coordinates of the throw target&#039;s pelvis in the first frame of the animation. Z should be set to 0. The new resulting &amp;lt;Position&amp;gt; tag should be created using the order schematic above, with the exception of the height (Blender Z, &amp;lt;Position&amp;gt; y) - this value is mostly taken from other TRAMs and adjusted in a trial-and-error manner until the animation looks okay on most characters. &lt;br /&gt;
&lt;br /&gt;
This is because the height adjustment is one and the same for every character type, regardless of their height - so if you pick the right height, smaller characters will float off the ground and the tallest ones will sink into it, while average height characters should have their feet on the ground.&lt;br /&gt;
&lt;br /&gt;
===Object Constraint Switch===&lt;br /&gt;
Switches object constraints on and off within selected objects. Used to constrain and unconstrain character model objects to the rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Constraint Switch===&lt;br /&gt;
Switches bone constraints on and off within selected armature bones. Used to constrain and unconstrain rig to character model objects. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Object Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected object in the specified frame range. Used as a way to copy animation data from the rig to the character models. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected bone of the armature in the specified frame range. Used as a way to copy animation data from character models to the rig. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Object Constraint Targets===&lt;br /&gt;
Sets the targets of all of the constraints named &amp;quot;Copy Rotation&amp;quot;, and also &amp;quot;Copy Location&amp;quot; in case of pelvis, to the specified object. Used to constrain the selected character model to the specified rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Rig Bone Constraint Targets===&lt;br /&gt;
In the specified rig, sets the target names of predefined bone constraints with names ending in one of the selected suffixes (.001 or .002) to the appropriate Oni character model object name with the specified suffix. Used to constrain rigs to the character models. &#039;&#039;&#039;Can be used in any object interaction mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To explain more clearly: The Rigify-Oni rig has two sets of bone constraints of Copy Location for the torso and torso_pivot bone, and Copy Rotation for all of the remaining bones in the FK and Torso layers. They are responsible for copying  rotation and location data from the targeted character models, with the influence of those constraints being controlled with the corresponding Pose Matching bones (Pose1 for .001 constraints and Pose2 for .002). The character models will always have their body objects named the same way (pelvis, torso, chest, etc.), and because of that, Blender adds suffixes to their names as more characters are imported, starting with &amp;quot;.001&amp;quot; suffix.&lt;br /&gt;
&lt;br /&gt;
Because of this, the way to constrain an instance of the Rigify-Oni rig to the given character model is to set the target names of the .001 or .002 bone constraint targets to the appropriate Oni character model objects with the appropriate suffix. (BlenderOni has the Oni character model object names hardcoded, it only needs their suffix)&lt;br /&gt;
&lt;br /&gt;
Example: You want to constrain rig.001, to the character model with .003 suffix through the rig&#039;s .002 bone constraints. To do that, you need to:&lt;br /&gt;
*Input rig.001 as the target rig name,&lt;br /&gt;
*Select .002 as the Bone constraints&#039; suffix,&lt;br /&gt;
*Input .003 as the Target objects&#039; suffix,&lt;br /&gt;
*Press Set Rig Bone Constraints Targets.&lt;br /&gt;
*Make sure Pose1 bone is below the floor level (Y&amp;lt;0)&lt;br /&gt;
*Make sure Pose2 bone is above the floor level (Y&amp;gt;0.1)&lt;br /&gt;
&lt;br /&gt;
Rig.001 will now be constrained to the Oni character model with .003 suffix.&lt;br /&gt;
&lt;br /&gt;
===Constrain Character Model===&lt;br /&gt;
On the selected Oni character model, creates a set of Copy Location and Copy Rotation constraints targeting a specified rig. Effectively constrains the selected Oni character model to the specified rig. &#039;&#039;&#039;Can be used in any object interaction mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If any of the model objects already contain any constrains, BlenderOni will output an error, and the user should clear all constraints in the selected objects.&lt;br /&gt;
&lt;br /&gt;
[[Category:Completed modding tools]][[Category:Bi-platform modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=File:BlenderOni.png&amp;diff=37835</id>
		<title>File:BlenderOni.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=File:BlenderOni.png&amp;diff=37835"/>
		<updated>2022-05-18T15:19:34Z</updated>

		<summary type="html">&lt;p&gt;Delano762: Delano762 uploaded a new version of File:BlenderOni.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
BlenderOni version 1.0.1&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=File:BlenderOni.png&amp;diff=37834</id>
		<title>File:BlenderOni.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=File:BlenderOni.png&amp;diff=37834"/>
		<updated>2022-05-18T15:18:33Z</updated>

		<summary type="html">&lt;p&gt;Delano762: BlenderOni version 1.0.1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
BlenderOni version 1.0.1&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37833</id>
		<title>BlenderOni</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37833"/>
		<updated>2022-05-18T15:07:41Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Use cases */ Added link to the tutorial video&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|style=&amp;quot;float:right&amp;quot;&lt;br /&gt;
|[[Image:Guido_-_Kon_face_07.jpg|thumb|150px|Note to self: no more pizza before bed! Nightmares! ]]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;BlenderOni&#039;&#039;&#039; is a [[Blender]] add-on intended as an integral companion tool for the [[Using_the_Rigify_animation_rig|Animation rig for Blender]]. It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, the vast majority of the add-on&#039;s options can also be used for general Blender tasks. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BlenderOni can be downloaded [http://mods.oni2.net/node/401 HERE.]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
When the Rigify-Oni rig was first released to the public, it was meant to be used together with a number of scripts stored within the Blender scene containing the rig. However, those scripts were not ideal - they were awkward to use as setting up the appropriate values was possible only by changing the script code.&lt;br /&gt;
&lt;br /&gt;
Those scripts have become obsolete with the introduction of BlenderOni, which is essentially little more than those scripts wrapped into a GUI. The scripts are nonetheless archived [[Blender/Obsolete scripts|HERE]] for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
==Options==&lt;br /&gt;
===Bake Keyframe Rotation Mode===&lt;br /&gt;
Keyframes the rotation data in the selected rotation mode for every selected object, for every frame in the specified frame range. Usually used for converting rotation data from Euler angles to Quaternions if needed. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Change Rotation Mode===&lt;br /&gt;
Changes the rotation mode of every selected object to the selected rotation mode. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Adjust Throw Target===&lt;br /&gt;
Moves the selected object by the specified offset for every frame in the specified frame range. &lt;br /&gt;
If the &amp;quot;Adjust and rotate throw target&amp;quot; operation is selected, the object will also get rotated by 180 degrees in the frame range. &lt;br /&gt;
If the &amp;quot;Adjust back throw target&amp;quot; operation is selected and the object&#039;s location is not { X , Y } = { 0 , 0 }, it gets moved to { X , Y } = { 0 , 0 }.&lt;br /&gt;
&lt;br /&gt;
Used for adjusting the position of the throw target animation, both for forward (Adjust and rotate throw target) and back (Adjust back throw target) throws. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you are importing an animation from Oni, the X, Y and Z fields are supposed to be taken from the &amp;lt;Position&amp;gt; tag. The position tag has the following order:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;x y z&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
BlenderOni takes them in a different order due to differences in axis orientation:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: x, Y: -z, Z: -y&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So given the following &amp;lt;Position&amp;gt; tag with the following example values:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;1 2 -3&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The arguments in BlenderOni should be as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: 1, Y: 3, Z: -2&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have created a new animation and want to adjust it back to { X , Y } = { 0 , 0 }, then the X and Y arguments will be the inversions of the X and Y location coordinates of the throw target&#039;s pelvis in the first frame of the animation. Z should be set to 0. The new resulting &amp;lt;Position&amp;gt; tag should be created using the order schematic above, with the exception of the height (Blender Z, &amp;lt;Position&amp;gt; y) - this value is mostly taken from other TRAMs and adjusted in a trial-and-error manner until the animation looks okay on most characters. &lt;br /&gt;
&lt;br /&gt;
This is because the height adjustment is one and the same for every character type, regardless of their height - so if you pick the right height, smaller characters will float off the ground and the tallest ones will sink into it, while average height characters should have their feet on the ground.&lt;br /&gt;
&lt;br /&gt;
===Object Constraint Switch===&lt;br /&gt;
Switches object constraints on and off within selected objects. Used to constrain and unconstrain character model objects to the rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Constraint Switch===&lt;br /&gt;
Switches bone constraints on and off within selected armature bones. Used to constrain and unconstrain rig to character model objects. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Object Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected object in the specified frame range. Used as a way to copy animation data from the rig to the character models. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected bone of the armature in the specified frame range. Used as a way to copy animation data from character models to the rig. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Object Constraint Targets===&lt;br /&gt;
Sets the targets of all of the constraints named &amp;quot;Copy Rotation&amp;quot;, and also &amp;quot;Copy Location&amp;quot; in case of pelvis, to the specified object. Used to constrain the selected character model to the specified rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Rig Bone Constraint Targets===&lt;br /&gt;
In the specified rig, sets the target names of predefined bone constraints with names ending in one of the selected suffixes (.001 or .002) to the appropriate Oni character model object name with the specified suffix. Used to constrain rigs to the character models. &#039;&#039;&#039;Can be used in any object interaction mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To explain more clearly: The Rigify-Oni rig has two sets of bone constraints of Copy Location for the torso and torso_pivot bone, and Copy Rotation for all of the remaining bones in the FK and Torso layers. They are responsible for copying  rotation and location data from the targeted character models, with the influence of those constraints being controlled with the corresponding Pose Matching bones (Pose1 for .001 constraints and Pose2 for .002). The character models will always have their body objects named the same way (pelvis, torso, chest, etc.), and because of that, Blender adds suffixes to their names as more characters are imported, starting with &amp;quot;.001&amp;quot; suffix.&lt;br /&gt;
&lt;br /&gt;
Because of this, the way to constrain an instance of the Rigify-Oni rig to the given character model is to set the target names of the .001 or .002 bone constraint targets to the appropriate Oni character model objects with the appropriate suffix. (BlenderOni has the Oni character model object names hardcoded, it only needs their suffix)&lt;br /&gt;
&lt;br /&gt;
Example: You want to constrain rig.001, to the character model with .003 suffix through the rig&#039;s .002 bone constraints. To do that, you need to:&lt;br /&gt;
*Input rig.001 as the target rig name,&lt;br /&gt;
*Select .002 as the Bone constraints&#039; suffix,&lt;br /&gt;
*Input .003 as the Target objects&#039; suffix,&lt;br /&gt;
*Press Set Rig Bone Constraints Targets.&lt;br /&gt;
*Make sure Pose1 bone is below the floor level (Y&amp;lt;0)&lt;br /&gt;
*Make sure Pose2 bone is above the floor level (Y&amp;gt;0.1)&lt;br /&gt;
&lt;br /&gt;
Rig.001 will now be constrained to the Oni character model with .003 suffix.&lt;br /&gt;
&lt;br /&gt;
===Constrain Character Model===&lt;br /&gt;
On the selected Oni character model, creates a set of Copy Location and Copy Rotation constraints targeting a specified rig. Effectively constrains the selected Oni character model to the specified rig. &#039;&#039;&#039;Can be used in any object interaction mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If any of the model objects already contain any constrains, BlenderOni will output an error, and the user should clear all constraints in the selected objects.&lt;br /&gt;
&lt;br /&gt;
==Use cases==&lt;br /&gt;
Since BlenderOni is a companion tool for the Rigify-Oni rig, explanation of its intended usage is in the rig documentation, available [[Using_the_Rigify_animation_rig|HERE]].&lt;br /&gt;
&lt;br /&gt;
===Tutorial video===&lt;br /&gt;
BlenderOni has its own tutorial video, with the Options header explained in Part 2, and Use cases explained in Part 3.&lt;br /&gt;
&lt;br /&gt;
The video can be accessed [https://www.youtube.com/watch?v=pA_Y8QBCvPI HERE].&lt;br /&gt;
&lt;br /&gt;
[[Category:Completed modding tools]][[Category:Bi-platform modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37832</id>
		<title>BlenderOni</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37832"/>
		<updated>2022-05-18T15:03:21Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Adjust Throw Target */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|style=&amp;quot;float:right&amp;quot;&lt;br /&gt;
|[[Image:Guido_-_Kon_face_07.jpg|thumb|150px|Note to self: no more pizza before bed! Nightmares! ]]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;BlenderOni&#039;&#039;&#039; is a [[Blender]] add-on intended as an integral companion tool for the [[Using_the_Rigify_animation_rig|Animation rig for Blender]]. It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, the vast majority of the add-on&#039;s options can also be used for general Blender tasks. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BlenderOni can be downloaded [http://mods.oni2.net/node/401 HERE.]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
When the Rigify-Oni rig was first released to the public, it was meant to be used together with a number of scripts stored within the Blender scene containing the rig. However, those scripts were not ideal - they were awkward to use as setting up the appropriate values was possible only by changing the script code.&lt;br /&gt;
&lt;br /&gt;
Those scripts have become obsolete with the introduction of BlenderOni, which is essentially little more than those scripts wrapped into a GUI. The scripts are nonetheless archived [[Blender/Obsolete scripts|HERE]] for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
==Options==&lt;br /&gt;
===Bake Keyframe Rotation Mode===&lt;br /&gt;
Keyframes the rotation data in the selected rotation mode for every selected object, for every frame in the specified frame range. Usually used for converting rotation data from Euler angles to Quaternions if needed. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Change Rotation Mode===&lt;br /&gt;
Changes the rotation mode of every selected object to the selected rotation mode. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Adjust Throw Target===&lt;br /&gt;
Moves the selected object by the specified offset for every frame in the specified frame range. &lt;br /&gt;
If the &amp;quot;Adjust and rotate throw target&amp;quot; operation is selected, the object will also get rotated by 180 degrees in the frame range. &lt;br /&gt;
If the &amp;quot;Adjust back throw target&amp;quot; operation is selected and the object&#039;s location is not { X , Y } = { 0 , 0 }, it gets moved to { X , Y } = { 0 , 0 }.&lt;br /&gt;
&lt;br /&gt;
Used for adjusting the position of the throw target animation, both for forward (Adjust and rotate throw target) and back (Adjust back throw target) throws. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you are importing an animation from Oni, the X, Y and Z fields are supposed to be taken from the &amp;lt;Position&amp;gt; tag. The position tag has the following order:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;x y z&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
BlenderOni takes them in a different order due to differences in axis orientation:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: x, Y: -z, Z: -y&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So given the following &amp;lt;Position&amp;gt; tag with the following example values:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;1 2 -3&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The arguments in BlenderOni should be as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: 1, Y: 3, Z: -2&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have created a new animation and want to adjust it back to { X , Y } = { 0 , 0 }, then the X and Y arguments will be the inversions of the X and Y location coordinates of the throw target&#039;s pelvis in the first frame of the animation. Z should be set to 0. The new resulting &amp;lt;Position&amp;gt; tag should be created using the order schematic above, with the exception of the height (Blender Z, &amp;lt;Position&amp;gt; y) - this value is mostly taken from other TRAMs and adjusted in a trial-and-error manner until the animation looks okay on most characters. &lt;br /&gt;
&lt;br /&gt;
This is because the height adjustment is one and the same for every character type, regardless of their height - so if you pick the right height, smaller characters will float off the ground and the tallest ones will sink into it, while average height characters should have their feet on the ground.&lt;br /&gt;
&lt;br /&gt;
===Object Constraint Switch===&lt;br /&gt;
Switches object constraints on and off within selected objects. Used to constrain and unconstrain character model objects to the rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Constraint Switch===&lt;br /&gt;
Switches bone constraints on and off within selected armature bones. Used to constrain and unconstrain rig to character model objects. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Object Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected object in the specified frame range. Used as a way to copy animation data from the rig to the character models. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected bone of the armature in the specified frame range. Used as a way to copy animation data from character models to the rig. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Object Constraint Targets===&lt;br /&gt;
Sets the targets of all of the constraints named &amp;quot;Copy Rotation&amp;quot;, and also &amp;quot;Copy Location&amp;quot; in case of pelvis, to the specified object. Used to constrain the selected character model to the specified rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Rig Bone Constraint Targets===&lt;br /&gt;
In the specified rig, sets the target names of predefined bone constraints with names ending in one of the selected suffixes (.001 or .002) to the appropriate Oni character model object name with the specified suffix. Used to constrain rigs to the character models. &#039;&#039;&#039;Can be used in any object interaction mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To explain more clearly: The Rigify-Oni rig has two sets of bone constraints of Copy Location for the torso and torso_pivot bone, and Copy Rotation for all of the remaining bones in the FK and Torso layers. They are responsible for copying  rotation and location data from the targeted character models, with the influence of those constraints being controlled with the corresponding Pose Matching bones (Pose1 for .001 constraints and Pose2 for .002). The character models will always have their body objects named the same way (pelvis, torso, chest, etc.), and because of that, Blender adds suffixes to their names as more characters are imported, starting with &amp;quot;.001&amp;quot; suffix.&lt;br /&gt;
&lt;br /&gt;
Because of this, the way to constrain an instance of the Rigify-Oni rig to the given character model is to set the target names of the .001 or .002 bone constraint targets to the appropriate Oni character model objects with the appropriate suffix. (BlenderOni has the Oni character model object names hardcoded, it only needs their suffix)&lt;br /&gt;
&lt;br /&gt;
Example: You want to constrain rig.001, to the character model with .003 suffix through the rig&#039;s .002 bone constraints. To do that, you need to:&lt;br /&gt;
*Input rig.001 as the target rig name,&lt;br /&gt;
*Select .002 as the Bone constraints&#039; suffix,&lt;br /&gt;
*Input .003 as the Target objects&#039; suffix,&lt;br /&gt;
*Press Set Rig Bone Constraints Targets.&lt;br /&gt;
*Make sure Pose1 bone is below the floor level (Y&amp;lt;0)&lt;br /&gt;
*Make sure Pose2 bone is above the floor level (Y&amp;gt;0.1)&lt;br /&gt;
&lt;br /&gt;
Rig.001 will now be constrained to the Oni character model with .003 suffix.&lt;br /&gt;
&lt;br /&gt;
===Constrain Character Model===&lt;br /&gt;
On the selected Oni character model, creates a set of Copy Location and Copy Rotation constraints targeting a specified rig. Effectively constrains the selected Oni character model to the specified rig. &#039;&#039;&#039;Can be used in any object interaction mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If any of the model objects already contain any constrains, BlenderOni will output an error, and the user should clear all constraints in the selected objects.&lt;br /&gt;
&lt;br /&gt;
==Use cases==&lt;br /&gt;
Since BlenderOni is a companion tool for the Rigify-Oni rig, explanation of its intended usage is in the rig documentation, available [[Using_the_Rigify_animation_rig|HERE]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Completed modding tools]][[Category:Bi-platform modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37831</id>
		<title>BlenderOni</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37831"/>
		<updated>2022-05-18T15:02:51Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Options */ Added intended object interaction modes.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|style=&amp;quot;float:right&amp;quot;&lt;br /&gt;
|[[Image:Guido_-_Kon_face_07.jpg|thumb|150px|Note to self: no more pizza before bed! Nightmares! ]]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;BlenderOni&#039;&#039;&#039; is a [[Blender]] add-on intended as an integral companion tool for the [[Using_the_Rigify_animation_rig|Animation rig for Blender]]. It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, the vast majority of the add-on&#039;s options can also be used for general Blender tasks. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BlenderOni can be downloaded [http://mods.oni2.net/node/401 HERE.]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
When the Rigify-Oni rig was first released to the public, it was meant to be used together with a number of scripts stored within the Blender scene containing the rig. However, those scripts were not ideal - they were awkward to use as setting up the appropriate values was possible only by changing the script code.&lt;br /&gt;
&lt;br /&gt;
Those scripts have become obsolete with the introduction of BlenderOni, which is essentially little more than those scripts wrapped into a GUI. The scripts are nonetheless archived [[Blender/Obsolete scripts|HERE]] for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
==Options==&lt;br /&gt;
===Bake Keyframe Rotation Mode===&lt;br /&gt;
Keyframes the rotation data in the selected rotation mode for every selected object, for every frame in the specified frame range. Usually used for converting rotation data from Euler angles to Quaternions if needed. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Change Rotation Mode===&lt;br /&gt;
Changes the rotation mode of every selected object to the selected rotation mode. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Adjust Throw Target===&lt;br /&gt;
Moves the selected object by the specified offset for every frame in the specified frame range. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
If the &amp;quot;Adjust and rotate throw target&amp;quot; operation is selected, the object will also get rotated by 180 degrees in the frame range. &lt;br /&gt;
If the &amp;quot;Adjust back throw target&amp;quot; operation is selected and the object&#039;s location is not { X , Y } = { 0 , 0 }, it gets moved to { X , Y } = { 0 , 0 }.&lt;br /&gt;
&lt;br /&gt;
Used for adjusting the position of the throw target animation, both for forward (Adjust and rotate throw target) and back (Adjust back throw target) throws.&lt;br /&gt;
&lt;br /&gt;
If you are importing an animation from Oni, the X, Y and Z fields are supposed to be taken from the &amp;lt;Position&amp;gt; tag. The position tag has the following order:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;x y z&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
BlenderOni takes them in a different order due to differences in axis orientation:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: x, Y: -z, Z: -y&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So given the following &amp;lt;Position&amp;gt; tag with the following example values:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;1 2 -3&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The arguments in BlenderOni should be as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: 1, Y: 3, Z: -2&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have created a new animation and want to adjust it back to { X , Y } = { 0 , 0 }, then the X and Y arguments will be the inversions of the X and Y location coordinates of the throw target&#039;s pelvis in the first frame of the animation. Z should be set to 0. The new resulting &amp;lt;Position&amp;gt; tag should be created using the order schematic above, with the exception of the height (Blender Z, &amp;lt;Position&amp;gt; y) - this value is mostly taken from other TRAMs and adjusted in a trial-and-error manner until the animation looks okay on most characters. &lt;br /&gt;
&lt;br /&gt;
This is because the height adjustment is one and the same for every character type, regardless of their height - so if you pick the right height, smaller characters will float off the ground and the tallest ones will sink into it, while average height characters should have their feet on the ground.&lt;br /&gt;
&lt;br /&gt;
===Object Constraint Switch===&lt;br /&gt;
Switches object constraints on and off within selected objects. Used to constrain and unconstrain character model objects to the rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Constraint Switch===&lt;br /&gt;
Switches bone constraints on and off within selected armature bones. Used to constrain and unconstrain rig to character model objects. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Object Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected object in the specified frame range. Used as a way to copy animation data from the rig to the character models. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected bone of the armature in the specified frame range. Used as a way to copy animation data from character models to the rig. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Object Constraint Targets===&lt;br /&gt;
Sets the targets of all of the constraints named &amp;quot;Copy Rotation&amp;quot;, and also &amp;quot;Copy Location&amp;quot; in case of pelvis, to the specified object. Used to constrain the selected character model to the specified rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Rig Bone Constraint Targets===&lt;br /&gt;
In the specified rig, sets the target names of predefined bone constraints with names ending in one of the selected suffixes (.001 or .002) to the appropriate Oni character model object name with the specified suffix. Used to constrain rigs to the character models. &#039;&#039;&#039;Can be used in any object interaction mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To explain more clearly: The Rigify-Oni rig has two sets of bone constraints of Copy Location for the torso and torso_pivot bone, and Copy Rotation for all of the remaining bones in the FK and Torso layers. They are responsible for copying  rotation and location data from the targeted character models, with the influence of those constraints being controlled with the corresponding Pose Matching bones (Pose1 for .001 constraints and Pose2 for .002). The character models will always have their body objects named the same way (pelvis, torso, chest, etc.), and because of that, Blender adds suffixes to their names as more characters are imported, starting with &amp;quot;.001&amp;quot; suffix.&lt;br /&gt;
&lt;br /&gt;
Because of this, the way to constrain an instance of the Rigify-Oni rig to the given character model is to set the target names of the .001 or .002 bone constraint targets to the appropriate Oni character model objects with the appropriate suffix. (BlenderOni has the Oni character model object names hardcoded, it only needs their suffix)&lt;br /&gt;
&lt;br /&gt;
Example: You want to constrain rig.001, to the character model with .003 suffix through the rig&#039;s .002 bone constraints. To do that, you need to:&lt;br /&gt;
*Input rig.001 as the target rig name,&lt;br /&gt;
*Select .002 as the Bone constraints&#039; suffix,&lt;br /&gt;
*Input .003 as the Target objects&#039; suffix,&lt;br /&gt;
*Press Set Rig Bone Constraints Targets.&lt;br /&gt;
*Make sure Pose1 bone is below the floor level (Y&amp;lt;0)&lt;br /&gt;
*Make sure Pose2 bone is above the floor level (Y&amp;gt;0.1)&lt;br /&gt;
&lt;br /&gt;
Rig.001 will now be constrained to the Oni character model with .003 suffix.&lt;br /&gt;
&lt;br /&gt;
===Constrain Character Model===&lt;br /&gt;
On the selected Oni character model, creates a set of Copy Location and Copy Rotation constraints targeting a specified rig. Effectively constrains the selected Oni character model to the specified rig. &#039;&#039;&#039;Can be used in any object interaction mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If any of the model objects already contain any constrains, BlenderOni will output an error, and the user should clear all constraints in the selected objects.&lt;br /&gt;
&lt;br /&gt;
==Use cases==&lt;br /&gt;
Since BlenderOni is a companion tool for the Rigify-Oni rig, explanation of its intended usage is in the rig documentation, available [[Using_the_Rigify_animation_rig|HERE]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Completed modding tools]][[Category:Bi-platform modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37830</id>
		<title>BlenderOni</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37830"/>
		<updated>2022-05-18T15:01:46Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Constrain Character Model */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|style=&amp;quot;float:right&amp;quot;&lt;br /&gt;
|[[Image:Guido_-_Kon_face_07.jpg|thumb|150px|Note to self: no more pizza before bed! Nightmares! ]]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;BlenderOni&#039;&#039;&#039; is a [[Blender]] add-on intended as an integral companion tool for the [[Using_the_Rigify_animation_rig|Animation rig for Blender]]. It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, the vast majority of the add-on&#039;s options can also be used for general Blender tasks. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BlenderOni can be downloaded [http://mods.oni2.net/node/401 HERE.]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
When the Rigify-Oni rig was first released to the public, it was meant to be used together with a number of scripts stored within the Blender scene containing the rig. However, those scripts were not ideal - they were awkward to use as setting up the appropriate values was possible only by changing the script code.&lt;br /&gt;
&lt;br /&gt;
Those scripts have become obsolete with the introduction of BlenderOni, which is essentially little more than those scripts wrapped into a GUI. The scripts are nonetheless archived [[Blender/Obsolete scripts|HERE]] for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
==Options==&lt;br /&gt;
===Bake Keyframe Rotation Mode===&lt;br /&gt;
Keyframes the rotation data in the selected rotation mode for every selected object, for every frame in the specified frame range. Usually used for converting rotation data from Euler angles to Quaternions if needed.&lt;br /&gt;
&lt;br /&gt;
===Change Rotation Mode===&lt;br /&gt;
Changes the rotation mode of every selected object to the selected rotation mode.&lt;br /&gt;
&lt;br /&gt;
===Adjust Throw Target===&lt;br /&gt;
Moves the selected object by the specified offset for every frame in the specified frame range. &lt;br /&gt;
If the &amp;quot;Adjust and rotate throw target&amp;quot; operation is selected, the object will also get rotated by 180 degrees in the frame range. &lt;br /&gt;
If the &amp;quot;Adjust back throw target&amp;quot; operation is selected and the object&#039;s location is not { X , Y } = { 0 , 0 }, it gets moved to { X , Y } = { 0 , 0 }.&lt;br /&gt;
&lt;br /&gt;
Used for adjusting the position of the throw target animation, both for forward (Adjust and rotate throw target) and back (Adjust back throw target) throws.&lt;br /&gt;
&lt;br /&gt;
If you are importing an animation from Oni, the X, Y and Z fields are supposed to be taken from the &amp;lt;Position&amp;gt; tag. The position tag has the following order:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;x y z&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
BlenderOni takes them in a different order due to differences in axis orientation:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: x, Y: -z, Z: -y&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So given the following &amp;lt;Position&amp;gt; tag with the following example values:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;1 2 -3&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The arguments in BlenderOni should be as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: 1, Y: 3, Z: -2&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have created a new animation and want to adjust it back to { X , Y } = { 0 , 0 }, then the X and Y arguments will be the inversions of the X and Y location coordinates of the throw target&#039;s pelvis in the first frame of the animation. Z should be set to 0. The new resulting &amp;lt;Position&amp;gt; tag should be created using the order schematic above, with the exception of the height (Blender Z, &amp;lt;Position&amp;gt; y) - this value is mostly taken from other TRAMs and adjusted in a trial-and-error manner until the animation looks okay on most characters. &lt;br /&gt;
&lt;br /&gt;
This is because the height adjustment is one and the same for every character type, regardless of their height - so if you pick the right height, smaller characters will float off the ground and the tallest ones will sink into it, while average height characters should have their feet on the ground.&lt;br /&gt;
&lt;br /&gt;
===Object Constraint Switch===&lt;br /&gt;
Switches object constraints on and off within selected objects. Used to constrain and unconstrain character model objects to the rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Constraint Switch===&lt;br /&gt;
Switches bone constraints on and off within selected armature bones. Used to constrain and unconstrain rig to character model objects. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Object Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected object in the specified frame range. Used as a way to copy animation data from the rig to the character models. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected bone of the armature in the specified frame range. Used as a way to copy animation data from character models to the rig. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Object Constraint Targets===&lt;br /&gt;
Sets the targets of all of the constraints named &amp;quot;Copy Rotation&amp;quot;, and also &amp;quot;Copy Location&amp;quot; in case of pelvis, to the specified object. Used to constrain the selected character model to the specified rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Rig Bone Constraint Targets===&lt;br /&gt;
In the specified rig, sets the target names of predefined bone constraints with names ending in one of the selected suffixes (.001 or .002) to the appropriate Oni character model object name with the specified suffix. Used to constrain rigs to the character models. &#039;&#039;&#039;Can be used in any object interaction mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To explain more clearly: The Rigify-Oni rig has two sets of bone constraints of Copy Location for the torso and torso_pivot bone, and Copy Rotation for all of the remaining bones in the FK and Torso layers. They are responsible for copying  rotation and location data from the targeted character models, with the influence of those constraints being controlled with the corresponding Pose Matching bones (Pose1 for .001 constraints and Pose2 for .002). The character models will always have their body objects named the same way (pelvis, torso, chest, etc.), and because of that, Blender adds suffixes to their names as more characters are imported, starting with &amp;quot;.001&amp;quot; suffix.&lt;br /&gt;
&lt;br /&gt;
Because of this, the way to constrain an instance of the Rigify-Oni rig to the given character model is to set the target names of the .001 or .002 bone constraint targets to the appropriate Oni character model objects with the appropriate suffix. (BlenderOni has the Oni character model object names hardcoded, it only needs their suffix)&lt;br /&gt;
&lt;br /&gt;
Example: You want to constrain rig.001, to the character model with .003 suffix through the rig&#039;s .002 bone constraints. To do that, you need to:&lt;br /&gt;
*Input rig.001 as the target rig name,&lt;br /&gt;
*Select .002 as the Bone constraints&#039; suffix,&lt;br /&gt;
*Input .003 as the Target objects&#039; suffix,&lt;br /&gt;
*Press Set Rig Bone Constraints Targets.&lt;br /&gt;
*Make sure Pose1 bone is below the floor level (Y&amp;lt;0)&lt;br /&gt;
*Make sure Pose2 bone is above the floor level (Y&amp;gt;0.1)&lt;br /&gt;
&lt;br /&gt;
Rig.001 will now be constrained to the Oni character model with .003 suffix.&lt;br /&gt;
&lt;br /&gt;
===Constrain Character Model===&lt;br /&gt;
On the selected Oni character model, creates a set of Copy Location and Copy Rotation constraints targeting a specified rig. Effectively constrains the selected Oni character model to the specified rig. &#039;&#039;&#039;Can be used in any object interaction mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If any of the model objects already contain any constrains, BlenderOni will output an error, and the user should clear all constraints in the selected objects.&lt;br /&gt;
&lt;br /&gt;
==Use cases==&lt;br /&gt;
Since BlenderOni is a companion tool for the Rigify-Oni rig, explanation of its intended usage is in the rig documentation, available [[Using_the_Rigify_animation_rig|HERE]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Completed modding tools]][[Category:Bi-platform modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37829</id>
		<title>BlenderOni</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37829"/>
		<updated>2022-05-18T15:01:21Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Constrain Character Model */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|style=&amp;quot;float:right&amp;quot;&lt;br /&gt;
|[[Image:Guido_-_Kon_face_07.jpg|thumb|150px|Note to self: no more pizza before bed! Nightmares! ]]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;BlenderOni&#039;&#039;&#039; is a [[Blender]] add-on intended as an integral companion tool for the [[Using_the_Rigify_animation_rig|Animation rig for Blender]]. It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, the vast majority of the add-on&#039;s options can also be used for general Blender tasks. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BlenderOni can be downloaded [http://mods.oni2.net/node/401 HERE.]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
When the Rigify-Oni rig was first released to the public, it was meant to be used together with a number of scripts stored within the Blender scene containing the rig. However, those scripts were not ideal - they were awkward to use as setting up the appropriate values was possible only by changing the script code.&lt;br /&gt;
&lt;br /&gt;
Those scripts have become obsolete with the introduction of BlenderOni, which is essentially little more than those scripts wrapped into a GUI. The scripts are nonetheless archived [[Blender/Obsolete scripts|HERE]] for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
==Options==&lt;br /&gt;
===Bake Keyframe Rotation Mode===&lt;br /&gt;
Keyframes the rotation data in the selected rotation mode for every selected object, for every frame in the specified frame range. Usually used for converting rotation data from Euler angles to Quaternions if needed.&lt;br /&gt;
&lt;br /&gt;
===Change Rotation Mode===&lt;br /&gt;
Changes the rotation mode of every selected object to the selected rotation mode.&lt;br /&gt;
&lt;br /&gt;
===Adjust Throw Target===&lt;br /&gt;
Moves the selected object by the specified offset for every frame in the specified frame range. &lt;br /&gt;
If the &amp;quot;Adjust and rotate throw target&amp;quot; operation is selected, the object will also get rotated by 180 degrees in the frame range. &lt;br /&gt;
If the &amp;quot;Adjust back throw target&amp;quot; operation is selected and the object&#039;s location is not { X , Y } = { 0 , 0 }, it gets moved to { X , Y } = { 0 , 0 }.&lt;br /&gt;
&lt;br /&gt;
Used for adjusting the position of the throw target animation, both for forward (Adjust and rotate throw target) and back (Adjust back throw target) throws.&lt;br /&gt;
&lt;br /&gt;
If you are importing an animation from Oni, the X, Y and Z fields are supposed to be taken from the &amp;lt;Position&amp;gt; tag. The position tag has the following order:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;x y z&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
BlenderOni takes them in a different order due to differences in axis orientation:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: x, Y: -z, Z: -y&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So given the following &amp;lt;Position&amp;gt; tag with the following example values:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;1 2 -3&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The arguments in BlenderOni should be as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: 1, Y: 3, Z: -2&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have created a new animation and want to adjust it back to { X , Y } = { 0 , 0 }, then the X and Y arguments will be the inversions of the X and Y location coordinates of the throw target&#039;s pelvis in the first frame of the animation. Z should be set to 0. The new resulting &amp;lt;Position&amp;gt; tag should be created using the order schematic above, with the exception of the height (Blender Z, &amp;lt;Position&amp;gt; y) - this value is mostly taken from other TRAMs and adjusted in a trial-and-error manner until the animation looks okay on most characters. &lt;br /&gt;
&lt;br /&gt;
This is because the height adjustment is one and the same for every character type, regardless of their height - so if you pick the right height, smaller characters will float off the ground and the tallest ones will sink into it, while average height characters should have their feet on the ground.&lt;br /&gt;
&lt;br /&gt;
===Object Constraint Switch===&lt;br /&gt;
Switches object constraints on and off within selected objects. Used to constrain and unconstrain character model objects to the rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Constraint Switch===&lt;br /&gt;
Switches bone constraints on and off within selected armature bones. Used to constrain and unconstrain rig to character model objects. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Object Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected object in the specified frame range. Used as a way to copy animation data from the rig to the character models. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected bone of the armature in the specified frame range. Used as a way to copy animation data from character models to the rig. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Object Constraint Targets===&lt;br /&gt;
Sets the targets of all of the constraints named &amp;quot;Copy Rotation&amp;quot;, and also &amp;quot;Copy Location&amp;quot; in case of pelvis, to the specified object. Used to constrain the selected character model to the specified rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Rig Bone Constraint Targets===&lt;br /&gt;
In the specified rig, sets the target names of predefined bone constraints with names ending in one of the selected suffixes (.001 or .002) to the appropriate Oni character model object name with the specified suffix. Used to constrain rigs to the character models. &#039;&#039;&#039;Can be used in any object interaction mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To explain more clearly: The Rigify-Oni rig has two sets of bone constraints of Copy Location for the torso and torso_pivot bone, and Copy Rotation for all of the remaining bones in the FK and Torso layers. They are responsible for copying  rotation and location data from the targeted character models, with the influence of those constraints being controlled with the corresponding Pose Matching bones (Pose1 for .001 constraints and Pose2 for .002). The character models will always have their body objects named the same way (pelvis, torso, chest, etc.), and because of that, Blender adds suffixes to their names as more characters are imported, starting with &amp;quot;.001&amp;quot; suffix.&lt;br /&gt;
&lt;br /&gt;
Because of this, the way to constrain an instance of the Rigify-Oni rig to the given character model is to set the target names of the .001 or .002 bone constraint targets to the appropriate Oni character model objects with the appropriate suffix. (BlenderOni has the Oni character model object names hardcoded, it only needs their suffix)&lt;br /&gt;
&lt;br /&gt;
Example: You want to constrain rig.001, to the character model with .003 suffix through the rig&#039;s .002 bone constraints. To do that, you need to:&lt;br /&gt;
*Input rig.001 as the target rig name,&lt;br /&gt;
*Select .002 as the Bone constraints&#039; suffix,&lt;br /&gt;
*Input .003 as the Target objects&#039; suffix,&lt;br /&gt;
*Press Set Rig Bone Constraints Targets.&lt;br /&gt;
*Make sure Pose1 bone is below the floor level (Y&amp;lt;0)&lt;br /&gt;
*Make sure Pose2 bone is above the floor level (Y&amp;gt;0.1)&lt;br /&gt;
&lt;br /&gt;
Rig.001 will now be constrained to the Oni character model with .003 suffix.&lt;br /&gt;
&lt;br /&gt;
===Constrain Character Model===&lt;br /&gt;
On the selected Oni character model, creates a set of Copy Location and Copy Rotation constraints targeting a specified rig. Effectively constrains the selected Oni character model to the specified rig. &#039;&#039;&#039;Can be used in any Object Interaction Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If any of the model objects already contain any constrains, BlenderOni will output an error, and the user should clear all constraints in the selected objects.&lt;br /&gt;
&lt;br /&gt;
==Use cases==&lt;br /&gt;
Since BlenderOni is a companion tool for the Rigify-Oni rig, explanation of its intended usage is in the rig documentation, available [[Using_the_Rigify_animation_rig|HERE]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Completed modding tools]][[Category:Bi-platform modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37828</id>
		<title>BlenderOni</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37828"/>
		<updated>2022-05-18T14:58:09Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Use cases */ Link to rig documentation.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|style=&amp;quot;float:right&amp;quot;&lt;br /&gt;
|[[Image:Guido_-_Kon_face_07.jpg|thumb|150px|Note to self: no more pizza before bed! Nightmares! ]]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;BlenderOni&#039;&#039;&#039; is a [[Blender]] add-on intended as an integral companion tool for the [[Using_the_Rigify_animation_rig|Animation rig for Blender]]. It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, the vast majority of the add-on&#039;s options can also be used for general Blender tasks. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BlenderOni can be downloaded [http://mods.oni2.net/node/401 HERE.]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
When the Rigify-Oni rig was first released to the public, it was meant to be used together with a number of scripts stored within the Blender scene containing the rig. However, those scripts were not ideal - they were awkward to use as setting up the appropriate values was possible only by changing the script code.&lt;br /&gt;
&lt;br /&gt;
Those scripts have become obsolete with the introduction of BlenderOni, which is essentially little more than those scripts wrapped into a GUI. The scripts are nonetheless archived [[Blender/Obsolete scripts|HERE]] for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
==Options==&lt;br /&gt;
===Bake Keyframe Rotation Mode===&lt;br /&gt;
Keyframes the rotation data in the selected rotation mode for every selected object, for every frame in the specified frame range. Usually used for converting rotation data from Euler angles to Quaternions if needed.&lt;br /&gt;
&lt;br /&gt;
===Change Rotation Mode===&lt;br /&gt;
Changes the rotation mode of every selected object to the selected rotation mode.&lt;br /&gt;
&lt;br /&gt;
===Adjust Throw Target===&lt;br /&gt;
Moves the selected object by the specified offset for every frame in the specified frame range. &lt;br /&gt;
If the &amp;quot;Adjust and rotate throw target&amp;quot; operation is selected, the object will also get rotated by 180 degrees in the frame range. &lt;br /&gt;
If the &amp;quot;Adjust back throw target&amp;quot; operation is selected and the object&#039;s location is not { X , Y } = { 0 , 0 }, it gets moved to { X , Y } = { 0 , 0 }.&lt;br /&gt;
&lt;br /&gt;
Used for adjusting the position of the throw target animation, both for forward (Adjust and rotate throw target) and back (Adjust back throw target) throws.&lt;br /&gt;
&lt;br /&gt;
If you are importing an animation from Oni, the X, Y and Z fields are supposed to be taken from the &amp;lt;Position&amp;gt; tag. The position tag has the following order:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;x y z&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
BlenderOni takes them in a different order due to differences in axis orientation:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: x, Y: -z, Z: -y&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So given the following &amp;lt;Position&amp;gt; tag with the following example values:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;1 2 -3&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The arguments in BlenderOni should be as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: 1, Y: 3, Z: -2&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have created a new animation and want to adjust it back to { X , Y } = { 0 , 0 }, then the X and Y arguments will be the inversions of the X and Y location coordinates of the throw target&#039;s pelvis in the first frame of the animation. Z should be set to 0. The new resulting &amp;lt;Position&amp;gt; tag should be created using the order schematic above, with the exception of the height (Blender Z, &amp;lt;Position&amp;gt; y) - this value is mostly taken from other TRAMs and adjusted in a trial-and-error manner until the animation looks okay on most characters. &lt;br /&gt;
&lt;br /&gt;
This is because the height adjustment is one and the same for every character type, regardless of their height - so if you pick the right height, smaller characters will float off the ground and the tallest ones will sink into it, while average height characters should have their feet on the ground.&lt;br /&gt;
&lt;br /&gt;
===Object Constraint Switch===&lt;br /&gt;
Switches object constraints on and off within selected objects. Used to constrain and unconstrain character model objects to the rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Constraint Switch===&lt;br /&gt;
Switches bone constraints on and off within selected armature bones. Used to constrain and unconstrain rig to character model objects. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Object Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected object in the specified frame range. Used as a way to copy animation data from the rig to the character models. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected bone of the armature in the specified frame range. Used as a way to copy animation data from character models to the rig. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Object Constraint Targets===&lt;br /&gt;
Sets the targets of all of the constraints named &amp;quot;Copy Rotation&amp;quot;, and also &amp;quot;Copy Location&amp;quot; in case of pelvis, to the specified object. Used to constrain the selected character model to the specified rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Rig Bone Constraint Targets===&lt;br /&gt;
In the specified rig, sets the target names of predefined bone constraints with names ending in one of the selected suffixes (.001 or .002) to the appropriate Oni character model object name with the specified suffix. Used to constrain rigs to the character models. &#039;&#039;&#039;Can be used in any object interaction mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To explain more clearly: The Rigify-Oni rig has two sets of bone constraints of Copy Location for the torso and torso_pivot bone, and Copy Rotation for all of the remaining bones in the FK and Torso layers. They are responsible for copying  rotation and location data from the targeted character models, with the influence of those constraints being controlled with the corresponding Pose Matching bones (Pose1 for .001 constraints and Pose2 for .002). The character models will always have their body objects named the same way (pelvis, torso, chest, etc.), and because of that, Blender adds suffixes to their names as more characters are imported, starting with &amp;quot;.001&amp;quot; suffix.&lt;br /&gt;
&lt;br /&gt;
Because of this, the way to constrain an instance of the Rigify-Oni rig to the given character model is to set the target names of the .001 or .002 bone constraint targets to the appropriate Oni character model objects with the appropriate suffix. (BlenderOni has the Oni character model object names hardcoded, it only needs their suffix)&lt;br /&gt;
&lt;br /&gt;
Example: You want to constrain rig.001, to the character model with .003 suffix through the rig&#039;s .002 bone constraints. To do that, you need to:&lt;br /&gt;
*Input rig.001 as the target rig name,&lt;br /&gt;
*Select .002 as the Bone constraints&#039; suffix,&lt;br /&gt;
*Input .003 as the Target objects&#039; suffix,&lt;br /&gt;
*Press Set Rig Bone Constraints Targets.&lt;br /&gt;
*Make sure Pose1 bone is below the floor level (Y&amp;lt;0)&lt;br /&gt;
*Make sure Pose2 bone is above the floor level (Y&amp;gt;0.1)&lt;br /&gt;
&lt;br /&gt;
Rig.001 will now be constrained to the Oni character model with .003 suffix.&lt;br /&gt;
&lt;br /&gt;
===Constrain Character Model===&lt;br /&gt;
On the selected Oni character model, creates a set of Copy Location and Copy Rotation constraints targeting a specified rig. Effectively constrains the selected Oni character model to the specified rig.&lt;br /&gt;
&lt;br /&gt;
If any of the model objects already contain any constrains, BlenderOni will output an error, and the user should clear all constraints in the selected objects.&lt;br /&gt;
&lt;br /&gt;
==Use cases==&lt;br /&gt;
Since BlenderOni is a companion tool for the Rigify-Oni rig, explanation of its intended usage is in the rig documentation, available [[Using_the_Rigify_animation_rig|HERE]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Completed modding tools]][[Category:Bi-platform modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37827</id>
		<title>BlenderOni</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37827"/>
		<updated>2022-05-18T14:47:07Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Constrain Character Model */ Explains&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|style=&amp;quot;float:right&amp;quot;&lt;br /&gt;
|[[Image:Guido_-_Kon_face_07.jpg|thumb|150px|Note to self: no more pizza before bed! Nightmares! ]]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;BlenderOni&#039;&#039;&#039; is a [[Blender]] add-on intended as an integral companion tool for the [[Using_the_Rigify_animation_rig|Animation rig for Blender]]. It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, the vast majority of the add-on&#039;s options can also be used for general Blender tasks. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BlenderOni can be downloaded [http://mods.oni2.net/node/401 HERE.]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
When the Rigify-Oni rig was first released to the public, it was meant to be used together with a number of scripts stored within the Blender scene containing the rig. However, those scripts were not ideal - they were awkward to use as setting up the appropriate values was possible only by changing the script code.&lt;br /&gt;
&lt;br /&gt;
Those scripts have become obsolete with the introduction of BlenderOni, which is essentially little more than those scripts wrapped into a GUI. The scripts are nonetheless archived [[Blender/Obsolete scripts|HERE]] for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
==Options==&lt;br /&gt;
===Bake Keyframe Rotation Mode===&lt;br /&gt;
Keyframes the rotation data in the selected rotation mode for every selected object, for every frame in the specified frame range. Usually used for converting rotation data from Euler angles to Quaternions if needed.&lt;br /&gt;
&lt;br /&gt;
===Change Rotation Mode===&lt;br /&gt;
Changes the rotation mode of every selected object to the selected rotation mode.&lt;br /&gt;
&lt;br /&gt;
===Adjust Throw Target===&lt;br /&gt;
Moves the selected object by the specified offset for every frame in the specified frame range. &lt;br /&gt;
If the &amp;quot;Adjust and rotate throw target&amp;quot; operation is selected, the object will also get rotated by 180 degrees in the frame range. &lt;br /&gt;
If the &amp;quot;Adjust back throw target&amp;quot; operation is selected and the object&#039;s location is not { X , Y } = { 0 , 0 }, it gets moved to { X , Y } = { 0 , 0 }.&lt;br /&gt;
&lt;br /&gt;
Used for adjusting the position of the throw target animation, both for forward (Adjust and rotate throw target) and back (Adjust back throw target) throws.&lt;br /&gt;
&lt;br /&gt;
If you are importing an animation from Oni, the X, Y and Z fields are supposed to be taken from the &amp;lt;Position&amp;gt; tag. The position tag has the following order:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;x y z&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
BlenderOni takes them in a different order due to differences in axis orientation:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: x, Y: -z, Z: -y&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So given the following &amp;lt;Position&amp;gt; tag with the following example values:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;1 2 -3&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The arguments in BlenderOni should be as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: 1, Y: 3, Z: -2&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have created a new animation and want to adjust it back to { X , Y } = { 0 , 0 }, then the X and Y arguments will be the inversions of the X and Y location coordinates of the throw target&#039;s pelvis in the first frame of the animation. Z should be set to 0. The new resulting &amp;lt;Position&amp;gt; tag should be created using the order schematic above, with the exception of the height (Blender Z, &amp;lt;Position&amp;gt; y) - this value is mostly taken from other TRAMs and adjusted in a trial-and-error manner until the animation looks okay on most characters. &lt;br /&gt;
&lt;br /&gt;
This is because the height adjustment is one and the same for every character type, regardless of their height - so if you pick the right height, smaller characters will float off the ground and the tallest ones will sink into it, while average height characters should have their feet on the ground.&lt;br /&gt;
&lt;br /&gt;
===Object Constraint Switch===&lt;br /&gt;
Switches object constraints on and off within selected objects. Used to constrain and unconstrain character model objects to the rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Constraint Switch===&lt;br /&gt;
Switches bone constraints on and off within selected armature bones. Used to constrain and unconstrain rig to character model objects. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Object Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected object in the specified frame range. Used as a way to copy animation data from the rig to the character models. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected bone of the armature in the specified frame range. Used as a way to copy animation data from character models to the rig. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Object Constraint Targets===&lt;br /&gt;
Sets the targets of all of the constraints named &amp;quot;Copy Rotation&amp;quot;, and also &amp;quot;Copy Location&amp;quot; in case of pelvis, to the specified object. Used to constrain the selected character model to the specified rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Rig Bone Constraint Targets===&lt;br /&gt;
In the specified rig, sets the target names of predefined bone constraints with names ending in one of the selected suffixes (.001 or .002) to the appropriate Oni character model object name with the specified suffix. Used to constrain rigs to the character models. &#039;&#039;&#039;Can be used in any object interaction mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To explain more clearly: The Rigify-Oni rig has two sets of bone constraints of Copy Location for the torso and torso_pivot bone, and Copy Rotation for all of the remaining bones in the FK and Torso layers. They are responsible for copying  rotation and location data from the targeted character models, with the influence of those constraints being controlled with the corresponding Pose Matching bones (Pose1 for .001 constraints and Pose2 for .002). The character models will always have their body objects named the same way (pelvis, torso, chest, etc.), and because of that, Blender adds suffixes to their names as more characters are imported, starting with &amp;quot;.001&amp;quot; suffix.&lt;br /&gt;
&lt;br /&gt;
Because of this, the way to constrain an instance of the Rigify-Oni rig to the given character model is to set the target names of the .001 or .002 bone constraint targets to the appropriate Oni character model objects with the appropriate suffix. (BlenderOni has the Oni character model object names hardcoded, it only needs their suffix)&lt;br /&gt;
&lt;br /&gt;
Example: You want to constrain rig.001, to the character model with .003 suffix through the rig&#039;s .002 bone constraints. To do that, you need to:&lt;br /&gt;
*Input rig.001 as the target rig name,&lt;br /&gt;
*Select .002 as the Bone constraints&#039; suffix,&lt;br /&gt;
*Input .003 as the Target objects&#039; suffix,&lt;br /&gt;
*Press Set Rig Bone Constraints Targets.&lt;br /&gt;
*Make sure Pose1 bone is below the floor level (Y&amp;lt;0)&lt;br /&gt;
*Make sure Pose2 bone is above the floor level (Y&amp;gt;0.1)&lt;br /&gt;
&lt;br /&gt;
Rig.001 will now be constrained to the Oni character model with .003 suffix.&lt;br /&gt;
&lt;br /&gt;
===Constrain Character Model===&lt;br /&gt;
On the selected Oni character model, creates a set of Copy Location and Copy Rotation constraints targeting a specified rig. Effectively constrains the selected Oni character model to the specified rig.&lt;br /&gt;
&lt;br /&gt;
If any of the model objects already contain any constrains, BlenderOni will output an error, and the user should clear all constraints in the selected objects.&lt;br /&gt;
&lt;br /&gt;
==Use cases==&lt;br /&gt;
To be further described, but probably best to link to the [[Using_the_Rigify_animation_rig|rig documentation]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Completed modding tools]][[Category:Bi-platform modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37822</id>
		<title>BlenderOni</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37822"/>
		<updated>2022-05-17T15:55:01Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Bone Visual Transformer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|style=&amp;quot;float:right&amp;quot;&lt;br /&gt;
|[[Image:Guido_-_Kon_face_07.jpg|thumb|150px|Note to self: no more pizza before bed! Nightmares! ]]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;BlenderOni&#039;&#039;&#039; is a [[Blender]] add-on intended as an integral companion tool for the [[Using_the_Rigify_animation_rig|Animation rig for Blender]]. It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, the vast majority of the add-on&#039;s options can also be used for general Blender tasks. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BlenderOni can be downloaded [http://mods.oni2.net/node/401 HERE.]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
When the Rigify-Oni rig was first released to the public, it was meant to be used together with a number of scripts stored within the Blender scene containing the rig. However, those scripts were not ideal - they were awkward to use as setting up the appropriate values was possible only by changing the script code.&lt;br /&gt;
&lt;br /&gt;
Those scripts have become obsolete with the introduction of BlenderOni, which is essentially little more than those scripts wrapped into a GUI. The scripts are nonetheless archived [[Blender/Obsolete scripts|HERE]] for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
==Options==&lt;br /&gt;
===Bake Keyframe Rotation Mode===&lt;br /&gt;
Keyframes the rotation data in the selected rotation mode for every selected object, for every frame in the specified frame range. Usually used for converting rotation data from Euler angles to Quaternions if needed.&lt;br /&gt;
&lt;br /&gt;
===Change Rotation Mode===&lt;br /&gt;
Changes the rotation mode of every selected object to the selected rotation mode.&lt;br /&gt;
&lt;br /&gt;
===Adjust Throw Target===&lt;br /&gt;
Moves the selected object by the specified offset for every frame in the specified frame range. &lt;br /&gt;
If the &amp;quot;Adjust and rotate throw target&amp;quot; operation is selected, the object will also get rotated by 180 degrees in the frame range. &lt;br /&gt;
If the &amp;quot;Adjust back throw target&amp;quot; operation is selected and the object&#039;s location is not { X , Y } = { 0 , 0 }, it gets moved to { X , Y } = { 0 , 0 }.&lt;br /&gt;
&lt;br /&gt;
Used for adjusting the position of the throw target animation, both for forward (Adjust and rotate throw target) and back (Adjust back throw target) throws.&lt;br /&gt;
&lt;br /&gt;
If you are importing an animation from Oni, the X, Y and Z fields are supposed to be taken from the &amp;lt;Position&amp;gt; tag. The position tag has the following order:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;x y z&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
BlenderOni takes them in a different order due to differences in axis orientation:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: x, Y: -z, Z: -y&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So given the following &amp;lt;Position&amp;gt; tag with the following example values:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;1 2 -3&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The arguments in BlenderOni should be as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: 1, Y: 3, Z: -2&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have created a new animation and want to adjust it back to { X , Y } = { 0 , 0 }, then the X and Y arguments will be the inversions of the X and Y location coordinates of the throw target&#039;s pelvis in the first frame of the animation. Z should be set to 0. The new resulting &amp;lt;Position&amp;gt; tag should be created using the order schematic above, with the exception of the height (Blender Z, &amp;lt;Position&amp;gt; y) - this value is mostly taken from other TRAMs and adjusted in a trial-and-error manner until the animation looks okay on most characters. &lt;br /&gt;
&lt;br /&gt;
This is because the height adjustment is one and the same for every character type, regardless of their height - so if you pick the right height, smaller characters will float off the ground and the tallest ones will sink into it, while average height characters should have their feet on the ground.&lt;br /&gt;
&lt;br /&gt;
===Object Constraint Switch===&lt;br /&gt;
Switches object constraints on and off within selected objects. Used to constrain and unconstrain character model objects to the rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Constraint Switch===&lt;br /&gt;
Switches bone constraints on and off within selected armature bones. Used to constrain and unconstrain rig to character model objects. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Object Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected object in the specified frame range. Used as a way to copy animation data from the rig to the character models. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected bone of the armature in the specified frame range. Used as a way to copy animation data from character models to the rig. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Object Constraint Targets===&lt;br /&gt;
Sets the targets of all of the constraints named &amp;quot;Copy Rotation&amp;quot;, and also &amp;quot;Copy Location&amp;quot; in case of pelvis, to the specified object. Used to constrain the selected character model to the specified rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Rig Bone Constraint Targets===&lt;br /&gt;
In the specified rig, sets the target names of predefined bone constraints with names ending in one of the selected suffixes (.001 or .002) to the appropriate Oni character model object name with the specified suffix. Used to constrain rigs to the character models. &#039;&#039;&#039;Can be used in any object interaction mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To explain more clearly: The Rigify-Oni rig has two sets of bone constraints of Copy Location for the torso and torso_pivot bone, and Copy Rotation for all of the remaining bones in the FK and Torso layers. They are responsible for copying  rotation and location data from the targeted character models, with the influence of those constraints being controlled with the corresponding Pose Matching bones (Pose1 for .001 constraints and Pose2 for .002). The character models will always have their body objects named the same way (pelvis, torso, chest, etc.), and because of that, Blender adds suffixes to their names as more characters are imported, starting with &amp;quot;.001&amp;quot; suffix.&lt;br /&gt;
&lt;br /&gt;
Because of this, the way to constrain an instance of the Rigify-Oni rig to the given character model is to set the target names of the .001 or .002 bone constraint targets to the appropriate Oni character model objects with the appropriate suffix. (BlenderOni has the Oni character model object names hardcoded, it only needs their suffix)&lt;br /&gt;
&lt;br /&gt;
Example: You want to constrain rig.001, to the character model with .003 suffix through the rig&#039;s .002 bone constraints. To do that, you need to:&lt;br /&gt;
*Input rig.001 as the target rig name,&lt;br /&gt;
*Select .002 as the Bone constraints&#039; suffix,&lt;br /&gt;
*Input .003 as the Target objects&#039; suffix,&lt;br /&gt;
*Press Set Rig Bone Constraints Targets.&lt;br /&gt;
*Make sure Pose1 bone is below the floor level (Y&amp;lt;0)&lt;br /&gt;
*Make sure Pose2 bone is above the floor level (Y&amp;gt;0.1)&lt;br /&gt;
&lt;br /&gt;
Rig.001 will now be constrained to the Oni character model with .003 suffix.&lt;br /&gt;
&lt;br /&gt;
===Constrain Character Model===&lt;br /&gt;
&lt;br /&gt;
==Use cases==&lt;br /&gt;
To be further described, but probably best to link to the [[Using_the_Rigify_animation_rig|rig documentation]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Completed modding tools]][[Category:Bi-platform modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37821</id>
		<title>BlenderOni</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37821"/>
		<updated>2022-05-17T15:54:43Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Set Object Constraint Targets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|style=&amp;quot;float:right&amp;quot;&lt;br /&gt;
|[[Image:Guido_-_Kon_face_07.jpg|thumb|150px|Note to self: no more pizza before bed! Nightmares! ]]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;BlenderOni&#039;&#039;&#039; is a [[Blender]] add-on intended as an integral companion tool for the [[Using_the_Rigify_animation_rig|Animation rig for Blender]]. It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, the vast majority of the add-on&#039;s options can also be used for general Blender tasks. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BlenderOni can be downloaded [http://mods.oni2.net/node/401 HERE.]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
When the Rigify-Oni rig was first released to the public, it was meant to be used together with a number of scripts stored within the Blender scene containing the rig. However, those scripts were not ideal - they were awkward to use as setting up the appropriate values was possible only by changing the script code.&lt;br /&gt;
&lt;br /&gt;
Those scripts have become obsolete with the introduction of BlenderOni, which is essentially little more than those scripts wrapped into a GUI. The scripts are nonetheless archived [[Blender/Obsolete scripts|HERE]] for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
==Options==&lt;br /&gt;
===Bake Keyframe Rotation Mode===&lt;br /&gt;
Keyframes the rotation data in the selected rotation mode for every selected object, for every frame in the specified frame range. Usually used for converting rotation data from Euler angles to Quaternions if needed.&lt;br /&gt;
&lt;br /&gt;
===Change Rotation Mode===&lt;br /&gt;
Changes the rotation mode of every selected object to the selected rotation mode.&lt;br /&gt;
&lt;br /&gt;
===Adjust Throw Target===&lt;br /&gt;
Moves the selected object by the specified offset for every frame in the specified frame range. &lt;br /&gt;
If the &amp;quot;Adjust and rotate throw target&amp;quot; operation is selected, the object will also get rotated by 180 degrees in the frame range. &lt;br /&gt;
If the &amp;quot;Adjust back throw target&amp;quot; operation is selected and the object&#039;s location is not { X , Y } = { 0 , 0 }, it gets moved to { X , Y } = { 0 , 0 }.&lt;br /&gt;
&lt;br /&gt;
Used for adjusting the position of the throw target animation, both for forward (Adjust and rotate throw target) and back (Adjust back throw target) throws.&lt;br /&gt;
&lt;br /&gt;
If you are importing an animation from Oni, the X, Y and Z fields are supposed to be taken from the &amp;lt;Position&amp;gt; tag. The position tag has the following order:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;x y z&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
BlenderOni takes them in a different order due to differences in axis orientation:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: x, Y: -z, Z: -y&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So given the following &amp;lt;Position&amp;gt; tag with the following example values:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;1 2 -3&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The arguments in BlenderOni should be as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: 1, Y: 3, Z: -2&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have created a new animation and want to adjust it back to { X , Y } = { 0 , 0 }, then the X and Y arguments will be the inversions of the X and Y location coordinates of the throw target&#039;s pelvis in the first frame of the animation. Z should be set to 0. The new resulting &amp;lt;Position&amp;gt; tag should be created using the order schematic above, with the exception of the height (Blender Z, &amp;lt;Position&amp;gt; y) - this value is mostly taken from other TRAMs and adjusted in a trial-and-error manner until the animation looks okay on most characters. &lt;br /&gt;
&lt;br /&gt;
This is because the height adjustment is one and the same for every character type, regardless of their height - so if you pick the right height, smaller characters will float off the ground and the tallest ones will sink into it, while average height characters should have their feet on the ground.&lt;br /&gt;
&lt;br /&gt;
===Object Constraint Switch===&lt;br /&gt;
Switches object constraints on and off within selected objects. Used to constrain and unconstrain character model objects to the rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Constraint Switch===&lt;br /&gt;
Switches bone constraints on and off within selected armature bones. Used to constrain and unconstrain rig to character model objects. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Object Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected object in the specified frame range. Used as a way to copy animation data from the rig to the character models. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected bone of the aramture in the specified frame range. Used as a way to copy animation data from character models to the rig. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Object Constraint Targets===&lt;br /&gt;
Sets the targets of all of the constraints named &amp;quot;Copy Rotation&amp;quot;, and also &amp;quot;Copy Location&amp;quot; in case of pelvis, to the specified object. Used to constrain the selected character model to the specified rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Rig Bone Constraint Targets===&lt;br /&gt;
In the specified rig, sets the target names of predefined bone constraints with names ending in one of the selected suffixes (.001 or .002) to the appropriate Oni character model object name with the specified suffix. Used to constrain rigs to the character models. &#039;&#039;&#039;Can be used in any object interaction mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To explain more clearly: The Rigify-Oni rig has two sets of bone constraints of Copy Location for the torso and torso_pivot bone, and Copy Rotation for all of the remaining bones in the FK and Torso layers. They are responsible for copying  rotation and location data from the targeted character models, with the influence of those constraints being controlled with the corresponding Pose Matching bones (Pose1 for .001 constraints and Pose2 for .002). The character models will always have their body objects named the same way (pelvis, torso, chest, etc.), and because of that, Blender adds suffixes to their names as more characters are imported, starting with &amp;quot;.001&amp;quot; suffix.&lt;br /&gt;
&lt;br /&gt;
Because of this, the way to constrain an instance of the Rigify-Oni rig to the given character model is to set the target names of the .001 or .002 bone constraint targets to the appropriate Oni character model objects with the appropriate suffix. (BlenderOni has the Oni character model object names hardcoded, it only needs their suffix)&lt;br /&gt;
&lt;br /&gt;
Example: You want to constrain rig.001, to the character model with .003 suffix through the rig&#039;s .002 bone constraints. To do that, you need to:&lt;br /&gt;
*Input rig.001 as the target rig name,&lt;br /&gt;
*Select .002 as the Bone constraints&#039; suffix,&lt;br /&gt;
*Input .003 as the Target objects&#039; suffix,&lt;br /&gt;
*Press Set Rig Bone Constraints Targets.&lt;br /&gt;
*Make sure Pose1 bone is below the floor level (Y&amp;lt;0)&lt;br /&gt;
*Make sure Pose2 bone is above the floor level (Y&amp;gt;0.1)&lt;br /&gt;
&lt;br /&gt;
Rig.001 will now be constrained to the Oni character model with .003 suffix.&lt;br /&gt;
&lt;br /&gt;
===Constrain Character Model===&lt;br /&gt;
&lt;br /&gt;
==Use cases==&lt;br /&gt;
To be further described, but probably best to link to the [[Using_the_Rigify_animation_rig|rig documentation]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Completed modding tools]][[Category:Bi-platform modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37820</id>
		<title>BlenderOni</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37820"/>
		<updated>2022-05-17T15:54:10Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Options */ Explained more options&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|style=&amp;quot;float:right&amp;quot;&lt;br /&gt;
|[[Image:Guido_-_Kon_face_07.jpg|thumb|150px|Note to self: no more pizza before bed! Nightmares! ]]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;BlenderOni&#039;&#039;&#039; is a [[Blender]] add-on intended as an integral companion tool for the [[Using_the_Rigify_animation_rig|Animation rig for Blender]]. It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, the vast majority of the add-on&#039;s options can also be used for general Blender tasks. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BlenderOni can be downloaded [http://mods.oni2.net/node/401 HERE.]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
When the Rigify-Oni rig was first released to the public, it was meant to be used together with a number of scripts stored within the Blender scene containing the rig. However, those scripts were not ideal - they were awkward to use as setting up the appropriate values was possible only by changing the script code.&lt;br /&gt;
&lt;br /&gt;
Those scripts have become obsolete with the introduction of BlenderOni, which is essentially little more than those scripts wrapped into a GUI. The scripts are nonetheless archived [[Blender/Obsolete scripts|HERE]] for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
==Options==&lt;br /&gt;
===Bake Keyframe Rotation Mode===&lt;br /&gt;
Keyframes the rotation data in the selected rotation mode for every selected object, for every frame in the specified frame range. Usually used for converting rotation data from Euler angles to Quaternions if needed.&lt;br /&gt;
&lt;br /&gt;
===Change Rotation Mode===&lt;br /&gt;
Changes the rotation mode of every selected object to the selected rotation mode.&lt;br /&gt;
&lt;br /&gt;
===Adjust Throw Target===&lt;br /&gt;
Moves the selected object by the specified offset for every frame in the specified frame range. &lt;br /&gt;
If the &amp;quot;Adjust and rotate throw target&amp;quot; operation is selected, the object will also get rotated by 180 degrees in the frame range. &lt;br /&gt;
If the &amp;quot;Adjust back throw target&amp;quot; operation is selected and the object&#039;s location is not { X , Y } = { 0 , 0 }, it gets moved to { X , Y } = { 0 , 0 }.&lt;br /&gt;
&lt;br /&gt;
Used for adjusting the position of the throw target animation, both for forward (Adjust and rotate throw target) and back (Adjust back throw target) throws.&lt;br /&gt;
&lt;br /&gt;
If you are importing an animation from Oni, the X, Y and Z fields are supposed to be taken from the &amp;lt;Position&amp;gt; tag. The position tag has the following order:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;x y z&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
BlenderOni takes them in a different order due to differences in axis orientation:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: x, Y: -z, Z: -y&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So given the following &amp;lt;Position&amp;gt; tag with the following example values:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;1 2 -3&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The arguments in BlenderOni should be as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: 1, Y: 3, Z: -2&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have created a new animation and want to adjust it back to { X , Y } = { 0 , 0 }, then the X and Y arguments will be the inversions of the X and Y location coordinates of the throw target&#039;s pelvis in the first frame of the animation. Z should be set to 0. The new resulting &amp;lt;Position&amp;gt; tag should be created using the order schematic above, with the exception of the height (Blender Z, &amp;lt;Position&amp;gt; y) - this value is mostly taken from other TRAMs and adjusted in a trial-and-error manner until the animation looks okay on most characters. &lt;br /&gt;
&lt;br /&gt;
This is because the height adjustment is one and the same for every character type, regardless of their height - so if you pick the right height, smaller characters will float off the ground and the tallest ones will sink into it, while average height characters should have their feet on the ground.&lt;br /&gt;
&lt;br /&gt;
===Object Constraint Switch===&lt;br /&gt;
Switches object constraints on and off within selected objects. Used to constrain and unconstrain character model objects to the rig. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Constraint Switch===&lt;br /&gt;
Switches bone constraints on and off within selected armature bones. Used to constrain and unconstrain rig to character model objects. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Object Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected object in the specified frame range. Used as a way to copy animation data from the rig to the character models. &#039;&#039;&#039;Use in Object Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bone Visual Transformer===&lt;br /&gt;
Applies visual transform and keyframes rotation and location data for every selected bone of the aramture in the specified frame range. Used as a way to copy animation data from character models to the rig. &#039;&#039;&#039;Use in Pose Mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Set Object Constraint Targets===&lt;br /&gt;
Sets the targets of all of the constraints named &amp;quot;Copy Rotation&amp;quot;, and also &amp;quot;Copy Location&amp;quot; in case of pelvis, to the specified object. Used to constrain the selected character model to the specified rig.&lt;br /&gt;
&lt;br /&gt;
===Set Rig Bone Constraint Targets===&lt;br /&gt;
In the specified rig, sets the target names of predefined bone constraints with names ending in one of the selected suffixes (.001 or .002) to the appropriate Oni character model object name with the specified suffix. Used to constrain rigs to the character models. &#039;&#039;&#039;Can be used in any object interaction mode.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To explain more clearly: The Rigify-Oni rig has two sets of bone constraints of Copy Location for the torso and torso_pivot bone, and Copy Rotation for all of the remaining bones in the FK and Torso layers. They are responsible for copying  rotation and location data from the targeted character models, with the influence of those constraints being controlled with the corresponding Pose Matching bones (Pose1 for .001 constraints and Pose2 for .002). The character models will always have their body objects named the same way (pelvis, torso, chest, etc.), and because of that, Blender adds suffixes to their names as more characters are imported, starting with &amp;quot;.001&amp;quot; suffix.&lt;br /&gt;
&lt;br /&gt;
Because of this, the way to constrain an instance of the Rigify-Oni rig to the given character model is to set the target names of the .001 or .002 bone constraint targets to the appropriate Oni character model objects with the appropriate suffix. (BlenderOni has the Oni character model object names hardcoded, it only needs their suffix)&lt;br /&gt;
&lt;br /&gt;
Example: You want to constrain rig.001, to the character model with .003 suffix through the rig&#039;s .002 bone constraints. To do that, you need to:&lt;br /&gt;
*Input rig.001 as the target rig name,&lt;br /&gt;
*Select .002 as the Bone constraints&#039; suffix,&lt;br /&gt;
*Input .003 as the Target objects&#039; suffix,&lt;br /&gt;
*Press Set Rig Bone Constraints Targets.&lt;br /&gt;
*Make sure Pose1 bone is below the floor level (Y&amp;lt;0)&lt;br /&gt;
*Make sure Pose2 bone is above the floor level (Y&amp;gt;0.1)&lt;br /&gt;
&lt;br /&gt;
Rig.001 will now be constrained to the Oni character model with .003 suffix.&lt;br /&gt;
&lt;br /&gt;
===Constrain Character Model===&lt;br /&gt;
&lt;br /&gt;
==Use cases==&lt;br /&gt;
To be further described, but probably best to link to the [[Using_the_Rigify_animation_rig|rig documentation]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Completed modding tools]][[Category:Bi-platform modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37819</id>
		<title>BlenderOni</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37819"/>
		<updated>2022-05-16T20:56:09Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Options */ Described first three options&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|style=&amp;quot;float:right&amp;quot;&lt;br /&gt;
|[[Image:Guido_-_Kon_face_07.jpg|thumb|150px|Note to self: no more pizza before bed! Nightmares! ]]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;BlenderOni&#039;&#039;&#039; is a [[Blender]] add-on intended as an integral companion tool for the [[Using_the_Rigify_animation_rig|Animation rig for Blender]]. It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, the vast majority of the add-on&#039;s options can also be used for general Blender tasks. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BlenderOni can be downloaded [http://mods.oni2.net/node/401 HERE.]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
When the Rigify-Oni rig was first released to the public, it was meant to be used together with a number of scripts stored within the Blender scene containing the rig. However, those scripts were not ideal - they were awkward to use as setting up the appropriate values was possible only by changing the script code.&lt;br /&gt;
&lt;br /&gt;
Those scripts have become obsolete with the introduction of BlenderOni, which is essentially little more than those scripts wrapped into a GUI. The scripts are nonetheless archived [[Blender/Obsolete scripts|HERE]] for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
==Options==&lt;br /&gt;
===Bake Keyframe Rotation Mode===&lt;br /&gt;
Keyframes the rotation data in the selected rotation mode for every selected object, for every frame in the specified frame range. Usually used for converting rotation data from Euler angles to Quaternions if needed.&lt;br /&gt;
&lt;br /&gt;
===Change Rotation Mode===&lt;br /&gt;
Changes the rotation mode of every selected object to the selected rotation mode.&lt;br /&gt;
&lt;br /&gt;
===Adjust Throw Target===&lt;br /&gt;
Moves the selected object by the specified offset for every frame in the specified frame range. &lt;br /&gt;
If the &amp;quot;Adjust and rotate throw target&amp;quot; operation is selected, the object will also get rotated by 180 degrees in the frame range. &lt;br /&gt;
If the &amp;quot;Adjust back throw target&amp;quot; operation is selected and the object&#039;s location is not { X , Y } = { 0 , 0 }, it gets moved to { X , Y } = { 0 , 0 }.&lt;br /&gt;
&lt;br /&gt;
Used for adjusting the position of the throw target animation, both for forward (Adjust and rotate throw target) and back (Adjust back throw target) throws.&lt;br /&gt;
&lt;br /&gt;
If you are importing an animation from Oni, the X, Y and Z fields are supposed to be taken from the &amp;lt;Position&amp;gt; tag. The position tag has the following order:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;x y z&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
BlenderOni takes them in a different order due to differences in axis orientation:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: x, Y: -z, Z: -y&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So given the following &amp;lt;Position&amp;gt; tag with the following example values:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Position&amp;gt;1 2 -3&amp;lt;/Position&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The arguments in BlenderOni should be as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt; X: 1, Y: 3, Z: -2&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have created a new animation and want to adjust it back to { X , Y } = { 0 , 0 }, then the X and Y arguments will be the inversions of the X and Y location coordinates of the throw target&#039;s pelvis in the first frame of the animation. Z should be set to 0. The new resulting &amp;lt;Position&amp;gt; tag should be created using the order schematic above, with the exception of the height (Blender Z, &amp;lt;Position&amp;gt; y) - this value is mostly taken from other TRAMs and adjusted in a trial-and-error manner until the animation looks okay on most characters. &lt;br /&gt;
&lt;br /&gt;
This is because the height adjustment is one and the same for every character type, regardless of their height - so if you pick the right height, smaller characters will float off the ground and the tallest ones will sink into it, while average height characters should have their feet on the ground.&lt;br /&gt;
&lt;br /&gt;
===Object Constraint Switch===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Bone Constraint Switch===&lt;br /&gt;
&lt;br /&gt;
===Object Visual Transformer===&lt;br /&gt;
&lt;br /&gt;
===Bone Visual Transformer===&lt;br /&gt;
&lt;br /&gt;
===Set Object Constraint Targets===&lt;br /&gt;
&lt;br /&gt;
===Set Rig Bone Constraint Targets===&lt;br /&gt;
&lt;br /&gt;
===Constrain Character Model===&lt;br /&gt;
&lt;br /&gt;
==Use cases==&lt;br /&gt;
To be further described, but probably best to link to the [[Using_the_Rigify_animation_rig|rig documentation]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Completed modding tools]][[Category:Bi-platform modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Using_the_Rigify_animation_rig&amp;diff=37815</id>
		<title>Using the Rigify animation rig</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Using_the_Rigify_animation_rig&amp;diff=37815"/>
		<updated>2022-05-16T09:19:55Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Optional tools and tutorials */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This article is intended to explain the workflow of using the [http://mods.oni2.net/node/388 Rigify-based animation rig for Blender] (made by geyser) for the purpose of making Oni animations, and also how to use it, and what are the Oni-specific additions to it that we&#039;ve made.&lt;br /&gt;
&lt;br /&gt;
==Prerequisite tutorials==&lt;br /&gt;
As this rig is now intented to be used together with BlenderOni, it is necessary to be familiar with either:&lt;br /&gt;
* [[BlenderOni|BlenderOni&#039;s documentation,]]&lt;br /&gt;
* [https://www.youtube.com/watch?v=pA_Y8QBCvPI BlenderOni&#039;s explanatory video,] particularly time ranges from 0:00 - 3:07 and 21:24 - 48:05 (that&#039;s part 1 and 3 of the video).&lt;br /&gt;
&lt;br /&gt;
Besides that, I highly recommend watching the tutorials below if you feel you&#039;re lacking knowledge in any of these subjects:&lt;br /&gt;
&lt;br /&gt;
General Blender basics:&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=RG8qK5zPqgM Wolf&#039;s 45-Minute Crash Course for Blender Virgins]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Practical and intuitive explanation of what Inverse and Forward Kinematics (IK/FK) are - this is explained in Maya, but same principles apply in every 3D editing program including Blender:&lt;br /&gt;
* [https://www.youtube.com/watch?v=p6PYKyxR0aY Animating with IK and FK]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Basics of using Rigify - &#039;&#039;&#039;all you need to know about animating with Rigify is stored in the video below.&#039;&#039;&#039; There is no point in making a tutorial on how to use the rig controllers themselves here - it&#039;s all in the video below:&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=vKgH5zXIYmM Rigify Tutorial #08 - Posing the Rigify rig] by CGDive&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(OPTIONAL) Tutorial on how to create the rig described here - this is strictly optional; the only practical reason to make your own rig is for the purpose of adjusting its controllers to a specific character, however, the advantage that you get out of that is purely visual and a marginal one at that - if you&#039;ve built your rig for Konoko, there&#039;s nothing stopping you from using it on a TCTF SWAT - the limb controllers will be only slightly out of place, which doesn&#039;t impact animating in any way. So ultimately you may want to go through this if you want to learn how this rig works, find this rig confusing, or even just for the bunch of great Youtube tutorials linked in that tutorial.&lt;br /&gt;
&lt;br /&gt;
Also, it&#039;s worth noting that a huge part of this article is in fact copy-pasted from this tutorial.&lt;br /&gt;
&lt;br /&gt;
* [[Creating_an_animation_rig_in_Blender|Creating an animation rig in Blender]]&lt;br /&gt;
&lt;br /&gt;
==Required tools and commands==&lt;br /&gt;
There are several things worth knowing before you start creating the rig, tools to get and tutorials to have ready to reference for commands.&lt;br /&gt;
&lt;br /&gt;
===Tools and relevant tutorials===&lt;br /&gt;
* &#039;&#039;&#039;[[BlenderOni|BlenderOni]]&#039;&#039;&#039; - this Blender addon is an integral companion tool for this rig - it contains a number of scripts which automate a lot of operations required to make any use out of the rig. Without those scripts, these operations (e.g. constraining the model to the rig and vice versa) would have to be done manually, which takes a ridiculous amount of time.&lt;br /&gt;
[[Image:Cmder.png|200px|right|thumb|Screenshot showing Cmder&#039;s capabilities within the context of modding Oni]]&lt;br /&gt;
* [http://mods.oni2.net/node/38 &#039;&#039;&#039;Current version of OniSplit.&#039;&#039;&#039;] This is the tool needed to import and export assets out of Oni. &#039;&#039;&#039;DO NOT USE OniSplit GUI or Vago for importing Oni assets into Blender&#039;&#039;&#039; - neither of these weren&#039;t updated in a long time, and thus they don&#039;t support OniSplit&#039;s v0.9.99.2 -blender option. You can still use them for other purposes though, such as sounds and converting .oni files to XMLs, etc.&lt;br /&gt;
* [https://docs.google.com/document/d/175uJGklYASAgrFjxuUG4-kJRDoMTjjP7GvNxSj1GscU/edit &#039;&#039;&#039;Oni-Blender tutorial&#039;&#039;&#039;] by EdT. Please read this in entirety to know likely-to-happen issues and refer to this as your guide for OniSplit commands relating to Blender.&lt;br /&gt;
* [http://oni.bungie.org/forum/viewtopic.php?pid=23230#p23230 &#039;&#039;&#039;Brief overview on creating TRAMs&#039;&#039;&#039;] by EdT - while this was written with XSI in mind, this is still relevant as the process for preparing the XML files for Oni is still the same. Also the next post in that thread, called &#039;&#039;&#039;Brief walk through on modifying a TRAM,&#039;&#039;&#039; is an example of that overview put into practice.&lt;br /&gt;
&lt;br /&gt;
===Optional tools and tutorials===&lt;br /&gt;
* [https://cmder.net/ &#039;&#039;&#039;Cmder&#039;&#039;&#039;] (Windows only) - because OniSplit is a command line tool, it is highly recommended to get any upgrade to Windows&#039; Command Prompt. As shown in the screenshot on the right, Cmder allows you to start it from the context menu in any selected folder, and it also remembers your most recently used commands, vastly improving your workflow when you&#039;re forced to use any command line tools.&lt;br /&gt;
* [https://docs.blender.org/manual/en/2.81/addons/rigging/rigify.html &#039;&#039;&#039;Rigify documentation&#039;&#039;&#039;] - it&#039;s a plugin for Blender designed to automate a lot of rigging work. The rig described here is generated using Rigify. Take a look if you&#039;re interested and want to learn more, but you don&#039;t have to know Rigify&#039;s documentation to use this rig.&lt;br /&gt;
&lt;br /&gt;
==General workflow of animating for Oni using Rigify==&lt;br /&gt;
The general workflow of making animations using this rig is the following, assuming you want to make a single animation (i.e. you don&#039;t want to make a throw animation):&lt;br /&gt;
&lt;br /&gt;
# Open up a Blender scene containing the rig.&lt;br /&gt;
# Delete either the model in Pose1 or Pose2.&lt;br /&gt;
# (OPTIONAL) Assuming you want to animate a different character, delete the T-posed model.&lt;br /&gt;
## Import your desired character with textures using -noanim.&lt;br /&gt;
# Import the animation you are using as a starting point. For more detailed information on how to import an Oni animation to Blender, see the next header.&lt;br /&gt;
## If you did point 3, apply the textures on the animated model.&lt;br /&gt;
# Using the &#039;&#039;Set Rig Bone Constraint Targets&#039;&#039; option in BlenderOni, set the targets of the rig&#039;s bone constraints to be the body parts of the animation you&#039;ve imported.&lt;br /&gt;
# Using the Pose Matching functionality, constrain the rig to the imported animation (Set the IK-FK sliders on rig limbs to 1, as Pose Matching works only through FK controllers)&lt;br /&gt;
# For each frame that you want to remain in your animation, while having all the bones selected (or the ones you want), either:&lt;br /&gt;
## Press Ctrl+A, select &#039;&#039;Apply Visual Transform&#039;&#039; to Pose and keyframe it,&lt;br /&gt;
## Or use the &#039;&#039;Bone Visual Transformer&#039;&#039; option in BlenderOni to bake frames within a specified frame range.&lt;br /&gt;
# Disable bone constraints on the rig using the &#039;&#039;Bone Constraint Switch&#039;&#039; option in BlenderOni. &lt;br /&gt;
# &#039;&#039;&#039;Make your animation.&#039;&#039;&#039;&lt;br /&gt;
# Once your animation is ready, use the &#039;&#039;Object Visual Transformer&#039;&#039; option in BlenderOni to bake the rig keyframes into the character model.&lt;br /&gt;
# Using the &#039;&#039;Object Constraint Switch&#039;&#039; option in BlenderOni, disable the object constraints on the character model. &#039;&#039;&#039;The character model should now be animated and have the needed rotations and locations.&lt;br /&gt;
# Export the animation as a DAE.&lt;br /&gt;
&lt;br /&gt;
==Importing Oni animations to Blender==&lt;br /&gt;
This header describes how to import Oni animations to Blender.&lt;br /&gt;
&lt;br /&gt;
For detailed explanation of the required OniSplit commands, please refer to the &#039;&#039;&#039;Oni-Blender Tutorial by EdT&#039;&#039;&#039; listed in the &#039;&#039;&#039;Tools and relevant tutorials&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
# Assuming the character you want to animate isn&#039;t in your rig file, then using OniSplit, export any character you want as a DAE (-extract:dae) using -noanim and -blender arguments. &lt;br /&gt;
## As per EdT&#039;s &#039;&#039;&#039;Oni-Blender Tutorial&#039;&#039;&#039;, you should get &amp;lt;mark&amp;gt;&amp;lt;tt&amp;gt;AnimationDaeWriter: custom axis conversion&amp;lt;/tt&amp;gt;&amp;lt;/mark&amp;gt; in OniSplit output if you&#039;ve used the -blender argument. If you didn&#039;t get that on the output, it means something most likely went wrong and you won&#039;t be able to import the model into Blender (or you will be able to import it but it will be wrong).&lt;br /&gt;
## Assuming you wanted a textured model and thus you&#039;ve exported an ONCC, you should now get a &#039;&#039;&#039;DAE file&#039;&#039;&#039; and an &#039;&#039;&#039;&#039;&#039;images&#039;&#039;&#039;&#039;&#039; folder containing the textures for it.&lt;br /&gt;
# Using OniSplit, export the animation you want as an XML (-extract:xml) using -anim-body (lets you specify the character you want) and -blender arguments.&lt;br /&gt;
## You should get &#039;&#039;&#039;one DAE and one XML file for the animation.&#039;&#039;&#039; &lt;br /&gt;
# Open up a Blender scene containing the rig.&lt;br /&gt;
# Delete either the model either in Pose1 or Pose2 collection. &lt;br /&gt;
# Import the animation into Blender (&#039;&#039;&#039;MAKE SURE YOU CHECK THE &#039;&#039;Import Unit&#039;&#039; BOX EACH TIME&#039;&#039;&#039;, otherwise you will import the model with arbitrary units which will break everything and will be basically unadjustable later))&lt;br /&gt;
# Import the -noanim model into Blender (&#039;&#039;&#039;ALSO MAKE SURE YOU CHECK THE &#039;&#039;Import Unit&#039;&#039; BOX&#039;&#039;&#039;)&lt;br /&gt;
# Move the animated model to either Pose1 or Pose2 collection.&lt;br /&gt;
# If you&#039;ve imported the textured model, [[Blender#Lack_of_textures_on_animated_models|apply textures to the animated models and fix the alpha transparency issue]].&lt;br /&gt;
&lt;br /&gt;
==Added functionalities==&lt;br /&gt;
This header describes functionalities added to the rig by geyser that are not normally present in Rigify.&lt;br /&gt;
&lt;br /&gt;
===Pose matching===&lt;br /&gt;
The way we do animations is we almost universally start by copying the first or last frame of the preceeding animation. For this reason, we needed functionality that would allow us to snap the rig to an animated Oni character. The way it works, it that it uses bone constraints in rig controller bones targeting the character model in order to snap the rig to the model. The influence of the bone constraints is controlled through the Z location of Pose1 and Pose2 bones in the Pose Matching layer, which is done through drivers.&lt;br /&gt;
&lt;br /&gt;
To snap the rig to the animation in one of the Pose collections, simply move the appropriate Pose bone above the XY plane while in Pose mode.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pose1 and Pose2 below the XY plane !! Rig snapped to the animation in Pose 1 collection !! Rig snapped to the animation in Pose 2 collection&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Unposed.png|300px|frameless|center]] || [[Image:Pose1.png|300px|frameless|center]] || [[Image:Pose2.png|300px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Wrist snapping===&lt;br /&gt;
Often when using the IK handles for the arms you will find out that most of the time, you will need the hand to have the same rotation as the forearm. Normally this would mean that you would have to rotate the hands all the time, because IK handles are mainly moved around, and rotated later. For this reason, the wrist snapping functionality was implemented - you can simply copy the rotation of the forearm to the hand by pressing the &amp;quot;IK wrist&amp;quot; button.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Both of the hands after just moving them around... !! Effects of using the IK Wrist button&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:IK Wrist Example1.png|500px|frameless|center]] || [[Image:IK Wrist Example2.png|500px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Modding tutorials]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Blender&amp;diff=37814</id>
		<title>Blender</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Blender&amp;diff=37814"/>
		<updated>2022-05-16T08:57:27Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* History of modding with Blender */ It&amp;#039;s not that rigging never worked in XSI, it&amp;#039;s that we&amp;#039;ve never figured it out there. Also minor grammatical edits.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Blender is a free and open-source program used for 3D modeling, animating, rigging, texturing, video editing, digital drawing, etc. It is the community&#039;s current 3D software of choice for modding Oni.&lt;br /&gt;
&lt;br /&gt;
==History of modding with Blender==&lt;br /&gt;
[[Mod Tool|XSI Mod Tool 7.5]], a free version of Autodesk Softimage from 2009, had the fewest problems in handling Oni&#039;s assets and animations, it was relatively easy to learn and use. Up until 2019, it was Oni community&#039;s 3D program of choice.&lt;br /&gt;
&lt;br /&gt;
Blender at that time had a notoriously bad user interface and couldn&#039;t handle DAE files very well. [[#Oni-specific_issues_with_Blender|Besides other problems]], most importantly the expected rotation order and up-axis were different between XSI and Blender.&lt;br /&gt;
&lt;br /&gt;
After an interface overhaul in version 2.80 Blender&#039;s user-friendliness and [http://oni.bungie.org/forum/viewtopic.php?pid=52588#p52588 support for vertex shading in DAE] was improved. At the same time more and more users had problems to run XSI on their PCs.&lt;br /&gt;
&lt;br /&gt;
By 2019 demands got louder to support Blender made animations. [[OniSplit]] received an update (&amp;lt;tt&amp;gt;-blender&amp;lt;/tt&amp;gt;) so it could read such animations. Also, rigging was never fully figured out in XSI so between 2020 and 2022 an [[Using the Rigify animation rig|animation rig]] tailor-fit for making Oni animations - alongside a new addon named [[BlenderOni]] - was created. It was the last nail in the coffin of XSI.&lt;br /&gt;
&lt;br /&gt;
==Tutorials and resources==&lt;br /&gt;
With the abundance of tutorials for Blender on YouTube, creating our own introductory material would be reinventing the wheel. So instead we recommend watching some of the tutorials listed below and trying to make small personal projects in order to get familiar with Blender, such as modeling simple objects like teddy bears or tables.&lt;br /&gt;
&lt;br /&gt;
General Blender basics:&lt;br /&gt;
* [https://www.youtube.com/watch?v=RG8qK5zPqgM Wolf&#039;s 45-Minute Crash Course for Blender Virgins] (don&#039;t be misled by the silly name - this is one of the best Blender basics tutorials out there; it&#039;s also good if you know your basics already and you want to find out if you&#039;ve missed anything)&lt;br /&gt;
&lt;br /&gt;
Modelling:&lt;br /&gt;
* [https://www.youtube.com/watch?v=1jHUY3qoBu8 Learn Low Poly Modeling in Blender 2.83 (Imphenzia)]&lt;br /&gt;
&lt;br /&gt;
Rigging:&lt;br /&gt;
* [https://www.youtube.com/watch?v=vKgH5zXIYmM Rigify (CGDive)]&lt;br /&gt;
&lt;br /&gt;
Documentation:&lt;br /&gt;
* Blender has excellent documentation, available [https://docs.blender.org/manual/en/dev/modeling/meshes/editing/face/index.html HERE]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
[[Image:Blender_2.8_Python_Tooltips.png|thumb]]&lt;br /&gt;
You may want to go to the preferences and switch on &#039;&#039;&#039;Python Tooltips&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Contrary to what you might expect, the &#039;&#039;&#039;Developer Extras&#039;&#039;&#039; do not give you additional Python functionality per se. Instead this option enables experimental Blender features.&lt;br /&gt;
&lt;br /&gt;
Related videos:&lt;br /&gt;
* [https://youtu.be/XqX5wh4YeRw?t=46 Python Crash Course for Blender! (Curtis Holt)]&lt;br /&gt;
* [https://www.youtube.com/watch?v=uahfuypQQ04 Blender 2.8 Addon Development Tutorial for Beginners (Jayanam)]&lt;br /&gt;
&lt;br /&gt;
==Animation rig with IK and FK==&lt;br /&gt;
Currently we have an animation rig available in the form of a Blender scene available [http://mods.oni2.net/node/388 HERE]. The rig was made by Geyser and Delano762, and a tutorial on how to use it is available [[Using the Rigify animation rig|HERE]]. The rig is based on the Rigify plugin for Blender and serves as the &#039;&#039;&#039;community&#039;s modern tool to create new character animations for Oni&#039;&#039;&#039;, featuring both Forward and Inverse Kinematics – an enormous improvement over the previous FK-only method of animating.&lt;br /&gt;
&lt;br /&gt;
This rig is intended to be used together with [[#BlenderOni|BlenderOni]], a Blender addon designed as a companion tool for it – &#039;&#039;&#039;without it, the rig is extremely difficult to set up, to the point of being almost useless.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The rig has the following capabilities (which come with Rigify by default, unless otherwise noted):&lt;br /&gt;
* Snapping to Oni animations through bone constraints controlled by the Z location of the objects in the Pose Matching layer (added feature)&lt;br /&gt;
* Inverse and Forward Kinematics (IK and FK)&lt;br /&gt;
* Snapping between IK and FK chains&lt;br /&gt;
* Function to snap IK hand controller rotation to the wrist bone, integrated into rig_ui.py (added feature)&lt;br /&gt;
* IK joint poles for specifying limb joints (elbows and knees) should be facing&lt;br /&gt;
* Sliders specifying how much the neck, head and FK limbs should retain their world space rotation – that is, Neck Follow, Head Follow and FK Limb Follow&lt;br /&gt;
* IK foot pivoting controllers around toes and the heel&lt;br /&gt;
* Root bone&lt;br /&gt;
&lt;br /&gt;
===Tutorial for creating animation rig===&lt;br /&gt;
If you want to create the above rig, and learn a bit about rigs, IK/FK, Rigify, Blender, bone layers, bone constraints, scripts, issues with Oni models and animations such as the rotation order being incompatible with Blender, see [[Creating an animation rig in Blender]].&lt;br /&gt;
&lt;br /&gt;
==BlenderOni==&lt;br /&gt;
BlenderOni is a Blender addon intended as an integral companion tool for the fan-made animation rig for Blender. It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, the vast majority of the addon&#039;s options can also be used for general Blender purposes.&lt;br /&gt;
&lt;br /&gt;
For more information on BlenderOni, please check its documentation page available [[BlenderOni|HERE]].&lt;br /&gt;
&lt;br /&gt;
==Oni-specific issues with Blender==&lt;br /&gt;
===Rotation order===&lt;br /&gt;
The previous XSI process allowed us to get to work pretty quickly: you could simply export any animation from Oni as a COLLADA file using OniSplit, then import it to XSI and it would work (mostly) without any quirks. That is not the case with Blender. If you import any Oni animation into Blender as it is, the rotations will be all wrong.&lt;br /&gt;
&lt;br /&gt;
That&#039;s because Oni&#039;s rotations are stored in XYZ Euler rotation order, while Blender&#039;s XYZ is actually ZYX despite being called &amp;quot;XYZ&amp;quot;; this is because Blender reads the Euler angles [https://docs.blender.org/manual/en/latest/advanced/appendices/rotations.html from the bottom of the hierarchy] rather than the top. In other words, Oni reads XYZ starting with X, while Blender starts with Z.&lt;br /&gt;
&lt;br /&gt;
You can demonstrate this by simply switching the rotation order of the body parts from XYZ to ZYX, as shown below. The image on the left shows KONCOMcomb_p imported to Blender without any adjustments, with the rotation order set to Blender&#039;s default &amp;quot;XYZ&amp;quot;, while the image on the right shows the same animation after switching the rotation order to ZYX.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! KONCOMcomb_p in Blender&#039;s XYZ !! KONCOMcomb_p in ZYX&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ARB KONCOMcomb p XYZ.png|500px|frameless]]&lt;br /&gt;
| [[Image:ARB KONCOMcomb p ZYX.png|500px|frameless]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Because of this, geyser implemented the &#039;&#039;&#039;-blender&#039;&#039;&#039; argument in OniSplit, which solves this problem by converting Oni assets&#039; rotation order from XYZ to quaternions and then to ZYX, and vice versa when exporting assets from Blender to Oni. So that conversion flow looks as follows:&lt;br /&gt;
&lt;br /&gt;
*From Oni to Blender:&lt;br /&gt;
XYZ → Quaternions → ZYX&lt;br /&gt;
&lt;br /&gt;
*From Blender to Oni:&lt;br /&gt;
ZYX → Quaternions → XYZ&lt;br /&gt;
&lt;br /&gt;
To summarize: &#039;&#039;&#039;Always use the -blender argument when you&#039;re exporting assets from Oni to Blender&#039;&#039;&#039;, otherwise you can expect the problem shown in the above screenshots.&lt;br /&gt;
&lt;br /&gt;
===Differing up-axis===&lt;br /&gt;
To be expanded on later: Oni&#039;s &amp;quot;up&amp;quot; axis is Y, Blender&#039;s is Z.&lt;br /&gt;
&lt;br /&gt;
===Units===&lt;br /&gt;
To be expanded on later: Oni&#039;s units are in the imperial system, not the metric one, though the 0.1-meter unit used by OniSplit is a good approximation of Oni&#039;s actual world unit of 4 inches.&lt;br /&gt;
&lt;br /&gt;
===Lack of textures on animated models===&lt;br /&gt;
&#039;&#039;&#039;Currently there is no option in OniSplit for exporting animated models with textures.&#039;&#039;&#039; While you don&#039;t need textures for animating, they are very useful, particularly in the case of Oni; the models are low-detail to a point where you can lose sense of which direction elbows and knees are facing if you don&#039;t have the textures on. &lt;br /&gt;
&lt;br /&gt;
Because there is no option to export animated models with textures, &#039;&#039;&#039;the current workaround for that is to import an unanimated model with textures, then import an animated model,&#039;&#039;&#039; and either copy materials from the unanimated model to the animated one (the faster method), or set the materials on the animated model manually in the Shading tab.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Copying materials&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ABR_Copying_materials.png|200px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Alpha transparency issue===&lt;br /&gt;
You will also most likely need to set the Shading settings on some of the body parts of a non-animated model in order to fix alpha transparency issues (much like in XSI); specifically, you&#039;ll need to connect the Alpha parameter of the Base Color node to any parameter in Principled BSDF that will work, such as Emission Strength (this should be set up differently as that&#039;s technically incorrect, but I don&#039;t know how to do so at this moment).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Konoko upon importing to Blender !! Fixed transparency&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ABR Konoko broken alpha.png|200px|frameless|center]] || [[Image:ABR_Konoko_fixed_alpha.png|200px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Wanted==&lt;br /&gt;
Except for sounds, textures and text-oriented resources, Blender has the potential to be THE editor for Oni. Its powerful Python support is very useful for customization.&lt;br /&gt;
&lt;br /&gt;
Additional imports/exports, XML/.oni file creation and configurations should be automated, and customization should be used to streamline workflows as much as possible. Tools in the form of addons should allow users to be artists instead of coders, speeding up development of the actual projects.&lt;br /&gt;
&lt;br /&gt;
A successful modding community requires not one of these points, but all of them: documentation, tools and tutorials.&lt;br /&gt;
&lt;br /&gt;
===Level editor===&lt;br /&gt;
* core geometry&lt;br /&gt;
* pathfinding&lt;br /&gt;
* &amp;quot;furniture&amp;quot; (OFGA) creation/placement&lt;br /&gt;
* editing of CJBO&lt;br /&gt;
* special gunk flag placement&lt;br /&gt;
* basic level shading (vertex shading)&lt;br /&gt;
* advanced level shading for OniX?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OFGA library&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Objects that are used pretty often should be provided either by Blender Asset Browser or by a customized solution.&lt;br /&gt;
* Blender Asset Browser video demo: https://www.youtube.com/watch?v=gJC0y6HqyAU&lt;br /&gt;
&lt;br /&gt;
===BSL editor===&lt;br /&gt;
Most events in Oni are fired using trigger volumes. There should be an editor to open the code of a trigger volume as soon as it&#039;s selected in Blender.&lt;br /&gt;
&lt;br /&gt;
Also, character functions should editable when you select a character.&lt;br /&gt;
&lt;br /&gt;
The editor should be context-sensitive to:&lt;br /&gt;
* level geometry: atmosphere, save points, win level, lose level&lt;br /&gt;
* objects: scripting of static and animated objects (cutscene editor)&lt;br /&gt;
* particle scripting&lt;br /&gt;
* character: after selecting a character there should be a button visible to edit the ONCC, TRBS, animations and textures (GIMP/Photoshop).&lt;br /&gt;
&lt;br /&gt;
===Character editor===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Character library&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
There should be a way to place characters or character placeholders so that character collections (BINACHAR) can be saved to disk based on their positioning in the level model.&lt;br /&gt;
&lt;br /&gt;
===Animation editor===&lt;br /&gt;
The core would be BlenderOni that is called as soon as a user chooses to create or edit an animation. It could be extended to edit TRAC.&lt;br /&gt;
&lt;br /&gt;
===Particle editor===&lt;br /&gt;
A particle editor has been always missing in the community.&lt;br /&gt;
&lt;br /&gt;
===Testing and publishing support===&lt;br /&gt;
There should be some linking to Vago and AEI for package creation and quick starting of levels for testing.&lt;br /&gt;
&lt;br /&gt;
A secondary Oni installation could serve as a developer environment where only one level is present at a time. With OniX, it could be made possible to skip the menu UI and automatically load the current project.&lt;br /&gt;
 &lt;br /&gt;
[[Category:Bi-platform modding tools]][[Category:Completed modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37781</id>
		<title>BlenderOni</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37781"/>
		<updated>2022-05-15T21:48:36Z</updated>

		<summary type="html">&lt;p&gt;Delano762: Added Options, Use cases, changed History a bit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|style=&amp;quot;float:right&amp;quot;&lt;br /&gt;
|[[Image:Guido_-_Kon_face_07.jpg|thumb|150px|Note to self: no more pizza before bed! Nightmares! ]]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;BlenderOni&#039;&#039;&#039; is a [[Blender]] add-on intended as an integral companion tool for the [[Using_the_Rigify_animation_rig|Animation rig for Blender]]. It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, the vast majority of the add-on&#039;s options can also be used for general Blender tasks. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BlenderOni can be downloaded [http://mods.oni2.net/node/401 HERE.]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
When the Rigify-Oni rig was first released to the public, it was meant to be used together with a number of scripts stored within the Blender scene containing the rig. However, those scripts were not ideal - they were awkward to use as setting up the appropriate values was possible only by changing the script code.&lt;br /&gt;
&lt;br /&gt;
Those scripts have become obsolete with the introduction of BlenderOni, which is essentially little more than those scripts wrapped into a GUI. The scripts are nonetheless archived [[Blender/Obsolete scripts|HERE]] for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
==Options==&lt;br /&gt;
To be further described&lt;br /&gt;
===Bake Keyframe Rotation Mode===&lt;br /&gt;
&lt;br /&gt;
===Change Rotation Mode===&lt;br /&gt;
&lt;br /&gt;
===Adjust Throw Target===&lt;br /&gt;
&lt;br /&gt;
===Object Constraint Switch===&lt;br /&gt;
&lt;br /&gt;
===Bone Constraint Switch===&lt;br /&gt;
&lt;br /&gt;
===Object Visual Transformer===&lt;br /&gt;
&lt;br /&gt;
===Bone Visual Transformer===&lt;br /&gt;
&lt;br /&gt;
===Set Object Constraint Targets===&lt;br /&gt;
&lt;br /&gt;
===Set Rig Bone Constraint Targets===&lt;br /&gt;
&lt;br /&gt;
===Constrain Character Model===&lt;br /&gt;
&lt;br /&gt;
==Use cases==&lt;br /&gt;
To be further described, but probably best to link to the [[Using_the_Rigify_animation_rig|rig documentation]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Completed modding tools]][[Category:Bi-platform modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Blender&amp;diff=37777</id>
		<title>Blender</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Blender&amp;diff=37777"/>
		<updated>2022-05-15T19:12:21Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Tutorials and resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Blender is a free and open-source program used for 3D modeling, animating, rigging, texturing, video editing, digital drawing, etc. It is the community&#039;s current 3D software of choice for modding Oni.&lt;br /&gt;
&lt;br /&gt;
==History of modding with Blender==&lt;br /&gt;
Up until 2019, the Oni community&#039;s 3D program of choice was [[Mod Tool|XSI Mod Tool 7.5]], a free version of Autodesk Softimage from 2009. But Softimage was discontinued in 2014, so the community was using increasingly outdated software. XSI was the only free software that the community could make any sense of (although very limited), and it had no problems handling Oni&#039;s assets and animations, unlike other programs. Blender was overlooked because, despite its popularity, its user interface was notoriously bad. Also, attempts at importing Oni&#039;s assets to Blender ran into [[#Oni-specific_issues_with_Blender|a number of issues]] with unknown causes.&lt;br /&gt;
&lt;br /&gt;
However, Blender&#039;s user interface received a total overhaul in version 2.80 which was universally praised. The program has become a serious free alternative to industry-standard 3D programs like Maya or 3ds Max. This, along with the considerations that Blender continues to be actively developed, is a light-weight program, supports Macs as well as Windows, and has an abundance of support from the Blender community, eventually made it clear that Oni modders needed to move on from XSI to Blender. The final nails in the coffin were XSI&#039;s lack of stability and a limited amount of resources and tutorials to work with.&lt;br /&gt;
&lt;br /&gt;
From 2020 to 2022, a significant amount of work was done to allow modding Oni in Blender: the &amp;lt;tt&amp;gt;-blender&amp;lt;/tt&amp;gt; tag was introduced to [[OniSplit]], and a new [[Using the Rigify animation rig|animation rig]] tailor-fit for making Oni animations was created, along with [[BlenderOni]] – a companion tool for said rig. With all of this done, the community can now create new content for Oni in a modern, free, well-supported 3D modeler.&lt;br /&gt;
&lt;br /&gt;
==Tutorials and resources==&lt;br /&gt;
With the abundance of tutorials for Blender on YouTube, creating our own introductory material would be reinventing the wheel. So instead we recommend watching some of the tutorials listed below and trying to make small personal projects in order to get familiar with Blender, such as modeling simple objects like teddy bears or tables.&lt;br /&gt;
&lt;br /&gt;
General Blender basics:&lt;br /&gt;
* [https://www.youtube.com/watch?v=RG8qK5zPqgM Wolf&#039;s 45-Minute Crash Course for Blender Virgins] (don&#039;t be misled by the silly name - this is one of the best Blender basics tutorials out there; it&#039;s also good if you know your basics already and you want to find out if you&#039;ve missed anything)&lt;br /&gt;
&lt;br /&gt;
Modelling:&lt;br /&gt;
* [https://www.youtube.com/watch?v=1jHUY3qoBu8 Learn Low Poly Modeling in Blender 2.83 (Imphenzia)]&lt;br /&gt;
&lt;br /&gt;
Rigging:&lt;br /&gt;
* [https://www.youtube.com/watch?v=vKgH5zXIYmM Rigify (CGDive)]&lt;br /&gt;
&lt;br /&gt;
Documentation:&lt;br /&gt;
* Blender has excellent documentation, available [https://docs.blender.org/manual/en/dev/modeling/meshes/editing/face/index.html HERE]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
[[Image:Blender_2.8_Python_Tooltips.png|thumb]]&lt;br /&gt;
You may want to go to the preferences and switch on &#039;&#039;&#039;Python Tooltips&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Contrary to what you might expect, the &#039;&#039;&#039;Developer Extras&#039;&#039;&#039; do not give you additional Python functionality per se. Instead this option enables experimental Blender features.&lt;br /&gt;
&lt;br /&gt;
Related videos:&lt;br /&gt;
* [https://youtu.be/XqX5wh4YeRw?t=46 Python Crash Course for Blender! (Curtis Holt)]&lt;br /&gt;
* [https://www.youtube.com/watch?v=uahfuypQQ04 Blender 2.8 Addon Development Tutorial for Beginners (Jayanam)]&lt;br /&gt;
&lt;br /&gt;
==Animation rig with IK and FK==&lt;br /&gt;
Currently we have an animation rig available in the form of a Blender scene available [http://mods.oni2.net/node/388 HERE]. The rig was made by Geyser and Delano762, and a tutorial on how to use it is available [[Using the Rigify animation rig|HERE]]. The rig is based on the Rigify plugin for Blender and serves as the &#039;&#039;&#039;community&#039;s modern tool to create new character animations for Oni&#039;&#039;&#039;, featuring both Forward and Inverse Kinematics – an enormous improvement over the previous FK-only method of animating.&lt;br /&gt;
&lt;br /&gt;
This rig is intended to be used together with [[#BlenderOni|BlenderOni]], a Blender addon designed as a companion tool for it – &#039;&#039;&#039;without it, the rig is extremely difficult to set up, to the point of being almost useless.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The rig has the following capabilities (which come with Rigify by default, unless otherwise noted):&lt;br /&gt;
* Snapping to Oni animations through bone constraints controlled by the Z location of the objects in the Pose Matching layer (added feature)&lt;br /&gt;
* Inverse and Forward Kinematics (IK and FK)&lt;br /&gt;
* Snapping between IK and FK chains&lt;br /&gt;
* Function to snap IK hand controller rotation to the wrist bone, integrated into rig_ui.py (added feature)&lt;br /&gt;
* IK joint poles for specifying limb joints (elbows and knees) should be facing&lt;br /&gt;
* Sliders specifying how much the neck, head and FK limbs should retain their world space rotation – that is, Neck Follow, Head Follow and FK Limb Follow&lt;br /&gt;
* IK foot pivoting controllers around toes and the heel&lt;br /&gt;
* Root bone&lt;br /&gt;
&lt;br /&gt;
===Tutorial for creating animation rig===&lt;br /&gt;
If you want to create the above rig, and learn a bit about rigs, IK/FK, Rigify, Blender, bone layers, bone constraints, scripts, issues with Oni models and animations such as the rotation order being incompatible with Blender, see [[Creating an animation rig in Blender]].&lt;br /&gt;
&lt;br /&gt;
==BlenderOni==&lt;br /&gt;
BlenderOni is a Blender addon intended as an integral companion tool for the fan-made animation rig for Blender. It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, the vast majority of the addon&#039;s options can also be used for general Blender purposes.&lt;br /&gt;
&lt;br /&gt;
For more information on BlenderOni, please check its documentation page available [[BlenderOni|HERE]].&lt;br /&gt;
&lt;br /&gt;
==Oni-specific issues with Blender==&lt;br /&gt;
===Rotation order===&lt;br /&gt;
The previous XSI process allowed us to get to work pretty quickly: you could simply export any animation from Oni as a COLLADA file using OniSplit, then import it to XSI and it would work (mostly) without any quirks. That is not the case with Blender. If you import any Oni animation into Blender as it is, the rotations will be all wrong.&lt;br /&gt;
&lt;br /&gt;
That&#039;s because Oni&#039;s rotations are stored in XYZ Euler rotation order, while Blender&#039;s XYZ is actually ZYX despite being called &amp;quot;XYZ&amp;quot;; this is because Blender reads the Euler angles [https://docs.blender.org/manual/en/latest/advanced/appendices/rotations.html from the bottom of the hierarchy] rather than the top. In other words, Oni reads XYZ starting with X, while Blender starts with Z.&lt;br /&gt;
&lt;br /&gt;
You can demonstrate this by simply switching the rotation order of the body parts from XYZ to ZYX, as shown below. The image on the left shows KONCOMcomb_p imported to Blender without any adjustments, with the rotation order set to Blender&#039;s default &amp;quot;XYZ&amp;quot;, while the image on the right shows the same animation after switching the rotation order to ZYX.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! KONCOMcomb_p in Blender&#039;s XYZ !! KONCOMcomb_p in ZYX&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ARB KONCOMcomb p XYZ.png|500px|frameless]]&lt;br /&gt;
| [[Image:ARB KONCOMcomb p ZYX.png|500px|frameless]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Because of this, geyser implemented the &#039;&#039;&#039;-blender&#039;&#039;&#039; argument in OniSplit, which solves this problem by converting Oni assets&#039; rotation order from XYZ to quaternions and then to ZYX, and vice versa when exporting assets from Blender to Oni. So that conversion flow looks as follows:&lt;br /&gt;
&lt;br /&gt;
*From Oni to Blender:&lt;br /&gt;
XYZ → Quaternions → ZYX&lt;br /&gt;
&lt;br /&gt;
*From Blender to Oni:&lt;br /&gt;
ZYX → Quaternions → XYZ&lt;br /&gt;
&lt;br /&gt;
To summarize: &#039;&#039;&#039;Always use the -blender argument when you&#039;re exporting assets from Oni to Blender&#039;&#039;&#039;, otherwise you can expect the problem shown in the above screenshots.&lt;br /&gt;
&lt;br /&gt;
===Differing up-axis===&lt;br /&gt;
To be expanded on later: Oni&#039;s &amp;quot;up&amp;quot; axis is Y, Blender&#039;s is Z.&lt;br /&gt;
&lt;br /&gt;
===Units===&lt;br /&gt;
To be expanded on later: Oni&#039;s units are in the imperial system, not the metric one, though the 0.1-meter unit used by OniSplit is a good approximation of Oni&#039;s actual world unit of 4 inches.&lt;br /&gt;
&lt;br /&gt;
===Lack of textures on animated models===&lt;br /&gt;
&#039;&#039;&#039;Currently there is no option in OniSplit for exporting animated models with textures.&#039;&#039;&#039; While you don&#039;t need textures for animating, they are very useful, particularly in the case of Oni; the models are low-detail to a point where you can lose sense of which direction elbows and knees are facing if you don&#039;t have the textures on. &lt;br /&gt;
&lt;br /&gt;
Because there is no option to export animated models with textures, &#039;&#039;&#039;the current workaround for that is to import an unanimated model with textures, then import an animated model,&#039;&#039;&#039; and either copy materials from the unanimated model to the animated one (the faster method), or set the materials on the animated model manually in the Shading tab.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Copying materials&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ABR_Copying_materials.png|200px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Alpha transparency issue===&lt;br /&gt;
You will also most likely need to set the Shading settings on some of the body parts of a non-animated model in order to fix alpha transparency issues (much like in XSI); specifically, you&#039;ll need to connect the Alpha parameter of the Base Color node to any parameter in Principled BSDF that will work, such as Emission Strength (this should be set up differently as that&#039;s technically incorrect, but I don&#039;t know how to do so at this moment).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Konoko upon importing to Blender !! Fixed transparency&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ABR Konoko broken alpha.png|200px|frameless|center]] || [[Image:ABR_Konoko_fixed_alpha.png|200px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Wanted==&lt;br /&gt;
Except for sounds, textures and text-oriented resources, Blender has the potential to be THE editor for Oni. Its powerful Python support is very useful for customization.&lt;br /&gt;
&lt;br /&gt;
Additional imports/exports, XML/.oni file creation and configurations should be automated, and customization should be used to streamline workflows as much as possible. Tools in the form of addons should allow users to be artists instead of coders, speeding up development of the actual projects.&lt;br /&gt;
&lt;br /&gt;
A successful modding community requires not one of these points, but all of them: documentation, tools and tutorials.&lt;br /&gt;
&lt;br /&gt;
===Level editor===&lt;br /&gt;
* core geometry&lt;br /&gt;
* pathfinding&lt;br /&gt;
* &amp;quot;furniture&amp;quot; (OFGA) creation/placement&lt;br /&gt;
* editing of CJBO&lt;br /&gt;
* special gunk flag placement&lt;br /&gt;
* basic level shading (vertex shading)&lt;br /&gt;
* advanced level shading for OniX?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OFGA library&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Objects that are used pretty often should be provided either by Blender Asset Browser or by a customized solution.&lt;br /&gt;
* Blender Asset Browser video demo: https://www.youtube.com/watch?v=gJC0y6HqyAU&lt;br /&gt;
&lt;br /&gt;
===BSL editor===&lt;br /&gt;
Most events in Oni are fired using trigger volumes. There should be an editor to open the code of a trigger volume as soon as it&#039;s selected in Blender.&lt;br /&gt;
&lt;br /&gt;
Also, character functions should editable when you select a character.&lt;br /&gt;
&lt;br /&gt;
The editor should be context-sensitive to:&lt;br /&gt;
* level geometry: atmosphere, save points, win level, lose level&lt;br /&gt;
* objects: scripting of static and animated objects (cutscene editor)&lt;br /&gt;
* particle scripting&lt;br /&gt;
* character: after selecting a character there should be a button visible to edit the ONCC, TRBS, animations and textures (GIMP/Photoshop).&lt;br /&gt;
&lt;br /&gt;
===Character editor===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Character library&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
There should be a way to place characters or character placeholders so that character collections (BINACHAR) can be saved to disk based on their positioning in the level model.&lt;br /&gt;
&lt;br /&gt;
===Animation editor===&lt;br /&gt;
The core would be BlenderOni that is called as soon as a user chooses to create or edit an animation. It could be extended to edit TRAC.&lt;br /&gt;
&lt;br /&gt;
===Particle editor===&lt;br /&gt;
A particle editor has been always missing in the community.&lt;br /&gt;
&lt;br /&gt;
===Testing and publishing support===&lt;br /&gt;
There should be some linking to Vago and AEI for package creation and quick starting of levels for testing.&lt;br /&gt;
&lt;br /&gt;
A secondary Oni installation could serve as a developer environment where only one level is present at a time. With OniX, it could be made possible to skip the menu UI and automatically load the current project.&lt;br /&gt;
 &lt;br /&gt;
[[Category:Bi-platform modding tools]][[Category:Completed modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Blender&amp;diff=37776</id>
		<title>Blender</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Blender&amp;diff=37776"/>
		<updated>2022-05-15T18:45:47Z</updated>

		<summary type="html">&lt;p&gt;Delano762: Deleted the Blender 3.1 information box, changed &amp;quot;add-on&amp;quot; to &amp;quot;addon&amp;quot;, moved &amp;quot;Copying Materials&amp;quot; image to &amp;quot;Lack of textures on animated models&amp;quot; paragraph, deleted &amp;quot;Setting materials in Shading&amp;quot; as it was a duplicate for some reason&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Blender is a free and open-source program used for 3D modeling, animating, rigging, texturing, video editing, digital drawing, etc. It is the community&#039;s current 3D software of choice for modding Oni.&lt;br /&gt;
&lt;br /&gt;
==History of modding with Blender==&lt;br /&gt;
Up until 2019, the Oni community&#039;s 3D program of choice was [[Mod Tool|XSI Mod Tool 7.5]], a free version of Autodesk Softimage from 2009. But Softimage was discontinued in 2014, so the community was using increasingly outdated software. XSI was the only free software that the community could make any sense of (although very limited), and it had no problems handling Oni&#039;s assets and animations, unlike other programs. Blender was overlooked because, despite its popularity, its user interface was notoriously bad. Also, attempts at importing Oni&#039;s assets to Blender ran into [[#Oni-specific_issues_with_Blender|a number of issues]] with unknown causes.&lt;br /&gt;
&lt;br /&gt;
However, Blender&#039;s user interface received a total overhaul in version 2.80 which was universally praised. The program has become a serious free alternative to industry-standard 3D programs like Maya or 3ds Max. This, along with the considerations that Blender continues to be actively developed, is a light-weight program, supports Macs as well as Windows, and has an abundance of support from the Blender community, eventually made it clear that Oni modders needed to move on from XSI to Blender. The final nails in the coffin were XSI&#039;s lack of stability and a limited amount of resources and tutorials to work with.&lt;br /&gt;
&lt;br /&gt;
From 2020 to 2022, a significant amount of work was done to allow modding Oni in Blender: the &amp;lt;tt&amp;gt;-blender&amp;lt;/tt&amp;gt; tag was introduced to [[OniSplit]], and a new [[Using the Rigify animation rig|animation rig]] tailor-fit for making Oni animations was created, along with [[BlenderOni]] – a companion tool for said rig. With all of this done, the community can now create new content for Oni in a modern, free, well-supported 3D modeler.&lt;br /&gt;
&lt;br /&gt;
==Tutorials and resources==&lt;br /&gt;
With the abundance of tutorials for Blender on YouTube, creating our own introductory material would be reinventing the wheel. So instead we recommend watching some of the tutorials listed below and trying to make small personal projects in order to get familiar with Blender, such as modeling simple objects like teddy bears or tables.&lt;br /&gt;
&lt;br /&gt;
General Blender basics:&lt;br /&gt;
* [https://www.youtube.com/watch?v=RG8qK5zPqgM Wolf&#039;s 45-Minute Crash Course for Blender Virgins] (don&#039;t get this is one of the best Blender basics tutorials out there; it&#039;s also good if you know your basics already and you want to find out if you&#039;ve missed anything)&lt;br /&gt;
&lt;br /&gt;
Modelling:&lt;br /&gt;
* [https://www.youtube.com/watch?v=1jHUY3qoBu8 Learn Low Poly Modeling in Blender 2.83 (Imphenzia)]&lt;br /&gt;
&lt;br /&gt;
Rigging:&lt;br /&gt;
* [https://www.youtube.com/watch?v=vKgH5zXIYmM Rigify (CGDive)]&lt;br /&gt;
&lt;br /&gt;
Documentation:&lt;br /&gt;
* Blender has excellent documentation, available [https://docs.blender.org/manual/en/dev/modeling/meshes/editing/face/index.html HERE]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
[[Image:Blender_2.8_Python_Tooltips.png|thumb]]&lt;br /&gt;
You may want to go to the preferences and switch on &#039;&#039;&#039;Python Tooltips&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Contrary to what you might expect, the &#039;&#039;&#039;Developer Extras&#039;&#039;&#039; do not give you additional Python functionality per se. Instead this option enables experimental Blender features.&lt;br /&gt;
&lt;br /&gt;
Related videos:&lt;br /&gt;
* [https://youtu.be/XqX5wh4YeRw?t=46 Python Crash Course for Blender! (Curtis Holt)]&lt;br /&gt;
* [https://www.youtube.com/watch?v=uahfuypQQ04 Blender 2.8 Addon Development Tutorial for Beginners (Jayanam)]&lt;br /&gt;
&lt;br /&gt;
==Animation rig with IK and FK==&lt;br /&gt;
Currently we have an animation rig available in the form of a Blender scene available [http://mods.oni2.net/node/388 HERE]. The rig was made by Geyser and Delano762, and a tutorial on how to use it is available [[Using the Rigify animation rig|HERE]]. The rig is based on the Rigify plugin for Blender and serves as the &#039;&#039;&#039;community&#039;s modern tool to create new character animations for Oni&#039;&#039;&#039;, featuring both Forward and Inverse Kinematics – an enormous improvement over the previous FK-only method of animating.&lt;br /&gt;
&lt;br /&gt;
This rig is intended to be used together with [[#BlenderOni|BlenderOni]], a Blender addon designed as a companion tool for it – &#039;&#039;&#039;without it, the rig is extremely difficult to set up, to the point of being almost useless.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The rig has the following capabilities (which come with Rigify by default, unless otherwise noted):&lt;br /&gt;
* Snapping to Oni animations through bone constraints controlled by the Z location of the objects in the Pose Matching layer (added feature)&lt;br /&gt;
* Inverse and Forward Kinematics (IK and FK)&lt;br /&gt;
* Snapping between IK and FK chains&lt;br /&gt;
* Function to snap IK hand controller rotation to the wrist bone, integrated into rig_ui.py (added feature)&lt;br /&gt;
* IK joint poles for specifying limb joints (elbows and knees) should be facing&lt;br /&gt;
* Sliders specifying how much the neck, head and FK limbs should retain their world space rotation – that is, Neck Follow, Head Follow and FK Limb Follow&lt;br /&gt;
* IK foot pivoting controllers around toes and the heel&lt;br /&gt;
* Root bone&lt;br /&gt;
&lt;br /&gt;
===Tutorial for creating animation rig===&lt;br /&gt;
If you want to create the above rig, and learn a bit about rigs, IK/FK, Rigify, Blender, bone layers, bone constraints, scripts, issues with Oni models and animations such as the rotation order being incompatible with Blender, see [[Creating an animation rig in Blender]].&lt;br /&gt;
&lt;br /&gt;
==BlenderOni==&lt;br /&gt;
BlenderOni is a Blender addon intended as an integral companion tool for the fan-made animation rig for Blender. It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, the vast majority of the addon&#039;s options can also be used for general Blender purposes.&lt;br /&gt;
&lt;br /&gt;
For more information on BlenderOni, please check its documentation page available [[BlenderOni|HERE]].&lt;br /&gt;
&lt;br /&gt;
==Oni-specific issues with Blender==&lt;br /&gt;
===Rotation order===&lt;br /&gt;
The previous XSI process allowed us to get to work pretty quickly: you could simply export any animation from Oni as a COLLADA file using OniSplit, then import it to XSI and it would work (mostly) without any quirks. That is not the case with Blender. If you import any Oni animation into Blender as it is, the rotations will be all wrong.&lt;br /&gt;
&lt;br /&gt;
That&#039;s because Oni&#039;s rotations are stored in XYZ Euler rotation order, while Blender&#039;s XYZ is actually ZYX despite being called &amp;quot;XYZ&amp;quot;; this is because Blender reads the Euler angles [https://docs.blender.org/manual/en/latest/advanced/appendices/rotations.html from the bottom of the hierarchy] rather than the top. In other words, Oni reads XYZ starting with X, while Blender starts with Z.&lt;br /&gt;
&lt;br /&gt;
You can demonstrate this by simply switching the rotation order of the body parts from XYZ to ZYX, as shown below. The image on the left shows KONCOMcomb_p imported to Blender without any adjustments, with the rotation order set to Blender&#039;s default &amp;quot;XYZ&amp;quot;, while the image on the right shows the same animation after switching the rotation order to ZYX.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! KONCOMcomb_p in Blender&#039;s XYZ !! KONCOMcomb_p in ZYX&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ARB KONCOMcomb p XYZ.png|500px|frameless]]&lt;br /&gt;
| [[Image:ARB KONCOMcomb p ZYX.png|500px|frameless]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Because of this, geyser implemented the &#039;&#039;&#039;-blender&#039;&#039;&#039; argument in OniSplit, which solves this problem by converting Oni assets&#039; rotation order from XYZ to quaternions and then to ZYX, and vice versa when exporting assets from Blender to Oni. So that conversion flow looks as follows:&lt;br /&gt;
&lt;br /&gt;
*From Oni to Blender:&lt;br /&gt;
XYZ → Quaternions → ZYX&lt;br /&gt;
&lt;br /&gt;
*From Blender to Oni:&lt;br /&gt;
ZYX → Quaternions → XYZ&lt;br /&gt;
&lt;br /&gt;
To summarize: &#039;&#039;&#039;Always use the -blender argument when you&#039;re exporting assets from Oni to Blender&#039;&#039;&#039;, otherwise you can expect the problem shown in the above screenshots.&lt;br /&gt;
&lt;br /&gt;
===Differing up-axis===&lt;br /&gt;
To be expanded on later: Oni&#039;s &amp;quot;up&amp;quot; axis is Y, Blender&#039;s is Z.&lt;br /&gt;
&lt;br /&gt;
===Units===&lt;br /&gt;
To be expanded on later: Oni&#039;s units are in the imperial system, not the metric one, though the 0.1-meter unit used by OniSplit is a good approximation of Oni&#039;s actual world unit of 4 inches.&lt;br /&gt;
&lt;br /&gt;
===Lack of textures on animated models===&lt;br /&gt;
&#039;&#039;&#039;Currently there is no option in OniSplit for exporting animated models with textures.&#039;&#039;&#039; While you don&#039;t need textures for animating, they are very useful, particularly in the case of Oni; the models are low-detail to a point where you can lose sense of which direction elbows and knees are facing if you don&#039;t have the textures on. &lt;br /&gt;
&lt;br /&gt;
Because there is no option to export animated models with textures, &#039;&#039;&#039;the current workaround for that is to import an unanimated model with textures, then import an animated model,&#039;&#039;&#039; and either copy materials from the unanimated model to the animated one (the faster method), or set the materials on the animated model manually in the Shading tab.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Copying materials&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ABR_Copying_materials.png|200px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Alpha transparency issue===&lt;br /&gt;
You will also most likely need to set the Shading settings on some of the body parts of a non-animated model in order to fix alpha transparency issues (much like in XSI); specifically, you&#039;ll need to connect the Alpha parameter of the Base Color node to any parameter in Principled BSDF that will work, such as Emission Strength (this should be set up differently as that&#039;s technically incorrect, but I don&#039;t know how to do so at this moment).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Konoko upon importing to Blender !! Fixed transparency&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ABR Konoko broken alpha.png|200px|frameless|center]] || [[Image:ABR_Konoko_fixed_alpha.png|200px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Wanted==&lt;br /&gt;
Except for sounds, textures and text-oriented resources, Blender has the potential to be THE editor for Oni. Its powerful Python support is very useful for customization.&lt;br /&gt;
&lt;br /&gt;
Additional imports/exports, XML/.oni file creation and configurations should be automated, and customization should be used to streamline workflows as much as possible. Tools in the form of addons should allow users to be artists instead of coders, speeding up development of the actual projects.&lt;br /&gt;
&lt;br /&gt;
A successful modding community requires not one of these points, but all of them: documentation, tools and tutorials.&lt;br /&gt;
&lt;br /&gt;
===Level editor===&lt;br /&gt;
* core geometry&lt;br /&gt;
* pathfinding&lt;br /&gt;
* &amp;quot;furniture&amp;quot; (OFGA) creation/placement&lt;br /&gt;
* editing of CJBO&lt;br /&gt;
* special gunk flag placement&lt;br /&gt;
* basic level shading (vertex shading)&lt;br /&gt;
* advanced level shading for OniX?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OFGA library&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Objects that are used pretty often should be provided either by Blender Asset Browser or by a customized solution.&lt;br /&gt;
* Blender Asset Browser video demo: https://www.youtube.com/watch?v=gJC0y6HqyAU&lt;br /&gt;
&lt;br /&gt;
===BSL editor===&lt;br /&gt;
Most events in Oni are fired using trigger volumes. There should be an editor to open the code of a trigger volume as soon as it&#039;s selected in Blender.&lt;br /&gt;
&lt;br /&gt;
Also, character functions should editable when you select a character.&lt;br /&gt;
&lt;br /&gt;
The editor should be context-sensitive to:&lt;br /&gt;
* level geometry: atmosphere, save points, win level, lose level&lt;br /&gt;
* objects: scripting of static and animated objects (cutscene editor)&lt;br /&gt;
* particle scripting&lt;br /&gt;
* character: after selecting a character there should be a button visible to edit the ONCC, TRBS, animations and textures (GIMP/Photoshop).&lt;br /&gt;
&lt;br /&gt;
===Character editor===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Character library&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
There should be a way to place characters or character placeholders so that character collections (BINACHAR) can be saved to disk based on their positioning in the level model.&lt;br /&gt;
&lt;br /&gt;
===Animation editor===&lt;br /&gt;
The core would be BlenderOni that is called as soon as a user chooses to create or edit an animation. It could be extended to edit TRAC.&lt;br /&gt;
&lt;br /&gt;
===Particle editor===&lt;br /&gt;
A particle editor has been always missing in the community.&lt;br /&gt;
&lt;br /&gt;
===Testing and publishing support===&lt;br /&gt;
There should be some linking to Vago and AEI for package creation and quick starting of levels for testing.&lt;br /&gt;
&lt;br /&gt;
A secondary Oni installation could serve as a developer environment where only one level is present at a time. With OniX, it could be made possible to skip the menu UI and automatically load the current project.&lt;br /&gt;
 &lt;br /&gt;
[[Category:Bi-platform modding tools]][[Category:Completed modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Blender&amp;diff=37749</id>
		<title>Blender</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Blender&amp;diff=37749"/>
		<updated>2022-05-14T17:28:00Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Oni-specific issues with Blender */ Updated info on rotation order issues backing it up with Blender manual, also added &amp;quot;&amp;quot;Up&amp;quot; axis problem&amp;quot; and &amp;quot;Units&amp;quot; subheaders&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{fmbox&lt;br /&gt;
  | text = This page should contain information up to date for Blender version 3.1.&lt;br /&gt;
  }}&lt;br /&gt;
Blender is a free and open-source 3D computer graphics software toolset used for 3D modeling, animating, rigging, texturing, video editing, digital drawing, etc. It is the community&#039;s current 3D software of choice for modding Oni.&lt;br /&gt;
&lt;br /&gt;
==History of Blender in Oni community==&lt;br /&gt;
Up until 2019, the community&#039;s 3D program of choice was [[Mod Tool|XSI Mod Tool 7.5]], a free version of Autodesk Softimage from 2009. Softimage itself became discontinued in 2014, so the community was using a horribly outdated software for a long period of time. The reasons for that were two: XSI was the only software that the community could make any sense of (although very limited) and it had no problems handling Oni&#039;s assets and animations, unlike other programs.&lt;br /&gt;
&lt;br /&gt;
Blender during that time, although available, was widely considered as a trivia, rather than a serious 3D software. Reasons for that were multiple, with the most known being its infamously notorious user interface used up to Blender 2.79. In case of Oni, another prime reason for not using it was that [[#Oni-specific_issues_with_Blender|importing Oni&#039;s assets to Blender was causing a number of issues]], the causes of which were unknown at the time.&lt;br /&gt;
&lt;br /&gt;
However, Blender&#039;s user interface received a total overhaul in version 2.80, which was universally praised. This, along with the updates that Blender is receiving to this day, its light weight and countless tutorials on Youtube, made it effectively a serious competitor to the industry-standard 3D programs like Maya or 3DS Max.&lt;br /&gt;
&lt;br /&gt;
With Blender having become significantly more user-friendly and popular, it became more and more clear that it was necessary for the community to move on from XSI to Blender. The final straw was that it became clear that using XSI was ridiculously ineffcient, due to outdated methods used to create assets and XSI being bugged.&lt;br /&gt;
&lt;br /&gt;
From 2020 to 2022 a significant amount of work was done to allow modding Oni in Blender: the -blender tag was introduced to [[OniSplit]], which allowed to convert Oni assets in a way so that they can be imported to Blender, a new [[Using_the_Rigify_animation_rig|animation rig]] tailor-fit for making Oni animations was created, along with [[BlenderOni]] - a companion tool for the said rig. With all of this done, the community can now create new content for Oni in a modern, free, commonly used and open source 3D software.&lt;br /&gt;
&lt;br /&gt;
==How to use Blender? Tutorials and resources==&lt;br /&gt;
With the abundance of tutorials for Blender on Youtube, writing down tutorials on the basics of it would be reinventing the wheel, and a worse one at that. So instead, we recommend watching some of the tutorials listed below and trying to do some simple personal projects to get familiar with Blender, such as modeling simple objects like teddy bears or tables.&lt;br /&gt;
&lt;br /&gt;
General Blender basics:&lt;br /&gt;
* [https://www.youtube.com/watch?v=RG8qK5zPqgM Wolf&#039;s 45-Minute Crash Course for Blender Virgins] (yes, seriously - this is one of the best Blender basics tutorials out there, it&#039;s particularly good if you know your basics already and you want to find out if you&#039;ve missed anything)&lt;br /&gt;
&lt;br /&gt;
Modelling&lt;br /&gt;
* [https://www.youtube.com/watch?v=1jHUY3qoBu8 Learn Low Poly Modeling in Blender 2.83 (Imphenzia)]&lt;br /&gt;
&lt;br /&gt;
Rigging&lt;br /&gt;
* [https://www.youtube.com/watch?v=vKgH5zXIYmM Rigify (CGDive)]&lt;br /&gt;
&lt;br /&gt;
Documentation&lt;br /&gt;
* Blender has excellent documentation, available [https://docs.blender.org/manual/en/dev/modeling/meshes/editing/face/index.html HERE]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
[[Image:Blender_2.8_Python_Tooltips.png|thumb]]&lt;br /&gt;
You may want to go to the preferences and switch on &#039;&#039;&#039;Python Tooltips&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Contrary to intuition, the &#039;&#039;&#039;Developer Extras&#039;&#039;&#039; do not give you additional Python functionality per se. Instead this option enables experimental Blender features.&lt;br /&gt;
&lt;br /&gt;
Related videos:&lt;br /&gt;
* [https://youtu.be/XqX5wh4YeRw?t=46 Python Crash Course for Blender! - Curtis Holt]&lt;br /&gt;
* [https://www.youtube.com/watch?v=uahfuypQQ04 Blender 2.8 Addon Development Tutorial for Beginners - Jayanam]&lt;br /&gt;
&lt;br /&gt;
==Animation rig with IK and FK==&lt;br /&gt;
Currently we have an animation rig available in the form of a Blender scene available [http://mods.oni2.net/node/388 HERE]. The rig was made by Geyser and Delano762, and a tutorial on how to use it is available [[Using_the_Rigify_animation_rig|HERE.]] The rig is based off the Rigify plugin for Blender, and serves as the &#039;&#039;&#039;community&#039;s modern tool to create new character animations for Oni,&#039;&#039;&#039; featuring both Forward and Inverse Kinematics, thus being an enormous improvement over the previous FK-only method of animating.&lt;br /&gt;
&lt;br /&gt;
This rig is intended to be used together with [[#BlenderOni|BlenderOni]], a Blender addon designed as a companion tool for it - &#039;&#039;&#039;the rig is extremely difficult to set up without it, to the point of being almost useless.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The rig has the following capabilities (which come with Rigify by default, unless otherwise noted):&lt;br /&gt;
* Snapping to Oni animations through bone constraints controlled by the Z location of the objects in the Pose Matching layer (added feature)&lt;br /&gt;
* Inverse and Forward Kinematics (IK and FK)&lt;br /&gt;
* Snapping between IK and FK chains&lt;br /&gt;
* Function to snap IK hand controller rotation to the wrist bone, integrated into rig_ui.py (added feature)&lt;br /&gt;
* IK joint poles for specifying limb joints (elbows and knees) should be facing&lt;br /&gt;
* Sliders specifying how much the neck, head and FK limbs should retain their world space rotation – that is, Neck Follow, Head Follow and FK Limb Follow&lt;br /&gt;
* IK foot pivoting controllers around toes and the heel&lt;br /&gt;
* Root bone&lt;br /&gt;
&lt;br /&gt;
===Tutorial for creating animation rig===&lt;br /&gt;
If you want to create the above rig, and learn a bit about rigs, IK/FK, Rigify, Blender, bone layers, bone constraints, scripts, issues with Oni models and animations such as the rotation order being incompatible with Blender, see [[Creating an animation rig in Blender]].&lt;br /&gt;
&lt;br /&gt;
==BlenderOni==&lt;br /&gt;
BlenderOni is a Blender addon intented as an integral companion tool for the Animation rig for Blender. It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, vast majority of addon&#039;s options can also be used for general Blender purposes.&lt;br /&gt;
&lt;br /&gt;
For more information on BlenderOni, please check its documentation page available [[BlenderOni|HERE]].&lt;br /&gt;
&lt;br /&gt;
==Oni-specific issues with Blender==&lt;br /&gt;
===Rotation order issue between Oni and Blender===&lt;br /&gt;
The previous XSI process allowed us to get to work pretty quickly: you could simply export any animation from Oni as a COLLADA file using OniSplit, then import it to XSI and it would work (mostly) without any quirks. That is not the case with Blender.&lt;br /&gt;
&lt;br /&gt;
If you import any Oni animation into Blender as it is, the rotations will be all wrong.&lt;br /&gt;
&lt;br /&gt;
That&#039;s because Oni&#039;s rotations are stored in XYZ Euler rotation order, while Blender&#039;s XYZ is actually ZYX despite being called &amp;quot;XYZ&amp;quot; - and this is because Blender reads the Euler angles from the bottom of the hierarchy, rather than the top: &lt;br /&gt;
&lt;br /&gt;
{{Quote|Which axis is on top, which one in the middle and which at the bottom, depends on the particular Euler gimbal: there are six types of them, as there are six possible combinations: XYZ, XZY, YXZ, YZX, ZXY and ZYX Euler rotation modes. &#039;&#039;&#039;These modes are named using the letters of the axes in order, starting from the axis at the bottom of the hierarchy, and finishing with the one on top.&#039;&#039;&#039;|[https://docs.blender.org/manual/en/latest/advanced/appendices/rotations.html Blender Manual, Rotation Modes] }}&lt;br /&gt;
&lt;br /&gt;
In other words, Oni reads XYZ as X first, Y second and then finally Z, while Blender does reverse, it reads XYZ as Z first, Y second and Z as the last angle.&lt;br /&gt;
&lt;br /&gt;
You can prove that by simply switching the rotation order of the body parts from XYZ to ZYX, as shown below – the image on the left shows KONCOMcomb_p imported to Blender without any adjustments, with the rotation order set to Blender&#039;s default &amp;quot;XYZ&amp;quot;, while the image on the right shows the same animation after switching the rotation order to ZYX.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! KONCOMcomb_p in Blender&#039;s XYZ !! KONCOMcomb_p in ZYX&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ARB KONCOMcomb p XYZ.png|500px|frameless]]&lt;br /&gt;
| [[Image:ARB KONCOMcomb p ZYX.png|500px|frameless]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Because of this, geyser implemented the &#039;&#039;&#039;-blender&#039;&#039;&#039; argument in OniSplit, which solves this problem by converting Oni assets&#039; rotation order from XYZ to Quaternions and then to ZYX, and vice versa when exporting assets from Blender to Oni. So that conversion flow looks as follows:&lt;br /&gt;
&lt;br /&gt;
*From Oni to Blender:&lt;br /&gt;
XYZ → Quaternions → ZYX&lt;br /&gt;
&lt;br /&gt;
*From Blender to Oni:&lt;br /&gt;
ZYX → Quaternions → XYZ&lt;br /&gt;
&lt;br /&gt;
To summarize: &#039;&#039;&#039;Always use the -blender argument when you&#039;re exporting assets from Oni to Blender&#039;&#039;&#039;, otherwise you can expect the problem shown in the above screenshots.&lt;br /&gt;
&lt;br /&gt;
===&amp;quot;Up&amp;quot; axis problem===&lt;br /&gt;
To be further described, Oni&#039;s up axis is Y, for Blender it&#039;s Z&lt;br /&gt;
&lt;br /&gt;
===Units===&lt;br /&gt;
To be further described, Oni&#039;s units are actually feet and yards&lt;br /&gt;
&lt;br /&gt;
===Broken alpha transparency and textures on animated models===&lt;br /&gt;
&#039;&#039;&#039;Currently there is no option in OniSplit that would allow exporting animated models with textures.&#039;&#039;&#039; While you don&#039;t need textures for animating, they are very useful, particularly in case of Oni - the models are low detail to a point where you can lose sense of which direction elbows and knees are facing, if you don&#039;t have the textures on. &lt;br /&gt;
&lt;br /&gt;
Because there is no option to export animated models with textures, &#039;&#039;&#039;the current workaround for that is to import an unanimated model with textures, then import an animated model,&#039;&#039;&#039; and either copy materials from the unanimated model to the animated one (the faster method), or set the materials on the animated model manually.&lt;br /&gt;
&lt;br /&gt;
You will also most likely need to set shading settings on some body parts on the unanimated model to fix Alpha transparency issues (much like in XSI) - specifically connect the Alpha parameter of Base Color node to any parameter in Principled BSDF that will work, like Emission Strength (this should be set up differently as that&#039;s technically incorrect, but I don&#039;t know how at this moment).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Konoko upon importing to Blender !! Fixed transparency !! Copying materials !! Setting materials in Shading&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ABR Konoko broken alpha.png|200px|frameless|center]] || [[Image:ABR_Konoko_fixed_alpha.png|200px|frameless|center]] || [[Image:ABR_Copying_materials.png|200px|frameless|center]] || [[Image:ABR Konoko fixed alpha.png|200px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Bi-platform modding tools]][[Category:Completed modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Blender&amp;diff=37748</id>
		<title>Blender</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Blender&amp;diff=37748"/>
		<updated>2022-05-14T17:14:29Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Rotation order issue between Oni and Blender */ Updated info on rotation order issue between Oni and Blender&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{fmbox&lt;br /&gt;
  | text = This page should contain information up to date for Blender version 3.1.&lt;br /&gt;
  }}&lt;br /&gt;
Blender is a free and open-source 3D computer graphics software toolset used for 3D modeling, animating, rigging, texturing, video editing, digital drawing, etc. It is the community&#039;s current 3D software of choice for modding Oni.&lt;br /&gt;
&lt;br /&gt;
==History of Blender in Oni community==&lt;br /&gt;
Up until 2019, the community&#039;s 3D program of choice was [[Mod Tool|XSI Mod Tool 7.5]], a free version of Autodesk Softimage from 2009. Softimage itself became discontinued in 2014, so the community was using a horribly outdated software for a long period of time. The reasons for that were two: XSI was the only software that the community could make any sense of (although very limited) and it had no problems handling Oni&#039;s assets and animations, unlike other programs.&lt;br /&gt;
&lt;br /&gt;
Blender during that time, although available, was widely considered as a trivia, rather than a serious 3D software. Reasons for that were multiple, with the most known being its infamously notorious user interface used up to Blender 2.79. In case of Oni, another prime reason for not using it was that [[#Oni-specific_issues_with_Blender|importing Oni&#039;s assets to Blender was causing a number of issues]], the causes of which were unknown at the time.&lt;br /&gt;
&lt;br /&gt;
However, Blender&#039;s user interface received a total overhaul in version 2.80, which was universally praised. This, along with the updates that Blender is receiving to this day, its light weight and countless tutorials on Youtube, made it effectively a serious competitor to the industry-standard 3D programs like Maya or 3DS Max.&lt;br /&gt;
&lt;br /&gt;
With Blender having become significantly more user-friendly and popular, it became more and more clear that it was necessary for the community to move on from XSI to Blender. The final straw was that it became clear that using XSI was ridiculously ineffcient, due to outdated methods used to create assets and XSI being bugged.&lt;br /&gt;
&lt;br /&gt;
From 2020 to 2022 a significant amount of work was done to allow modding Oni in Blender: the -blender tag was introduced to [[OniSplit]], which allowed to convert Oni assets in a way so that they can be imported to Blender, a new [[Using_the_Rigify_animation_rig|animation rig]] tailor-fit for making Oni animations was created, along with [[BlenderOni]] - a companion tool for the said rig. With all of this done, the community can now create new content for Oni in a modern, free, commonly used and open source 3D software.&lt;br /&gt;
&lt;br /&gt;
==How to use Blender? Tutorials and resources==&lt;br /&gt;
With the abundance of tutorials for Blender on Youtube, writing down tutorials on the basics of it would be reinventing the wheel, and a worse one at that. So instead, we recommend watching some of the tutorials listed below and trying to do some simple personal projects to get familiar with Blender, such as modeling simple objects like teddy bears or tables.&lt;br /&gt;
&lt;br /&gt;
General Blender basics:&lt;br /&gt;
* [https://www.youtube.com/watch?v=RG8qK5zPqgM Wolf&#039;s 45-Minute Crash Course for Blender Virgins] (yes, seriously - this is one of the best Blender basics tutorials out there, it&#039;s particularly good if you know your basics already and you want to find out if you&#039;ve missed anything)&lt;br /&gt;
&lt;br /&gt;
Modelling&lt;br /&gt;
* [https://www.youtube.com/watch?v=1jHUY3qoBu8 Learn Low Poly Modeling in Blender 2.83 (Imphenzia)]&lt;br /&gt;
&lt;br /&gt;
Rigging&lt;br /&gt;
* [https://www.youtube.com/watch?v=vKgH5zXIYmM Rigify (CGDive)]&lt;br /&gt;
&lt;br /&gt;
Documentation&lt;br /&gt;
* Blender has excellent documentation, available [https://docs.blender.org/manual/en/dev/modeling/meshes/editing/face/index.html HERE]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
[[Image:Blender_2.8_Python_Tooltips.png|thumb]]&lt;br /&gt;
You may want to go to the preferences and switch on &#039;&#039;&#039;Python Tooltips&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Contrary to intuition, the &#039;&#039;&#039;Developer Extras&#039;&#039;&#039; do not give you additional Python functionality per se. Instead this option enables experimental Blender features.&lt;br /&gt;
&lt;br /&gt;
Related videos:&lt;br /&gt;
* [https://youtu.be/XqX5wh4YeRw?t=46 Python Crash Course for Blender! - Curtis Holt]&lt;br /&gt;
* [https://www.youtube.com/watch?v=uahfuypQQ04 Blender 2.8 Addon Development Tutorial for Beginners - Jayanam]&lt;br /&gt;
&lt;br /&gt;
==Animation rig with IK and FK==&lt;br /&gt;
Currently we have an animation rig available in the form of a Blender scene available [http://mods.oni2.net/node/388 HERE]. The rig was made by Geyser and Delano762, and a tutorial on how to use it is available [[Using_the_Rigify_animation_rig|HERE.]] The rig is based off the Rigify plugin for Blender, and serves as the &#039;&#039;&#039;community&#039;s modern tool to create new character animations for Oni,&#039;&#039;&#039; featuring both Forward and Inverse Kinematics, thus being an enormous improvement over the previous FK-only method of animating.&lt;br /&gt;
&lt;br /&gt;
This rig is intended to be used together with [[#BlenderOni|BlenderOni]], a Blender addon designed as a companion tool for it - &#039;&#039;&#039;the rig is extremely difficult to set up without it, to the point of being almost useless.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The rig has the following capabilities (which come with Rigify by default, unless otherwise noted):&lt;br /&gt;
* Snapping to Oni animations through bone constraints controlled by the Z location of the objects in the Pose Matching layer (added feature)&lt;br /&gt;
* Inverse and Forward Kinematics (IK and FK)&lt;br /&gt;
* Snapping between IK and FK chains&lt;br /&gt;
* Function to snap IK hand controller rotation to the wrist bone, integrated into rig_ui.py (added feature)&lt;br /&gt;
* IK joint poles for specifying limb joints (elbows and knees) should be facing&lt;br /&gt;
* Sliders specifying how much the neck, head and FK limbs should retain their world space rotation – that is, Neck Follow, Head Follow and FK Limb Follow&lt;br /&gt;
* IK foot pivoting controllers around toes and the heel&lt;br /&gt;
* Root bone&lt;br /&gt;
&lt;br /&gt;
===Tutorial for creating animation rig===&lt;br /&gt;
If you want to create the above rig, and learn a bit about rigs, IK/FK, Rigify, Blender, bone layers, bone constraints, scripts, issues with Oni models and animations such as the rotation order being incompatible with Blender, see [[Creating an animation rig in Blender]].&lt;br /&gt;
&lt;br /&gt;
==BlenderOni==&lt;br /&gt;
BlenderOni is a Blender addon intented as an integral companion tool for the Animation rig for Blender. It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, vast majority of addon&#039;s options can also be used for general Blender purposes.&lt;br /&gt;
&lt;br /&gt;
For more information on BlenderOni, please check its documentation page available [[BlenderOni|HERE]].&lt;br /&gt;
&lt;br /&gt;
==Oni-specific issues with Blender==&lt;br /&gt;
===Rotation order issue between Oni and Blender===&lt;br /&gt;
The previous XSI process allowed us to get to work pretty quickly: you could simply export any animation from Oni as a COLLADA file using OniSplit, then import it to XSI and it would work (mostly) without any quirks. That is not the case with Blender.&lt;br /&gt;
&lt;br /&gt;
If you import any Oni animation into Blender as it is, the rotations will be all wrong.&lt;br /&gt;
&lt;br /&gt;
That&#039;s because Oni&#039;s rotations are stored in XYZ Euler rotation order, while Blender&#039;s XYZ is actually ZYX despite being called &amp;quot;XYZ&amp;quot; - and this is because Blender reads the Euler angles from the bottom of the hierarchy, rather than the top: &lt;br /&gt;
&lt;br /&gt;
{{Quote|Which axis is on top, which one in the middle and which at the bottom, depends on the particular Euler gimbal: there are six types of them, as there are six possible combinations: XYZ, XZY, YXZ, YZX, ZXY and ZYX Euler rotation modes. &#039;&#039;&#039;These modes are named using the letters of the axes in order, starting from the axis at the bottom of the hierarchy, and finishing with the one on top.&#039;&#039;&#039;|[https://docs.blender.org/manual/en/latest/advanced/appendices/rotations.html Blender Manual, Rotation Modes] }}&lt;br /&gt;
&lt;br /&gt;
In other words, Oni reads XYZ as X first, Y second and then finally Z, while Blender does reverse, it reads XYZ as Z first, Y second and Z as the last angle.&lt;br /&gt;
&lt;br /&gt;
You can prove that by simply switching the rotation order of the body parts from XYZ to ZYX, as shown below – the image on the left shows KONCOMcomb_p imported to Blender without any adjustments, with the rotation order set to Blender&#039;s default &amp;quot;XYZ&amp;quot;, while the image on the right shows the same animation after switching the rotation order to ZYX.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! KONCOMcomb_p in Blender&#039;s XYZ !! KONCOMcomb_p in ZYX&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ARB KONCOMcomb p XYZ.png|500px|frameless]]&lt;br /&gt;
| [[Image:ARB KONCOMcomb p ZYX.png|500px|frameless]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Because of this, geyser implemented the &#039;&#039;&#039;-blender&#039;&#039;&#039; argument in OniSplit, which solves this problem by converting Oni assets&#039; rotation order from XYZ to Quaternions and then to ZYX, and vice versa when exporting assets from Blender to Oni. So that conversion flow looks as follows:&lt;br /&gt;
&lt;br /&gt;
*From Oni to Blender:&lt;br /&gt;
XYZ → Quaternions → ZYX&lt;br /&gt;
&lt;br /&gt;
*From Blender to Oni:&lt;br /&gt;
ZYX → Quaternions → XYZ&lt;br /&gt;
&lt;br /&gt;
To summarize: &#039;&#039;&#039;Always use the -blender argument when you&#039;re exporting assets from Oni to Blender&#039;&#039;&#039;, otherwise you can expect the problem shown in the above screenshots.&lt;br /&gt;
&lt;br /&gt;
===Broken alpha transparency and textures on animated models===&lt;br /&gt;
&#039;&#039;&#039;Currently there is no option in OniSplit that would allow exporting animated models with textures.&#039;&#039;&#039; While you don&#039;t need textures for animating, they are very useful, particularly in case of Oni - the models are low detail to a point where you can lose sense of which direction elbows and knees are facing, if you don&#039;t have the textures on. &lt;br /&gt;
&lt;br /&gt;
Because there is no option to export animated models with textures, &#039;&#039;&#039;the current workaround for that is to import an unanimated model with textures, then import an animated model,&#039;&#039;&#039; and either copy materials from the unanimated model to the animated one (the faster method), or set the materials on the animated model manually.&lt;br /&gt;
&lt;br /&gt;
You will also most likely need to set shading settings on some body parts on the unanimated model to fix Alpha transparency issues (much like in XSI) - specifically connect the Alpha parameter of Base Color node to any parameter in Principled BSDF that will work, like Emission Strength (this should be set up differently as that&#039;s technically incorrect, but I don&#039;t know how at this moment).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Konoko upon importing to Blender !! Fixed transparency !! Copying materials !! Setting materials in Shading&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ABR Konoko broken alpha.png|200px|frameless|center]] || [[Image:ABR_Konoko_fixed_alpha.png|200px|frameless|center]] || [[Image:ABR_Copying_materials.png|200px|frameless|center]] || [[Image:ABR Konoko fixed alpha.png|200px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Bi-platform modding tools]][[Category:Completed modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Blender&amp;diff=37747</id>
		<title>Blender</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Blender&amp;diff=37747"/>
		<updated>2022-05-14T16:56:02Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* BlenderOni */ Filled BlenderOni&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{fmbox&lt;br /&gt;
  | text = This page should contain information up to date for Blender version 3.1.&lt;br /&gt;
  }}&lt;br /&gt;
Blender is a free and open-source 3D computer graphics software toolset used for 3D modeling, animating, rigging, texturing, video editing, digital drawing, etc. It is the community&#039;s current 3D software of choice for modding Oni.&lt;br /&gt;
&lt;br /&gt;
==History of Blender in Oni community==&lt;br /&gt;
Up until 2019, the community&#039;s 3D program of choice was [[Mod Tool|XSI Mod Tool 7.5]], a free version of Autodesk Softimage from 2009. Softimage itself became discontinued in 2014, so the community was using a horribly outdated software for a long period of time. The reasons for that were two: XSI was the only software that the community could make any sense of (although very limited) and it had no problems handling Oni&#039;s assets and animations, unlike other programs.&lt;br /&gt;
&lt;br /&gt;
Blender during that time, although available, was widely considered as a trivia, rather than a serious 3D software. Reasons for that were multiple, with the most known being its infamously notorious user interface used up to Blender 2.79. In case of Oni, another prime reason for not using it was that [[#Oni-specific_issues_with_Blender|importing Oni&#039;s assets to Blender was causing a number of issues]], the causes of which were unknown at the time.&lt;br /&gt;
&lt;br /&gt;
However, Blender&#039;s user interface received a total overhaul in version 2.80, which was universally praised. This, along with the updates that Blender is receiving to this day, its light weight and countless tutorials on Youtube, made it effectively a serious competitor to the industry-standard 3D programs like Maya or 3DS Max.&lt;br /&gt;
&lt;br /&gt;
With Blender having become significantly more user-friendly and popular, it became more and more clear that it was necessary for the community to move on from XSI to Blender. The final straw was that it became clear that using XSI was ridiculously ineffcient, due to outdated methods used to create assets and XSI being bugged.&lt;br /&gt;
&lt;br /&gt;
From 2020 to 2022 a significant amount of work was done to allow modding Oni in Blender: the -blender tag was introduced to [[OniSplit]], which allowed to convert Oni assets in a way so that they can be imported to Blender, a new [[Using_the_Rigify_animation_rig|animation rig]] tailor-fit for making Oni animations was created, along with [[BlenderOni]] - a companion tool for the said rig. With all of this done, the community can now create new content for Oni in a modern, free, commonly used and open source 3D software.&lt;br /&gt;
&lt;br /&gt;
==How to use Blender? Tutorials and resources==&lt;br /&gt;
With the abundance of tutorials for Blender on Youtube, writing down tutorials on the basics of it would be reinventing the wheel, and a worse one at that. So instead, we recommend watching some of the tutorials listed below and trying to do some simple personal projects to get familiar with Blender, such as modeling simple objects like teddy bears or tables.&lt;br /&gt;
&lt;br /&gt;
General Blender basics:&lt;br /&gt;
* [https://www.youtube.com/watch?v=RG8qK5zPqgM Wolf&#039;s 45-Minute Crash Course for Blender Virgins] (yes, seriously - this is one of the best Blender basics tutorials out there, it&#039;s particularly good if you know your basics already and you want to find out if you&#039;ve missed anything)&lt;br /&gt;
&lt;br /&gt;
Modelling&lt;br /&gt;
* [https://www.youtube.com/watch?v=1jHUY3qoBu8 Learn Low Poly Modeling in Blender 2.83 (Imphenzia)]&lt;br /&gt;
&lt;br /&gt;
Rigging&lt;br /&gt;
* [https://www.youtube.com/watch?v=vKgH5zXIYmM Rigify (CGDive)]&lt;br /&gt;
&lt;br /&gt;
Documentation&lt;br /&gt;
* Blender has excellent documentation, available [https://docs.blender.org/manual/en/dev/modeling/meshes/editing/face/index.html HERE]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
[[Image:Blender_2.8_Python_Tooltips.png|thumb]]&lt;br /&gt;
You may want to go to the preferences and switch on &#039;&#039;&#039;Python Tooltips&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Contrary to intuition, the &#039;&#039;&#039;Developer Extras&#039;&#039;&#039; do not give you additional Python functionality per se. Instead this option enables experimental Blender features.&lt;br /&gt;
&lt;br /&gt;
Related videos:&lt;br /&gt;
* [https://youtu.be/XqX5wh4YeRw?t=46 Python Crash Course for Blender! - Curtis Holt]&lt;br /&gt;
* [https://www.youtube.com/watch?v=uahfuypQQ04 Blender 2.8 Addon Development Tutorial for Beginners - Jayanam]&lt;br /&gt;
&lt;br /&gt;
==Animation rig with IK and FK==&lt;br /&gt;
Currently we have an animation rig available in the form of a Blender scene available [http://mods.oni2.net/node/388 HERE]. The rig was made by Geyser and Delano762, and a tutorial on how to use it is available [[Using_the_Rigify_animation_rig|HERE.]] The rig is based off the Rigify plugin for Blender, and serves as the &#039;&#039;&#039;community&#039;s modern tool to create new character animations for Oni,&#039;&#039;&#039; featuring both Forward and Inverse Kinematics, thus being an enormous improvement over the previous FK-only method of animating.&lt;br /&gt;
&lt;br /&gt;
This rig is intended to be used together with [[#BlenderOni|BlenderOni]], a Blender addon designed as a companion tool for it - &#039;&#039;&#039;the rig is extremely difficult to set up without it, to the point of being almost useless.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The rig has the following capabilities (which come with Rigify by default, unless otherwise noted):&lt;br /&gt;
* Snapping to Oni animations through bone constraints controlled by the Z location of the objects in the Pose Matching layer (added feature)&lt;br /&gt;
* Inverse and Forward Kinematics (IK and FK)&lt;br /&gt;
* Snapping between IK and FK chains&lt;br /&gt;
* Function to snap IK hand controller rotation to the wrist bone, integrated into rig_ui.py (added feature)&lt;br /&gt;
* IK joint poles for specifying limb joints (elbows and knees) should be facing&lt;br /&gt;
* Sliders specifying how much the neck, head and FK limbs should retain their world space rotation – that is, Neck Follow, Head Follow and FK Limb Follow&lt;br /&gt;
* IK foot pivoting controllers around toes and the heel&lt;br /&gt;
* Root bone&lt;br /&gt;
&lt;br /&gt;
===Tutorial for creating animation rig===&lt;br /&gt;
If you want to create the above rig, and learn a bit about rigs, IK/FK, Rigify, Blender, bone layers, bone constraints, scripts, issues with Oni models and animations such as the rotation order being incompatible with Blender, see [[Creating an animation rig in Blender]].&lt;br /&gt;
&lt;br /&gt;
==BlenderOni==&lt;br /&gt;
BlenderOni is a Blender addon intented as an integral companion tool for the Animation rig for Blender. It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, vast majority of addon&#039;s options can also be used for general Blender purposes.&lt;br /&gt;
&lt;br /&gt;
For more information on BlenderOni, please check its documentation page available [[BlenderOni|HERE]].&lt;br /&gt;
&lt;br /&gt;
==Oni-specific issues with Blender==&lt;br /&gt;
===Rotation order issue between Oni and Blender===&lt;br /&gt;
The previous XSI process allowed us to get to work pretty quickly: you could simply export any animation from Oni as a COLLADA file using OniSplit, then import it to XSI and it would work (mostly) without any quirks. That is not the case with Blender.&lt;br /&gt;
&lt;br /&gt;
If you import any Oni animation into Blender as it is, the rotations will be all wrong.&lt;br /&gt;
&lt;br /&gt;
That&#039;s because Oni&#039;s rotations are stored in XYZ Euler rotation order, while Blender&#039;s XYZ is actually ZYX despite being called &amp;quot;XYZ&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can prove that by simply switching the rotation order of the body parts from XYZ to ZYX, as shown below – the image on the left shows KONCOMcomb_p imported to Blender without any adjustments, with the rotation order set to Blender&#039;s default &amp;quot;XYZ&amp;quot;, while the image on the right shows the same animation after switching the rotation order to ZYX.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! KONCOMcomb_p in Blender&#039;s XYZ !! KONCOMcomb_p in ZYX&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ARB KONCOMcomb p XYZ.png|500px|frameless]]&lt;br /&gt;
| [[Image:ARB KONCOMcomb p ZYX.png|500px|frameless]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Because of this, geyser implemented the &#039;&#039;&#039;-blender&#039;&#039;&#039; argument in OniSplit, which solves this problem by converting Oni assets&#039; rotation order from XYZ to Quaternions and then to ZYX, and vice versa when exporting assets from Blender to Oni. So that conversion flow looks as follows:&lt;br /&gt;
&lt;br /&gt;
*From Oni to Blender:&lt;br /&gt;
XYZ → Quaternions → ZYX&lt;br /&gt;
&lt;br /&gt;
*From Blender to Oni:&lt;br /&gt;
ZYX → Quaternions → XYZ&lt;br /&gt;
&lt;br /&gt;
To summarize: &#039;&#039;&#039;Always use the -blender argument when you&#039;re exporting assets from Oni to Blender&#039;&#039;&#039;, otherwise you can expect the problem shown in the above screenshots.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Broken alpha transparency and textures on animated models===&lt;br /&gt;
&#039;&#039;&#039;Currently there is no option in OniSplit that would allow exporting animated models with textures.&#039;&#039;&#039; While you don&#039;t need textures for animating, they are very useful, particularly in case of Oni - the models are low detail to a point where you can lose sense of which direction elbows and knees are facing, if you don&#039;t have the textures on. &lt;br /&gt;
&lt;br /&gt;
Because there is no option to export animated models with textures, &#039;&#039;&#039;the current workaround for that is to import an unanimated model with textures, then import an animated model,&#039;&#039;&#039; and either copy materials from the unanimated model to the animated one (the faster method), or set the materials on the animated model manually.&lt;br /&gt;
&lt;br /&gt;
You will also most likely need to set shading settings on some body parts on the unanimated model to fix Alpha transparency issues (much like in XSI) - specifically connect the Alpha parameter of Base Color node to any parameter in Principled BSDF that will work, like Emission Strength (this should be set up differently as that&#039;s technically incorrect, but I don&#039;t know how at this moment).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Konoko upon importing to Blender !! Fixed transparency !! Copying materials !! Setting materials in Shading&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ABR Konoko broken alpha.png|200px|frameless|center]] || [[Image:ABR_Konoko_fixed_alpha.png|200px|frameless|center]] || [[Image:ABR_Copying_materials.png|200px|frameless|center]] || [[Image:ABR Konoko fixed alpha.png|200px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Bi-platform modding tools]][[Category:Completed modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37746</id>
		<title>BlenderOni</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=BlenderOni&amp;diff=37746"/>
		<updated>2022-05-14T16:54:28Z</updated>

		<summary type="html">&lt;p&gt;Delano762: Added Scripts header&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|style=&amp;quot;float:right&amp;quot;&lt;br /&gt;
|[[Image:Guido_-_Kon_face_07.jpg|thumb|300px|Note to self: no more pizza before bed! Nightmares! ]]&lt;br /&gt;
|}&lt;br /&gt;
BlenderOni is a [[Blender|Blender]] addon intented as an integral companion tool for the [[Using_the_Rigify_animation_rig|Animation rig for Blender.]] It contains functionalities that automate a lot of operations necessary for the rig to function and be used properly. However, vast majority of addon&#039;s options can also be used for general Blender purposes. &lt;br /&gt;
&lt;br /&gt;
BlenderOni can be downloaded [http://mods.oni2.net/node/401 HERE.]&lt;br /&gt;
&lt;br /&gt;
==Scripts==&lt;br /&gt;
We used a number of scripts for the purpose of making the Rigify Oni rig usable, however those scripts have become obsolete with the introduction of the BlenderOni - BlenderOni is essentially little more than those scripts wrapped into a GUI. They are nonetheless archived [[Blender/Obsolete_scripts|HERE]] for legacy purposes. &lt;br /&gt;
&lt;br /&gt;
[[Category:Modding tutorials]][[Category:Completed modding tools]][[Category:Bi-platform modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Blender&amp;diff=37745</id>
		<title>Blender</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Blender&amp;diff=37745"/>
		<updated>2022-05-14T16:36:51Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Animation rig with IK and FK */ change to the first paragraph of this header&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{fmbox&lt;br /&gt;
  | text = This page should contain information up to date for Blender version 3.1.&lt;br /&gt;
  }}&lt;br /&gt;
Blender is a free and open-source 3D computer graphics software toolset used for 3D modeling, animating, rigging, texturing, video editing, digital drawing, etc. It is the community&#039;s current 3D software of choice for modding Oni.&lt;br /&gt;
&lt;br /&gt;
==History of Blender in Oni community==&lt;br /&gt;
Up until 2019, the community&#039;s 3D program of choice was [[Mod Tool|XSI Mod Tool 7.5]], a free version of Autodesk Softimage from 2009. Softimage itself became discontinued in 2014, so the community was using a horribly outdated software for a long period of time. The reasons for that were two: XSI was the only software that the community could make any sense of (although very limited) and it had no problems handling Oni&#039;s assets and animations, unlike other programs.&lt;br /&gt;
&lt;br /&gt;
Blender during that time, although available, was widely considered as a trivia, rather than a serious 3D software. Reasons for that were multiple, with the most known being its infamously notorious user interface used up to Blender 2.79. In case of Oni, another prime reason for not using it was that [[#Oni-specific_issues_with_Blender|importing Oni&#039;s assets to Blender was causing a number of issues]], the causes of which were unknown at the time.&lt;br /&gt;
&lt;br /&gt;
However, Blender&#039;s user interface received a total overhaul in version 2.80, which was universally praised. This, along with the updates that Blender is receiving to this day, its light weight and countless tutorials on Youtube, made it effectively a serious competitor to the industry-standard 3D programs like Maya or 3DS Max.&lt;br /&gt;
&lt;br /&gt;
With Blender having become significantly more user-friendly and popular, it became more and more clear that it was necessary for the community to move on from XSI to Blender. The final straw was that it became clear that using XSI was ridiculously ineffcient, due to outdated methods used to create assets and XSI being bugged.&lt;br /&gt;
&lt;br /&gt;
From 2020 to 2022 a significant amount of work was done to allow modding Oni in Blender: the -blender tag was introduced to [[OniSplit]], which allowed to convert Oni assets in a way so that they can be imported to Blender, a new [[Using_the_Rigify_animation_rig|animation rig]] tailor-fit for making Oni animations was created, along with [[BlenderOni]] - a companion tool for the said rig. With all of this done, the community can now create new content for Oni in a modern, free, commonly used and open source 3D software.&lt;br /&gt;
&lt;br /&gt;
==How to use Blender? Tutorials and resources==&lt;br /&gt;
With the abundance of tutorials for Blender on Youtube, writing down tutorials on the basics of it would be reinventing the wheel, and a worse one at that. So instead, we recommend watching some of the tutorials listed below and trying to do some simple personal projects to get familiar with Blender, such as modeling simple objects like teddy bears or tables.&lt;br /&gt;
&lt;br /&gt;
General Blender basics:&lt;br /&gt;
* [https://www.youtube.com/watch?v=RG8qK5zPqgM Wolf&#039;s 45-Minute Crash Course for Blender Virgins] (yes, seriously - this is one of the best Blender basics tutorials out there, it&#039;s particularly good if you know your basics already and you want to find out if you&#039;ve missed anything)&lt;br /&gt;
&lt;br /&gt;
Modelling&lt;br /&gt;
* [https://www.youtube.com/watch?v=1jHUY3qoBu8 Learn Low Poly Modeling in Blender 2.83 (Imphenzia)]&lt;br /&gt;
&lt;br /&gt;
Rigging&lt;br /&gt;
* [https://www.youtube.com/watch?v=vKgH5zXIYmM Rigify (CGDive)]&lt;br /&gt;
&lt;br /&gt;
Documentation&lt;br /&gt;
* Blender has excellent documentation, available [https://docs.blender.org/manual/en/dev/modeling/meshes/editing/face/index.html HERE]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
[[Image:Blender_2.8_Python_Tooltips.png|thumb]]&lt;br /&gt;
You may want to go to the preferences and switch on &#039;&#039;&#039;Python Tooltips&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Contrary to intuition, the &#039;&#039;&#039;Developer Extras&#039;&#039;&#039; do not give you additional Python functionality per se. Instead this option enables experimental Blender features.&lt;br /&gt;
&lt;br /&gt;
Related videos:&lt;br /&gt;
* [https://youtu.be/XqX5wh4YeRw?t=46 Python Crash Course for Blender! - Curtis Holt]&lt;br /&gt;
* [https://www.youtube.com/watch?v=uahfuypQQ04 Blender 2.8 Addon Development Tutorial for Beginners - Jayanam]&lt;br /&gt;
&lt;br /&gt;
==Animation rig with IK and FK==&lt;br /&gt;
Currently we have an animation rig available in the form of a Blender scene available [http://mods.oni2.net/node/388 HERE]. The rig was made by Geyser and Delano762, and a tutorial on how to use it is available [[Using_the_Rigify_animation_rig|HERE.]] The rig is based off the Rigify plugin for Blender, and serves as the &#039;&#039;&#039;community&#039;s modern tool to create new character animations for Oni,&#039;&#039;&#039; featuring both Forward and Inverse Kinematics, thus being an enormous improvement over the previous FK-only method of animating.&lt;br /&gt;
&lt;br /&gt;
This rig is intended to be used together with [[#BlenderOni|BlenderOni]], a Blender addon designed as a companion tool for it - &#039;&#039;&#039;the rig is extremely difficult to set up without it, to the point of being almost useless.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The rig has the following capabilities (which come with Rigify by default, unless otherwise noted):&lt;br /&gt;
* Snapping to Oni animations through bone constraints controlled by the Z location of the objects in the Pose Matching layer (added feature)&lt;br /&gt;
* Inverse and Forward Kinematics (IK and FK)&lt;br /&gt;
* Snapping between IK and FK chains&lt;br /&gt;
* Function to snap IK hand controller rotation to the wrist bone, integrated into rig_ui.py (added feature)&lt;br /&gt;
* IK joint poles for specifying limb joints (elbows and knees) should be facing&lt;br /&gt;
* Sliders specifying how much the neck, head and FK limbs should retain their world space rotation – that is, Neck Follow, Head Follow and FK Limb Follow&lt;br /&gt;
* IK foot pivoting controllers around toes and the heel&lt;br /&gt;
* Root bone&lt;br /&gt;
&lt;br /&gt;
===Tutorial for creating animation rig===&lt;br /&gt;
If you want to create the above rig, and learn a bit about rigs, IK/FK, Rigify, Blender, bone layers, bone constraints, scripts, issues with Oni models and animations such as the rotation order being incompatible with Blender, see [[Creating an animation rig in Blender]].&lt;br /&gt;
&lt;br /&gt;
==BlenderOni==&lt;br /&gt;
===Scripts===&lt;br /&gt;
We used a number of scripts for the purpose of making the [[Using_the_Rigify_animation_rig|Rigify Oni rig]] usable, however those scripts have become obsolete with the introduction of the BlenderOni plugin. They are nonetheless archived [[/Obsolete scripts|HERE]] for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
==Oni-specific issues with Blender==&lt;br /&gt;
===Rotation order issue between Oni and Blender===&lt;br /&gt;
The previous XSI process allowed us to get to work pretty quickly: you could simply export any animation from Oni as a COLLADA file using OniSplit, then import it to XSI and it would work (mostly) without any quirks. That is not the case with Blender.&lt;br /&gt;
&lt;br /&gt;
If you import any Oni animation into Blender as it is, the rotations will be all wrong.&lt;br /&gt;
&lt;br /&gt;
That&#039;s because Oni&#039;s rotations are stored in XYZ Euler rotation order, while Blender&#039;s XYZ is actually ZYX despite being called &amp;quot;XYZ&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can prove that by simply switching the rotation order of the body parts from XYZ to ZYX, as shown below – the image on the left shows KONCOMcomb_p imported to Blender without any adjustments, with the rotation order set to Blender&#039;s default &amp;quot;XYZ&amp;quot;, while the image on the right shows the same animation after switching the rotation order to ZYX.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! KONCOMcomb_p in Blender&#039;s XYZ !! KONCOMcomb_p in ZYX&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ARB KONCOMcomb p XYZ.png|500px|frameless]]&lt;br /&gt;
| [[Image:ARB KONCOMcomb p ZYX.png|500px|frameless]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Because of this, geyser implemented the &#039;&#039;&#039;-blender&#039;&#039;&#039; argument in OniSplit, which solves this problem by converting Oni assets&#039; rotation order from XYZ to Quaternions and then to ZYX, and vice versa when exporting assets from Blender to Oni. So that conversion flow looks as follows:&lt;br /&gt;
&lt;br /&gt;
*From Oni to Blender:&lt;br /&gt;
XYZ → Quaternions → ZYX&lt;br /&gt;
&lt;br /&gt;
*From Blender to Oni:&lt;br /&gt;
ZYX → Quaternions → XYZ&lt;br /&gt;
&lt;br /&gt;
To summarize: &#039;&#039;&#039;Always use the -blender argument when you&#039;re exporting assets from Oni to Blender&#039;&#039;&#039;, otherwise you can expect the problem shown in the above screenshots.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Broken alpha transparency and textures on animated models===&lt;br /&gt;
&#039;&#039;&#039;Currently there is no option in OniSplit that would allow exporting animated models with textures.&#039;&#039;&#039; While you don&#039;t need textures for animating, they are very useful, particularly in case of Oni - the models are low detail to a point where you can lose sense of which direction elbows and knees are facing, if you don&#039;t have the textures on. &lt;br /&gt;
&lt;br /&gt;
Because there is no option to export animated models with textures, &#039;&#039;&#039;the current workaround for that is to import an unanimated model with textures, then import an animated model,&#039;&#039;&#039; and either copy materials from the unanimated model to the animated one (the faster method), or set the materials on the animated model manually.&lt;br /&gt;
&lt;br /&gt;
You will also most likely need to set shading settings on some body parts on the unanimated model to fix Alpha transparency issues (much like in XSI) - specifically connect the Alpha parameter of Base Color node to any parameter in Principled BSDF that will work, like Emission Strength (this should be set up differently as that&#039;s technically incorrect, but I don&#039;t know how at this moment).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Konoko upon importing to Blender !! Fixed transparency !! Copying materials !! Setting materials in Shading&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ABR Konoko broken alpha.png|200px|frameless|center]] || [[Image:ABR_Konoko_fixed_alpha.png|200px|frameless|center]] || [[Image:ABR_Copying_materials.png|200px|frameless|center]] || [[Image:ABR Konoko fixed alpha.png|200px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Bi-platform modding tools]][[Category:Completed modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Blender&amp;diff=37744</id>
		<title>Blender</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Blender&amp;diff=37744"/>
		<updated>2022-05-14T16:29:56Z</updated>

		<summary type="html">&lt;p&gt;Delano762: /* Animation rig with IK and FK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{fmbox&lt;br /&gt;
  | text = This page should contain information up to date for Blender version 3.1.&lt;br /&gt;
  }}&lt;br /&gt;
Blender is a free and open-source 3D computer graphics software toolset used for 3D modeling, animating, rigging, texturing, video editing, digital drawing, etc. It is the community&#039;s current 3D software of choice for modding Oni.&lt;br /&gt;
&lt;br /&gt;
==History of Blender in Oni community==&lt;br /&gt;
Up until 2019, the community&#039;s 3D program of choice was [[Mod Tool|XSI Mod Tool 7.5]], a free version of Autodesk Softimage from 2009. Softimage itself became discontinued in 2014, so the community was using a horribly outdated software for a long period of time. The reasons for that were two: XSI was the only software that the community could make any sense of (although very limited) and it had no problems handling Oni&#039;s assets and animations, unlike other programs.&lt;br /&gt;
&lt;br /&gt;
Blender during that time, although available, was widely considered as a trivia, rather than a serious 3D software. Reasons for that were multiple, with the most known being its infamously notorious user interface used up to Blender 2.79. In case of Oni, another prime reason for not using it was that [[#Oni-specific_issues_with_Blender|importing Oni&#039;s assets to Blender was causing a number of issues]], the causes of which were unknown at the time.&lt;br /&gt;
&lt;br /&gt;
However, Blender&#039;s user interface received a total overhaul in version 2.80, which was universally praised. This, along with the updates that Blender is receiving to this day, its light weight and countless tutorials on Youtube, made it effectively a serious competitor to the industry-standard 3D programs like Maya or 3DS Max.&lt;br /&gt;
&lt;br /&gt;
With Blender having become significantly more user-friendly and popular, it became more and more clear that it was necessary for the community to move on from XSI to Blender. The final straw was that it became clear that using XSI was ridiculously ineffcient, due to outdated methods used to create assets and XSI being bugged.&lt;br /&gt;
&lt;br /&gt;
From 2020 to 2022 a significant amount of work was done to allow modding Oni in Blender: the -blender tag was introduced to [[OniSplit]], which allowed to convert Oni assets in a way so that they can be imported to Blender, a new [[Using_the_Rigify_animation_rig|animation rig]] tailor-fit for making Oni animations was created, along with [[BlenderOni]] - a companion tool for the said rig. With all of this done, the community can now create new content for Oni in a modern, free, commonly used and open source 3D software.&lt;br /&gt;
&lt;br /&gt;
==How to use Blender? Tutorials and resources==&lt;br /&gt;
With the abundance of tutorials for Blender on Youtube, writing down tutorials on the basics of it would be reinventing the wheel, and a worse one at that. So instead, we recommend watching some of the tutorials listed below and trying to do some simple personal projects to get familiar with Blender, such as modeling simple objects like teddy bears or tables.&lt;br /&gt;
&lt;br /&gt;
General Blender basics:&lt;br /&gt;
* [https://www.youtube.com/watch?v=RG8qK5zPqgM Wolf&#039;s 45-Minute Crash Course for Blender Virgins] (yes, seriously - this is one of the best Blender basics tutorials out there, it&#039;s particularly good if you know your basics already and you want to find out if you&#039;ve missed anything)&lt;br /&gt;
&lt;br /&gt;
Modelling&lt;br /&gt;
* [https://www.youtube.com/watch?v=1jHUY3qoBu8 Learn Low Poly Modeling in Blender 2.83 (Imphenzia)]&lt;br /&gt;
&lt;br /&gt;
Rigging&lt;br /&gt;
* [https://www.youtube.com/watch?v=vKgH5zXIYmM Rigify (CGDive)]&lt;br /&gt;
&lt;br /&gt;
Documentation&lt;br /&gt;
* Blender has excellent documentation, available [https://docs.blender.org/manual/en/dev/modeling/meshes/editing/face/index.html HERE]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
[[Image:Blender_2.8_Python_Tooltips.png|thumb]]&lt;br /&gt;
You may want to go to the preferences and switch on &#039;&#039;&#039;Python Tooltips&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Contrary to intuition, the &#039;&#039;&#039;Developer Extras&#039;&#039;&#039; do not give you additional Python functionality per se. Instead this option enables experimental Blender features.&lt;br /&gt;
&lt;br /&gt;
Related videos:&lt;br /&gt;
* [https://youtu.be/XqX5wh4YeRw?t=46 Python Crash Course for Blender! - Curtis Holt]&lt;br /&gt;
* [https://www.youtube.com/watch?v=uahfuypQQ04 Blender 2.8 Addon Development Tutorial for Beginners - Jayanam]&lt;br /&gt;
&lt;br /&gt;
==Animation rig with IK and FK==&lt;br /&gt;
Currently we have a rig available in the form of a Blender scene available [http://mods.oni2.net/node/388 HERE]. The rig was made by Geyser and Delano762, and a tutorial on how to use it is available [[Using_the_Rigify_animation_rig|HERE.]] The rig is based off the Rigify plugin for Blender.&lt;br /&gt;
&lt;br /&gt;
This rig is intended to be used together with [[#BlenderOni|BlenderOni]], a Blender addon designed as a companion tool for it - &#039;&#039;&#039;the rig is extremely difficult to set up without it, to the point of being almost useless.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The rig has the following capabilities (which come with Rigify by default, unless otherwise noted):&lt;br /&gt;
* Snapping to Oni animations through bone constraints controlled by the Z location of the objects in the Pose Matching layer (added feature)&lt;br /&gt;
* Inverse and Forward Kinematics (IK and FK)&lt;br /&gt;
* Snapping between IK and FK chains&lt;br /&gt;
* Function to snap IK hand controller rotation to the wrist bone, integrated into rig_ui.py (added feature)&lt;br /&gt;
* IK joint poles for specifying limb joints (elbows and knees) should be facing&lt;br /&gt;
* Sliders specifying how much the neck, head and FK limbs should retain their world space rotation – that is, Neck Follow, Head Follow and FK Limb Follow&lt;br /&gt;
* IK foot pivoting controllers around toes and the heel&lt;br /&gt;
* Root bone&lt;br /&gt;
&lt;br /&gt;
===Tutorial for creating animation rig===&lt;br /&gt;
If you want to create the above rig, and learn a bit about rigs, IK/FK, Rigify, Blender, bone layers, bone constraints, scripts, issues with Oni models and animations such as the rotation order being incompatible with Blender, see [[Creating an animation rig in Blender]].&lt;br /&gt;
&lt;br /&gt;
==BlenderOni==&lt;br /&gt;
===Scripts===&lt;br /&gt;
We used a number of scripts for the purpose of making the [[Using_the_Rigify_animation_rig|Rigify Oni rig]] usable, however those scripts have become obsolete with the introduction of the BlenderOni plugin. They are nonetheless archived [[/Obsolete scripts|HERE]] for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
==Oni-specific issues with Blender==&lt;br /&gt;
===Rotation order issue between Oni and Blender===&lt;br /&gt;
The previous XSI process allowed us to get to work pretty quickly: you could simply export any animation from Oni as a COLLADA file using OniSplit, then import it to XSI and it would work (mostly) without any quirks. That is not the case with Blender.&lt;br /&gt;
&lt;br /&gt;
If you import any Oni animation into Blender as it is, the rotations will be all wrong.&lt;br /&gt;
&lt;br /&gt;
That&#039;s because Oni&#039;s rotations are stored in XYZ Euler rotation order, while Blender&#039;s XYZ is actually ZYX despite being called &amp;quot;XYZ&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can prove that by simply switching the rotation order of the body parts from XYZ to ZYX, as shown below – the image on the left shows KONCOMcomb_p imported to Blender without any adjustments, with the rotation order set to Blender&#039;s default &amp;quot;XYZ&amp;quot;, while the image on the right shows the same animation after switching the rotation order to ZYX.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! KONCOMcomb_p in Blender&#039;s XYZ !! KONCOMcomb_p in ZYX&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ARB KONCOMcomb p XYZ.png|500px|frameless]]&lt;br /&gt;
| [[Image:ARB KONCOMcomb p ZYX.png|500px|frameless]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Because of this, geyser implemented the &#039;&#039;&#039;-blender&#039;&#039;&#039; argument in OniSplit, which solves this problem by converting Oni assets&#039; rotation order from XYZ to Quaternions and then to ZYX, and vice versa when exporting assets from Blender to Oni. So that conversion flow looks as follows:&lt;br /&gt;
&lt;br /&gt;
*From Oni to Blender:&lt;br /&gt;
XYZ → Quaternions → ZYX&lt;br /&gt;
&lt;br /&gt;
*From Blender to Oni:&lt;br /&gt;
ZYX → Quaternions → XYZ&lt;br /&gt;
&lt;br /&gt;
To summarize: &#039;&#039;&#039;Always use the -blender argument when you&#039;re exporting assets from Oni to Blender&#039;&#039;&#039;, otherwise you can expect the problem shown in the above screenshots.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Broken alpha transparency and textures on animated models===&lt;br /&gt;
&#039;&#039;&#039;Currently there is no option in OniSplit that would allow exporting animated models with textures.&#039;&#039;&#039; While you don&#039;t need textures for animating, they are very useful, particularly in case of Oni - the models are low detail to a point where you can lose sense of which direction elbows and knees are facing, if you don&#039;t have the textures on. &lt;br /&gt;
&lt;br /&gt;
Because there is no option to export animated models with textures, &#039;&#039;&#039;the current workaround for that is to import an unanimated model with textures, then import an animated model,&#039;&#039;&#039; and either copy materials from the unanimated model to the animated one (the faster method), or set the materials on the animated model manually.&lt;br /&gt;
&lt;br /&gt;
You will also most likely need to set shading settings on some body parts on the unanimated model to fix Alpha transparency issues (much like in XSI) - specifically connect the Alpha parameter of Base Color node to any parameter in Principled BSDF that will work, like Emission Strength (this should be set up differently as that&#039;s technically incorrect, but I don&#039;t know how at this moment).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Konoko upon importing to Blender !! Fixed transparency !! Copying materials !! Setting materials in Shading&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ABR Konoko broken alpha.png|200px|frameless|center]] || [[Image:ABR_Konoko_fixed_alpha.png|200px|frameless|center]] || [[Image:ABR_Copying_materials.png|200px|frameless|center]] || [[Image:ABR Konoko fixed alpha.png|200px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Bi-platform modding tools]][[Category:Completed modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
	<entry>
		<id>https://wiki.oni2.net/w/index.php?title=Blender&amp;diff=37743</id>
		<title>Blender</title>
		<link rel="alternate" type="text/html" href="https://wiki.oni2.net/w/index.php?title=Blender&amp;diff=37743"/>
		<updated>2022-05-14T16:29:28Z</updated>

		<summary type="html">&lt;p&gt;Delano762: Added the BlenderOni header, made some minor changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{fmbox&lt;br /&gt;
  | text = This page should contain information up to date for Blender version 3.1.&lt;br /&gt;
  }}&lt;br /&gt;
Blender is a free and open-source 3D computer graphics software toolset used for 3D modeling, animating, rigging, texturing, video editing, digital drawing, etc. It is the community&#039;s current 3D software of choice for modding Oni.&lt;br /&gt;
&lt;br /&gt;
==History of Blender in Oni community==&lt;br /&gt;
Up until 2019, the community&#039;s 3D program of choice was [[Mod Tool|XSI Mod Tool 7.5]], a free version of Autodesk Softimage from 2009. Softimage itself became discontinued in 2014, so the community was using a horribly outdated software for a long period of time. The reasons for that were two: XSI was the only software that the community could make any sense of (although very limited) and it had no problems handling Oni&#039;s assets and animations, unlike other programs.&lt;br /&gt;
&lt;br /&gt;
Blender during that time, although available, was widely considered as a trivia, rather than a serious 3D software. Reasons for that were multiple, with the most known being its infamously notorious user interface used up to Blender 2.79. In case of Oni, another prime reason for not using it was that [[#Oni-specific_issues_with_Blender|importing Oni&#039;s assets to Blender was causing a number of issues]], the causes of which were unknown at the time.&lt;br /&gt;
&lt;br /&gt;
However, Blender&#039;s user interface received a total overhaul in version 2.80, which was universally praised. This, along with the updates that Blender is receiving to this day, its light weight and countless tutorials on Youtube, made it effectively a serious competitor to the industry-standard 3D programs like Maya or 3DS Max.&lt;br /&gt;
&lt;br /&gt;
With Blender having become significantly more user-friendly and popular, it became more and more clear that it was necessary for the community to move on from XSI to Blender. The final straw was that it became clear that using XSI was ridiculously ineffcient, due to outdated methods used to create assets and XSI being bugged.&lt;br /&gt;
&lt;br /&gt;
From 2020 to 2022 a significant amount of work was done to allow modding Oni in Blender: the -blender tag was introduced to [[OniSplit]], which allowed to convert Oni assets in a way so that they can be imported to Blender, a new [[Using_the_Rigify_animation_rig|animation rig]] tailor-fit for making Oni animations was created, along with [[BlenderOni]] - a companion tool for the said rig. With all of this done, the community can now create new content for Oni in a modern, free, commonly used and open source 3D software.&lt;br /&gt;
&lt;br /&gt;
==How to use Blender? Tutorials and resources==&lt;br /&gt;
With the abundance of tutorials for Blender on Youtube, writing down tutorials on the basics of it would be reinventing the wheel, and a worse one at that. So instead, we recommend watching some of the tutorials listed below and trying to do some simple personal projects to get familiar with Blender, such as modeling simple objects like teddy bears or tables.&lt;br /&gt;
&lt;br /&gt;
General Blender basics:&lt;br /&gt;
* [https://www.youtube.com/watch?v=RG8qK5zPqgM Wolf&#039;s 45-Minute Crash Course for Blender Virgins] (yes, seriously - this is one of the best Blender basics tutorials out there, it&#039;s particularly good if you know your basics already and you want to find out if you&#039;ve missed anything)&lt;br /&gt;
&lt;br /&gt;
Modelling&lt;br /&gt;
* [https://www.youtube.com/watch?v=1jHUY3qoBu8 Learn Low Poly Modeling in Blender 2.83 (Imphenzia)]&lt;br /&gt;
&lt;br /&gt;
Rigging&lt;br /&gt;
* [https://www.youtube.com/watch?v=vKgH5zXIYmM Rigify (CGDive)]&lt;br /&gt;
&lt;br /&gt;
Documentation&lt;br /&gt;
* Blender has excellent documentation, available [https://docs.blender.org/manual/en/dev/modeling/meshes/editing/face/index.html HERE]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
[[Image:Blender_2.8_Python_Tooltips.png|thumb]]&lt;br /&gt;
You may want to go to the preferences and switch on &#039;&#039;&#039;Python Tooltips&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Contrary to intuition, the &#039;&#039;&#039;Developer Extras&#039;&#039;&#039; do not give you additional Python functionality per se. Instead this option enables experimental Blender features.&lt;br /&gt;
&lt;br /&gt;
Related videos:&lt;br /&gt;
* [https://youtu.be/XqX5wh4YeRw?t=46 Python Crash Course for Blender! - Curtis Holt]&lt;br /&gt;
* [https://www.youtube.com/watch?v=uahfuypQQ04 Blender 2.8 Addon Development Tutorial for Beginners - Jayanam]&lt;br /&gt;
&lt;br /&gt;
==Animation rig with IK and FK==&lt;br /&gt;
Currently we have a rig available in the form of a Blender scene available [http://mods.oni2.net/node/388 HERE]. The rig was made by Geyser and Delano762, and a tutorial on how to use it is available [[Using_the_Rigify_animation_rig|HERE.]] The rig is based off the Rigify plugin for Blender.&lt;br /&gt;
&lt;br /&gt;
This rig is intended to be used together with [[#BlenderOni]], a Blender addon designed as a companion tool for it - &#039;&#039;&#039;the rig is extremely difficult to set up without it, to the point of being almost useless.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The rig has the following capabilities (which come with Rigify by default, unless otherwise noted):&lt;br /&gt;
* Snapping to Oni animations through bone constraints controlled by the Z location of the objects in the Pose Matching layer (added feature)&lt;br /&gt;
* Inverse and Forward Kinematics (IK and FK)&lt;br /&gt;
* Snapping between IK and FK chains&lt;br /&gt;
* Function to snap IK hand controller rotation to the wrist bone, integrated into rig_ui.py (added feature)&lt;br /&gt;
* IK joint poles for specifying limb joints (elbows and knees) should be facing&lt;br /&gt;
* Sliders specifying how much the neck, head and FK limbs should retain their world space rotation – that is, Neck Follow, Head Follow and FK Limb Follow&lt;br /&gt;
* IK foot pivoting controllers around toes and the heel&lt;br /&gt;
* Root bone&lt;br /&gt;
&lt;br /&gt;
===Tutorial for creating animation rig===&lt;br /&gt;
If you want to create the above rig, and learn a bit about rigs, IK/FK, Rigify, Blender, bone layers, bone constraints, scripts, issues with Oni models and animations such as the rotation order being incompatible with Blender, see [[Creating an animation rig in Blender]].&lt;br /&gt;
&lt;br /&gt;
==BlenderOni==&lt;br /&gt;
===Scripts===&lt;br /&gt;
We used a number of scripts for the purpose of making the [[Using_the_Rigify_animation_rig|Rigify Oni rig]] usable, however those scripts have become obsolete with the introduction of the BlenderOni plugin. They are nonetheless archived [[/Obsolete scripts|HERE]] for legacy purposes.&lt;br /&gt;
&lt;br /&gt;
==Oni-specific issues with Blender==&lt;br /&gt;
===Rotation order issue between Oni and Blender===&lt;br /&gt;
The previous XSI process allowed us to get to work pretty quickly: you could simply export any animation from Oni as a COLLADA file using OniSplit, then import it to XSI and it would work (mostly) without any quirks. That is not the case with Blender.&lt;br /&gt;
&lt;br /&gt;
If you import any Oni animation into Blender as it is, the rotations will be all wrong.&lt;br /&gt;
&lt;br /&gt;
That&#039;s because Oni&#039;s rotations are stored in XYZ Euler rotation order, while Blender&#039;s XYZ is actually ZYX despite being called &amp;quot;XYZ&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can prove that by simply switching the rotation order of the body parts from XYZ to ZYX, as shown below – the image on the left shows KONCOMcomb_p imported to Blender without any adjustments, with the rotation order set to Blender&#039;s default &amp;quot;XYZ&amp;quot;, while the image on the right shows the same animation after switching the rotation order to ZYX.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! KONCOMcomb_p in Blender&#039;s XYZ !! KONCOMcomb_p in ZYX&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ARB KONCOMcomb p XYZ.png|500px|frameless]]&lt;br /&gt;
| [[Image:ARB KONCOMcomb p ZYX.png|500px|frameless]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Because of this, geyser implemented the &#039;&#039;&#039;-blender&#039;&#039;&#039; argument in OniSplit, which solves this problem by converting Oni assets&#039; rotation order from XYZ to Quaternions and then to ZYX, and vice versa when exporting assets from Blender to Oni. So that conversion flow looks as follows:&lt;br /&gt;
&lt;br /&gt;
*From Oni to Blender:&lt;br /&gt;
XYZ → Quaternions → ZYX&lt;br /&gt;
&lt;br /&gt;
*From Blender to Oni:&lt;br /&gt;
ZYX → Quaternions → XYZ&lt;br /&gt;
&lt;br /&gt;
To summarize: &#039;&#039;&#039;Always use the -blender argument when you&#039;re exporting assets from Oni to Blender&#039;&#039;&#039;, otherwise you can expect the problem shown in the above screenshots.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Broken alpha transparency and textures on animated models===&lt;br /&gt;
&#039;&#039;&#039;Currently there is no option in OniSplit that would allow exporting animated models with textures.&#039;&#039;&#039; While you don&#039;t need textures for animating, they are very useful, particularly in case of Oni - the models are low detail to a point where you can lose sense of which direction elbows and knees are facing, if you don&#039;t have the textures on. &lt;br /&gt;
&lt;br /&gt;
Because there is no option to export animated models with textures, &#039;&#039;&#039;the current workaround for that is to import an unanimated model with textures, then import an animated model,&#039;&#039;&#039; and either copy materials from the unanimated model to the animated one (the faster method), or set the materials on the animated model manually.&lt;br /&gt;
&lt;br /&gt;
You will also most likely need to set shading settings on some body parts on the unanimated model to fix Alpha transparency issues (much like in XSI) - specifically connect the Alpha parameter of Base Color node to any parameter in Principled BSDF that will work, like Emission Strength (this should be set up differently as that&#039;s technically incorrect, but I don&#039;t know how at this moment).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Konoko upon importing to Blender !! Fixed transparency !! Copying materials !! Setting materials in Shading&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:ABR Konoko broken alpha.png|200px|frameless|center]] || [[Image:ABR_Konoko_fixed_alpha.png|200px|frameless|center]] || [[Image:ABR_Copying_materials.png|200px|frameless|center]] || [[Image:ABR Konoko fixed alpha.png|200px|frameless|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Bi-platform modding tools]][[Category:Completed modding tools]]&lt;/div&gt;</summary>
		<author><name>Delano762</name></author>
	</entry>
</feed>