Difference between revisions of "NifSkope: Adding Collision Model"

no edit summary
imported>Entim
(Added category: Modeling and Texturing Tutorials)
Tag: Manual revert
 
(34 intermediate revisions by 4 users not shown)
Line 1: Line 1:
The purpose of this article is to give a step by step guide to the [[Finessing Physics#Better Collision Modelling|Better Collision Modelling]] method described in [[Finessing Physics]] tutorial. The goal of the process is to create a simple model (without bones and animations) properly interacting with it's environment.
'''Note to Blender users:'''
This guide is mostly deprecated for you.
The current Blender export scripts support the export of collision models.
See [http://niftools.sourceforge.net/wiki/Blender/Collision Blender/Collision] on the NifTools wiki.
However it can be useful to read the Refinig Collision Properties section of this guide.
The purpose of this article is to give a step by step guide to the [[Finessing Physics#Better Collision Modelling|Better Collision Modelling]] method described in [[Finessing Physics]] tutorial. The goal of the process is to create a simple model properly interacting with its environment. This method gives the most resource demanding type of collision model, but the easiest to create.


==Getting Started==


==Getting Started==
===Required tools===
*A BSA unpacker, for example [[BSA Commander]], [[BSA Unpacker]],or [[TES4BSA]] to unpack NIF files.
*The '''latest''' version of [[NifSkope]] to edit the NIF files. The example screenshots of this guide were taken from the 0.9.3 and 0.9.8 versions. Check the NifSkope download page once in a while.
*A 3D modeller software, for example [[Blender]].


===Required Tools===
Tutorials for these tools:
*A BSA unpacker, for example [[BSA Commander]] or [[TES4BSA]] to unpack NIF files.
*The latest version of [[NifSkope]] to edit the NIF files. The example screenshots of this guide were taken from the 0.9.3 version.
TES4BSA: [[BSA Unpacker Tutorial]]
NifSkope: [http://niftools.sourceforge.net/wiki/NifSkope/Documentation_And_Tutorials NifSkope Documentation & Tutorials]
Blender: [http://en.wikibooks.org/wiki/Blender_3D:_Noob_to_Pro Blender 3D:Noob to Pro], [http://niftools.sourceforge.net/wiki/Blender/Configuration#Oblivion Blender Configuration for Import & Export of Nifs]


===Preparation===
===Preparation===
*Make your model in your 3d modeller application, for example [[Blender]].
*Make your model in your 3D modeller application.
*Create the low-poly version of the model without any texturing or material settings.
*Create the low-poly version of the model without any texturing or material settings.
*Export these models in [[NIF_Importers_and_Exporters|NIF]] or [http://www.niftools.org/wiki/index.php/NifSkope/Mesh_import_export OBJ] format.
*Export these models in NIF or OBJ format.
*Unpack ''\data\meshes\dungeons\ayleidruins\exterior\arstatue01.nif'' from ''\Oblivion\Data\meshes.bsa''. If you don't know how to do it, read the [[BSA Unpacker Tutorial]].
**See [[NIF Importers and Exporters]] for import and export plugins.
**See [http://niftools.sourceforge.net/wiki/NifSkope/Mesh_import_export niftools.sourceforge.net:Mesh import export] for OBJ exporting help.
*Unpack ''\data\meshes\dungeons\ayleidruins\exterior\arstatue01.nif'' from ''\Oblivion\Data\meshes.bsa''.




Line 21: Line 34:
*Start NifSkope.
*Start NifSkope.
*Enable '''Block Details''' in the '''View''' menu, or push '''F2'''.
*Enable '''Block Details''' in the '''View''' menu, or push '''F2'''.
*In the '''File''' menu choose '''Load''', and navigate to the folder where you have unpacked the ''arstatue01.nif''. Open this file. You have done everything right so far if a statue of a man with a bird on his shoulder appears on the preview window.
*In the '''File''' menu choose '''Load''', and navigate to the folder where you have unpacked the ''arstatue01.nif''. Open this file. You have done everything right so far if a statue of a man with a bird on his shoulder appears on the render window.
*In the '''File''' menu choose '''New Window'''. This will start another instance of NifSkope. Load your high-poly model here.
*In the '''File''' menu choose '''New Window'''. This will start another instance of NifSkope. Load your high-poly model here.
**If you have exported your model in NIF format, load it the same way as the arstatue01.nif.
**If you have exported your model in NIF format, load it the same way as the arstatue01.nif.
Line 27: Line 40:
*Open a '''New Window''' again, and load the low-poly model here.
*Open a '''New Window''' again, and load the low-poly model here.


In every instance of NifSkope you should see the appropriate model in the Preview window, a Block List window, and a Block Details window.
In every instance of NifSkope you should see the appropriate model in the render window, a Block List window, and a Block Details window.
 
 


===Preparing the arstatue01 model===
===Preparing the arstatue01 model===
Line 33: Line 48:
The ''arstatue01.nif'' was chosen becouse it's collision geometry data format allows importing custom made models' geometry. You are going to import your high-poly and low-poly models' data into this file, but first the unneccessary data need to be removed.
The ''arstatue01.nif'' was chosen becouse it's collision geometry data format allows importing custom made models' geometry. You are going to import your high-poly and low-poly models' data into this file, but first the unneccessary data need to be removed.


*Swich to the instance of NifSkope where ''arstatue01.nif'' was loaded. This will be your final model at the end of the process, so save it with a different name.
{|
[[image:CollTut01.gif|right|thumb]]
|-
*Expand '''0 NiNode''' block on the Block List window, and right-click on '''7 NiTriStrips'''. Choose '''Block -> Remove Branch''' from the pop-up menu. The 7 NiTriStrips block should be gone. Remove the remaining four NiTriStrips blocks. These blocks contained every information of the model (geometry, textures, material properties), except the collision data. The remaining red wireframe represents the collision geometry. Enable '''Draw Havok''' in the '''View''' menu if you can't see it.
|valign="top"|<font size=2>'''1.''' </font>Swich to the instance of NifSkope where ''arstatue01.nif'' was loaded. This will be your final model at the end of the process, so save it with a different name.
[[Image:CollTut06.gif|right|thumb]]
|-
*Navigate to the '''3 NiTriStripsData''' block, and choose '''Block -> Remove''' after right-clicking. This block contains the collision geometry data. The preview window should be empty now.
|valign="top"|<font size=2>'''2.''' </font>Expand '''0 NiNode''' block on the Block List window, and right-click on '''7 NiTriStrips'''. Choose '''Block -> Remove Branch''' from the pop-up menu. The 7 NiTriStrips block should be gone. Remove the remaining four NiTriStrips blocks. These blocks contained every information of the model (geometry, textures, material properties), except the collision data. The remaining red wireframe represents the collision geometry. Enable '''Draw Havok''' in the '''Render''' menu if you can't see it.
[[Image:CollTut02.gif|right|thumb]]
|[[image:CollTut01.gif|thumb|100px]]
*Select '''5 bhkRigidBodyT''' block in the '''Block List''' window, and double-click on the '''Value''' of the '''Translation''' in the '''Block Details''' window. Set x, y, and z to zero. This positions the collision geometry to the origo.
|-
 
|valign="top"|<font size=2>'''3.''' </font>Navigate to the '''3 NiTriStripsData''' block, and choose '''Block -> Remove''' after right-clicking. This block contains the collision geometry data. The render window should be empty now.
 
|[[Image:CollTut06.gif|thumb|100px]]
 
|-
 
|valign="top"|<font size=2>'''4.''' </font>Select '''5 bhkRigidBodyT''' block in the '''Block List''' window, and double-click on the '''Value''' of the '''Translation''' in the '''Block Details''' window. Set x, y, and z to zero. This positions the collision geometry to the origo.
 
|[[Image:CollTut02.gif|thumb|100px]]
 
|}
 
 




Line 53: Line 66:
===Preparing the low-poly model===
===Preparing the low-poly model===


*Switch to the instance of NifSkope where you loaded your low-poly model.
Note:
[[Image:CollTut07.gif|right|thumb]]
Instead of the low-poly model, you can use a '''NiTriShape''' or '''NiTriStrips''' block from any NIF (including the high-poly model!).
*Expand the '''0 NiNode''' block. If you exported only the geometry of the model, it contains one '''NiTriShape''' and one '''NiTriShapeData''' block. Right-click on the '''NiTriShape''' block, and choose '''Mesh -> Make Normals''' from the menu.
[[Image:CollTut08.gif|right|thumb]]
*Right-click on the '''NiTriShape''' block again, and choose '''Mesh -> Strippify''' from the menu. This converts the the geometry from triangles to strips. Strippifying is needed becouse the collision geometry of ''arstatue01.nif'' was built from strips, and the low-poly model's geometry is going to replace it.
*Reset the '''Translation''' in the '''Block Details''' window if it is not zero.
 
 


{|
|-
|valign="top"|<font size=2>'''1.''' </font>Switch to the instance of NifSkope where you loaded your low-poly model.
|-
|valign="top"|<font size=2>'''2.''' </font>Expand the '''0 NiNode''' block. If you exported only the geometry of the model, it contains one '''NiTriShape''' and one '''NiTriShapeData''' block. To be sure you don't have duplicated vertices in your model, right-click on the '''NiTriShape''' block, and choose '''Mesh -> Remove Doublicated Vertices'''.
|-
|valign="top"|<font size=2>'''3.''' </font>Right-click on the '''NiTriShape''' block, and choose '''Mesh -> Face Normals''' from the menu. (Before NifSkope version 0.9.4: '''Make Normals'''.)
|[[Image:CollTut07.gif|100px|thumb]]
|-
|valign="top"|<font size=2>'''4.''' </font>Right-click on the '''NiTriShape''' block again, and choose '''Mesh -> Strippify''' from the menu. This converts the the geometry from triangles to strips. Strippifying is needed becouse the collision geometry of ''arstatue01.nif'' was built from strips, and the low-poly model's geometry is going to replace it.
|[[Image:CollTut08.gif|100px|thumb]]
|}




Line 67: Line 86:
===Importing the new data===
===Importing the new data===


[[Image:CollTut03.gif|right|thumb]]
{|
*Switch to your high-poly model. Select the '''NiTriShape''' block. Reset the '''Translation''' in the '''Block Details''' window if it is not zero. Right-click on the '''NiTriShape''' block, and choose '''Block -> Copy Branch''' from the menu.
|-
[[Image:CollTut04.gif|right|thumb]]
|valign="top"|<font size=2>'''1.''' </font>Switch to your high-poly model. Right-click on the '''NiTriShape''' block, and choose '''Block -> Copy Branch''' from the menu.
[[Image:CollTut05.gif|right|thumb]]
|[[Image:CollTut03.gif|100px|right|thumb]]
*Switch back to the cleaned NIF (which was ''arstatue01.nif''). Right-click on '''0 NiNode''' and choose '''Block -> Paste Branch'''. NifSkope will probably argue about NIF versions, choose '''Continue'''. The geometry, texture, material data of the high-poly model is pasted in now.
|-
[[Image:CollTut09.gif|right|thumb]]
|valign="top"|<font size=2>'''2.''' </font>Switch back to the cleaned NIF (which was ''arstatue01.nif''). Right-click on '''0 NiNode''' and choose '''Block -> Paste Branch'''. NifSkope will probably argue about NIF versions, choose '''Continue'''. The high-poly model's NiTriShape, which contains geometry, texture, material data, is pasted in now.
*Switch to your low-poly model. Right-click on the '''NiTriStripsData''' block, and choose '''Block -> Copy'''.
|[[Image:CollTut04.gif|100px|right|thumb]]
[[Image:CollTut10.gif|right|thumb]]
|-
*Switch back to the cleaned NIF. Right-click on the '''0 NiNode''' block, and choose '''Block -> Paste'''. Choose Continue again if NifSkope argues about the NIF version.
|
[[Image:CollTut11.gif|right|thumb]]
|[[Image:CollTut05.gif|100px|right|thumb]]
*Select the '''4 bhkNiTriStripsShape'''. Double-click on the '''Value''' of the '''Strips Data''' entry in the '''Block Details''' window, and enter the reference number of the new NiTriStripsData (1). The low-poly model's geometry data is now linked to the collision data.
|-
[[Image:CollTut15.gif|right|thumb]]
|valign="top"|<font size=2>'''3.''' </font>Double-click on the '''Value''' of '''Num Children''' attribute in the '''Block Details''' window. This number controls how many child objects the NiNode has. Set it to 1. Expand '''Children'''. The list of the NiNode's children is not updated automatically, it still contains six references. The five Children with ''None'' value were the NiTriShapes you have removed, the sixth is the NiTriShape you have just pasted.
*The collision data blocks must be in a specific order, which the NiTriStripsData doesn't fit in yet. Right-click on the '''1 NiTriStripsData''' block, and choose '''Block -> Move Down'''. Notice the reference number has changed to '''2'''. Repeat the '''Move Down''', so the number becomes '''3'''.
|[[Image:CollTut14.gif|100px|right|thumb]]
*Save the NIF.
|-
 
|valign="top"|<font size=2>'''4.''' </font>Right click on the '''Children''' attribute, and choose '''Array -> Update'''. This updates the size of the Children list according to Num Children.
 
|[[Image:CollTut16.gif|100px|right|thumb]]
 
|-
 
|valign="top"|<font size=2>'''5.''' </font>Expand '''Children''', and set its child's '''Value''' to the reference number of your NiTriShape ('''6'''). The high-poly model's NiTriShape is linked correctly to the NiNode now.
 
|[[Image:CollTut17.gif|100px|right|thumb]]
|-
|valign="top"|<font size=2>'''6.''' </font>Switch to your low-poly model. Right-click on the '''NiTriStripsData''' block, and choose '''Block -> Copy'''.
|[[Image:CollTut09.gif|100px|right|thumb]]
|-
|valign="top"|<font size=2>'''7.''' </font>Switch back to the cleaned NIF. Right-click on the '''0 NiNode''' block, and choose '''Block -> Paste'''. Choose Continue again if NifSkope argues about the NIF version.
|[[Image:CollTut10.gif|100px|right|thumb]]
|-
|valign="top"|<font size=2>'''8.''' </font>Select the '''4 bhkNiTriStripsShape'''. Double-click on the '''Value''' of the '''Strips Data''' entry in the '''Block Details''' window, and enter the reference number of the new NiTriStripsData ('''1'''). The low-poly model's geometry data is now linked to the collision shape.
|[[Image:CollTut11.gif|100px|right|thumb]]
|-
|valign="top"|<font size=2>'''9.''' </font>Here comes the step which makes it worth to use this type of collision. Right-click on the '''bhkNiTriStripsShape''' block, and choose '''Havok -> Pack Strips'''. The bhkNiTriStripsShape block will be converted to a bhkPackedNiTriStripsShape. The NiTriStripsData becomes hkPackedNiTriStripsData. This feature introduced in the 0.9.7 version of NifSkope.
|[[Image:CollTut20.gif|100px|right|thumb]]
|-
|valign="top"|<font size=2>'''10.''' </font>The meshes may not line up at all at this point. Select '''5 bhkRigidBodyT''' block in the '''Block List''' window, and double-click on the '''Value''' of the '''Translation''' in the '''Block Details''' window. Play with x, y, and z until the collision geometry lines up with the mesh.
|-
|valign="top"|<font size=2>'''11.''' </font>The collision data blocks must be in a specific order, which the hkPackedNiTriStripsData doesn't fit in yet. Choose '''Reorder Havok Blocks''' from the '''Spells''' -> '''Sanitize''' menu. To reorder the blocks manually, right-click on the '''1 NiTriStripsData''' block, and choose '''Block -> Move Down'''. Notice the reference number has changed to '''2'''. Repeat the '''Move Down''', so the number becomes '''3'''. See [[Finessing_Physics#Simple_Collision_Modelling|Finessing Physics]] tutorial's explanation of the correct block order.
|[[Image:CollTut15.gif|100px|right|thumb]]
|-
|valign="top"|<font size=2>'''12.''' </font>Save the NIF.
|}




==Refining Collision Properties==
==Refining Collision Properties==


Now your model has working collision geometry, but it's material properties (mobility, hit sound, arrow penetration) are inherited from the statue. It sounds like stone when hit, arrows bounce off from the surface, and it is static.
Now your model has working collision geometry, but its material properties (mobility, hit sound, arrow penetration) are inherited from the statue. It sounds like stone when hit, arrows bounce off from the surface, and it is static.
 
===Material Setting===
 
[[Image:CollTut13.gif|right|thumb]]
Select '''4 bhkNiTriStripsShape''' block. Double-click on the '''Value''' of the '''Material''' entry (currently '''HAV_MAT_STONE'''). You get a drop-down list of available materials. Choose the material from the list, or enter the appropriate number which can be found [http://niftools.sourceforge.net/docsys/index.php?mode=list&table=attr&block_id=383&version=335544325 here]. This setting controls the hit sound, step sound, and arrow penetrability of the surface.
 
 
 
 


===Material setting===


[[Image:CollTut13.gif|100px|right|thumb]]
Select the '''bhkPackedNiTriStripsShape''' block. Expand the Sub Shapes array in the '''Block Details''' window. Double-click on the '''Value''' of the '''Material''' property (currently '''HAV_MAT_STONE'''). You get a drop-down list of available materials. This list with some explanation is available as tooltip (hold your mouse over the '''Type''' field of the Material property). Choose the material from the dropdown list, or enter the appropriate number which can be found [http://niftools.sourceforge.net/doc/nif/HavokMaterial.html here] as well. This setting controls the hit sound, step sound, arrow penetrability, and particle effect of the surface.




===Collision properties===


[[Image:CollTut12.gif|100px|right|thumb]]
Select the '''5 bhkRigidBodyT''' block. Interesting properties are marked with red dots on the picture. A list of the available properties is [http://niftools.sourceforge.net/doc/nif/bhkRigidBodyT.html here]


Most important properties:
*The '''layer''' settings control the collision model's color in the '''CS''', and other properties as well, for example the NONCOLLIDABLE layer will make the collision body to behave like a harvestable object (no collision, but the activator icon shows up). The list of layers with some explanation is also available as tooltip.
*'''Motion System''', '''Unknown Byte 1''' and '''2''', '''Quality Type''' controls wheather the object is static or mobile. See [[Finessing_Physics#The_Main_Blocks|Finessing Physics]] tutorial's bhkRigidBody explanation.


Compare these properties to other NIFs, and change them accordingly.


Further information about the NIF format and NifSkope can be found at [http://niftools.sourceforge.net/wiki/NifTools niftools.sourceforge.net]. Information about NIF format/Havok system is [http://niftools.sourceforge.net/wiki/Category:Nif_Format here].




==Troubleshoot==


If you encounter any problems, please read the guide's [http://www.bethsoft.com/bgsforums/index.php?showtopic=582114 thread] at the CS forum. Post there, or at this article's Discussion Page if you can't find the solution.




===Collision properties===
[[Image:CollTut12.gif|right|thumb]]
Select the '''5 bhkRigidBodyT''' block. Interesting properties are marked with red dots on the picture. A list of all available properties is [http://niftools.sourceforge.net/docsys/index.php?mode=list&table=attr&block_id=317&version=335544325 here]
Most important properties:
*The '''layer''' settings control the mesh color in '''CS''', wheather the activator icon shows up when the player is close enough, wheather it behaves like a harvestable object like plants (no collision, but the activator icon shows up).
*'''Motion System''', '''Unknown Byte 1''' and '''2''', '''Quality Type''' controls wheather the object is static or mobile.
Compare these properties to other NIFs, and change them accordingly.
--[[User:Entim|Entim]] 17:44, 18 September 2006 (EDT)
[[Category:Tutorials]]
[[Category:Tutorials]]
[[Category:Modeling_and_Texturing_Tutorials]]
[[Category:NifSkope Tutorials]]
[[Category:Modeling Tutorials]]
Anonymous user