<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.pioneerspacesim.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=ImTheFish</id>
	<title>PioneerWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.pioneerspacesim.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=ImTheFish"/>
	<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/wiki/Special:Contributions/ImTheFish"/>
	<updated>2026-04-24T08:29:42Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=3DS_Max&amp;diff=460</id>
		<title>3DS Max</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=3DS_Max&amp;diff=460"/>
		<updated>2013-01-09T14:11:47Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: /* Empty nodes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''3DS Max'''&lt;br /&gt;
&lt;br /&gt;
I recommend reading the [[Model system]] page first as most of whats there is still relevant when it comes to creating content for pioneer this is just whats different in 3DS Max.&lt;br /&gt;
&lt;br /&gt;
== '''Scale''' ==&lt;br /&gt;
&lt;br /&gt;
1 unit in 3DS Max is equal to 1 meter in Pioneer. Putting a &amp;quot;person sized&amp;quot; (~1.8 units tall) box next to your model should also help with getting the scale right.&lt;br /&gt;
&lt;br /&gt;
== '''Orientation''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Max uses different axis orientation to Blender and pioneer and there are a few ways to deal with this but changing the direction of your model so the front is facing the back just before export is probably the easiest.&lt;br /&gt;
&lt;br /&gt;
[[File:OrientationTop.png]]&lt;br /&gt;
&lt;br /&gt;
== '''.OBJ Export''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is probably the easiest format to export your model in but lacks the ability to hold empty nodes for things like thrusters and cant store any animations so this is best to use for things like collision meshes&lt;br /&gt;
&lt;br /&gt;
[[File:ExportObj.png]]&lt;br /&gt;
&lt;br /&gt;
A basic setup of the .OBJ options&lt;br /&gt;
&lt;br /&gt;
[[File:ObjOptions.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''.DAE Export''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The .DAE format is a bit more complicated but can store all the things that the .Obj cant&lt;br /&gt;
&lt;br /&gt;
[[File:ExportDae.png]]&lt;br /&gt;
&lt;br /&gt;
As you can see there are alot more options to play with but this setup works with both thrusters and animations&lt;br /&gt;
&lt;br /&gt;
[[File:DaeOptions.png]]&lt;br /&gt;
&lt;br /&gt;
When exporting thrusters and other empty nodes you will get a warning but this is not a problem and can be turned off in the options &lt;br /&gt;
&lt;br /&gt;
[[File:DaeWarnings.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Empty nodes''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Things like thrusters use empty nodes that can be created using 'Helper Objects'. The best one i have found is the 'Point' helper.&lt;br /&gt;
&lt;br /&gt;
[[File:ThrusterObjects.png]]&lt;br /&gt;
&lt;br /&gt;
Once the object is placed you will want to set its orientation and scale, when setting the scale the object can seem to get very large very quickly while not gaining much size in the model viewer but the size of the object can be changed in max without effecting the scale by using the 'Size' option for the object. The orientation is simple just rotate the top to face the way you want the thruster to point.&lt;br /&gt;
&lt;br /&gt;
[[File:ThrusterOrientation.png]]&lt;br /&gt;
&lt;br /&gt;
When using these to place labels the writing is placed along the X axis facing out to the Z axis with the Y axis at the top&lt;br /&gt;
&lt;br /&gt;
And remember that the node is placed at the center of the helper object and is scaled out from there&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=3DS_Max&amp;diff=459</id>
		<title>3DS Max</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=3DS_Max&amp;diff=459"/>
		<updated>2013-01-09T14:10:21Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''3DS Max'''&lt;br /&gt;
&lt;br /&gt;
I recommend reading the [[Model system]] page first as most of whats there is still relevant when it comes to creating content for pioneer this is just whats different in 3DS Max.&lt;br /&gt;
&lt;br /&gt;
== '''Scale''' ==&lt;br /&gt;
&lt;br /&gt;
1 unit in 3DS Max is equal to 1 meter in Pioneer. Putting a &amp;quot;person sized&amp;quot; (~1.8 units tall) box next to your model should also help with getting the scale right.&lt;br /&gt;
&lt;br /&gt;
== '''Orientation''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Max uses different axis orientation to Blender and pioneer and there are a few ways to deal with this but changing the direction of your model so the front is facing the back just before export is probably the easiest.&lt;br /&gt;
&lt;br /&gt;
[[File:OrientationTop.png]]&lt;br /&gt;
&lt;br /&gt;
== '''.OBJ Export''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is probably the easiest format to export your model in but lacks the ability to hold empty nodes for things like thrusters and cant store any animations so this is best to use for things like collision meshes&lt;br /&gt;
&lt;br /&gt;
[[File:ExportObj.png]]&lt;br /&gt;
&lt;br /&gt;
A basic setup of the .OBJ options&lt;br /&gt;
&lt;br /&gt;
[[File:ObjOptions.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''.DAE Export''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The .DAE format is a bit more complicated but can store all the things that the .Obj cant&lt;br /&gt;
&lt;br /&gt;
[[File:ExportDae.png]]&lt;br /&gt;
&lt;br /&gt;
As you can see there are alot more options to play with but this setup works with both thrusters and animations&lt;br /&gt;
&lt;br /&gt;
[[File:DaeOptions.png]]&lt;br /&gt;
&lt;br /&gt;
When exporting thrusters and other empty nodes you will get a warning but this is not a problem and can be turned off in the options &lt;br /&gt;
&lt;br /&gt;
[[File:DaeWarnings.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Empty nodes''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Things like thrusters use empty nodes that can be created using 'Helper Objects'. The best one i have found is the 'Point' helper.&lt;br /&gt;
&lt;br /&gt;
[[File:ThrusterObjects.png]]&lt;br /&gt;
&lt;br /&gt;
Once the object is placed you will want to set its orientation and scale, when setting the scale the object can seem to get very large very quickly while not gaining much size in the model viewer but the size of the object can be changed in max without effecting the scale by using the 'Size' option for the object. The orientation is simple just rotate the top to face the way you want the thruster to point.&lt;br /&gt;
[[File:ThrusterOrientation.png]]&lt;br /&gt;
&lt;br /&gt;
When using these to place labels the writing is placed along the X axis facing out to the Z axis with the Y axis at the top&lt;br /&gt;
&lt;br /&gt;
And remember that the node is placed at the center of the helper object and is scaled out from there&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=3DS_Max&amp;diff=455</id>
		<title>3DS Max</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=3DS_Max&amp;diff=455"/>
		<updated>2013-01-03T09:49:22Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: /* Empty nodes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''3DS Max'''&lt;br /&gt;
&lt;br /&gt;
I recommend reading the [[Model system]] page first as most of whats there is still relevant when it comes to creating content for pioneer this is just whats different in 3DS Max.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Orientation''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Max uses different axis orientation to Blender and pioneer and there are a few ways to deal with this but changing the direction of your model so the front is facing the back just before export is probably the easiest.&lt;br /&gt;
&lt;br /&gt;
[[File:OrientationTop.png]]&lt;br /&gt;
&lt;br /&gt;
== '''.OBJ Export''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is probably the easiest format to export your model in but lacks the ability to hold empty nodes for things like thrusters and cant store any animations so this is best to use for things like collision meshes&lt;br /&gt;
&lt;br /&gt;
[[File:ExportObj.png]]&lt;br /&gt;
&lt;br /&gt;
A basic setup of the .OBJ options&lt;br /&gt;
&lt;br /&gt;
[[File:ObjOptions.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''.DAE Export''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The .DAE format is a bit more complicated but can store all the things that the .Obj cant&lt;br /&gt;
&lt;br /&gt;
[[File:ExportDae.png]]&lt;br /&gt;
&lt;br /&gt;
As you can see there are alot more options to play with but this setup works with both thrusters and animations&lt;br /&gt;
&lt;br /&gt;
[[File:DaeOptions.png]]&lt;br /&gt;
&lt;br /&gt;
When exporting thrusters and other empty nodes you will get a warning but this is not a problem and can be turned off in the options &lt;br /&gt;
&lt;br /&gt;
[[File:DaeWarnings.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Empty nodes''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Things like thrusters use empty nodes that can be created using 'Helper Objects'. The best one i have found is the 'Point' helper.&lt;br /&gt;
&lt;br /&gt;
[[File:ThrusterObjects.png]]&lt;br /&gt;
&lt;br /&gt;
Once the object is placed you will want to set its orientation and scale, when setting the scale the object can seem to get very large very quickly while not gaining much size in the model viewer but the size of the object can be changed in max without effecting the scale by using the 'Size' option for the object. The orientation is simple just rotate the top to face the way you want the thruster to point.&lt;br /&gt;
[[File:ThrusterOrientation.png]]&lt;br /&gt;
&lt;br /&gt;
When using these to place labels the writing is placed along the X axis facing out to the Z axis with the Y axis at the top&lt;br /&gt;
&lt;br /&gt;
And remember that the node is placed at the center of the helper object and is scaled out from there&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Model_system&amp;diff=454</id>
		<title>Model system</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Model_system&amp;diff=454"/>
		<updated>2013-01-02T15:35:12Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: /* 3DS Max */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
tl;dr: a simple scenegraph-based approach that has nothing to do with the old system or Lua, focus is on easy importing, supports some animation.&lt;br /&gt;
&lt;br /&gt;
== Importing models ==&lt;br /&gt;
&lt;br /&gt;
The import system theoretically supports [http://assimp.sourceforge.net/main_features_formats.html many different formats] but you are expected to use only some:&lt;br /&gt;
&lt;br /&gt;
* When node structure, node names and animations matter, use '''Collada (.dae).'''&lt;br /&gt;
* For static geometry, such as buildings, OBJ is recommended, this may allow for some optimizations&lt;br /&gt;
&lt;br /&gt;
The only officially tested 3D modelling program at the moment is [http://www.blender.org/ Blender 2.64]. For blender, a quick checklist is:&lt;br /&gt;
&lt;br /&gt;
* Coordinates: X right, Y forward, Z up&lt;br /&gt;
* Always generate UV coordinates for the model&lt;br /&gt;
* Versions downloaded from blender.org support Collada out of the box, while the version distributed with some Linux distros doesn't&lt;br /&gt;
&lt;br /&gt;
The [[Model viewer]] is supplied with the game.&lt;br /&gt;
&lt;br /&gt;
=== Model definition file ===&lt;br /&gt;
&lt;br /&gt;
Models must be placed under '''data/models'''&lt;br /&gt;
&lt;br /&gt;
To define a model, create a simple &amp;lt;code&amp;gt;name_here.model&amp;lt;/code&amp;gt; text file along with your exported meshes:&lt;br /&gt;
&lt;br /&gt;
 #Comments can be written like this&lt;br /&gt;
 #Define all used materials first&lt;br /&gt;
 Material some-material&lt;br /&gt;
 tex_diff some_texture.png&lt;br /&gt;
 diffuse 0.8 0.7 0.7&lt;br /&gt;
 &lt;br /&gt;
 #Meshes to be imported into this model, should be in the current folder&lt;br /&gt;
 #Mixing different formats should be OK&lt;br /&gt;
 mesh part1.obj&lt;br /&gt;
 mesh part2.obj&lt;br /&gt;
&lt;br /&gt;
== Materials ==&lt;br /&gt;
&lt;br /&gt;
Only material names are imported from 3D models, to set material properties use a small definition like this:&lt;br /&gt;
&lt;br /&gt;
 material CobraI_body&lt;br /&gt;
 tex_diff CobraI_diff.png&lt;br /&gt;
 tex_glow CobraI_emit.png&lt;br /&gt;
 tex_spec CobraI_spec.png&lt;br /&gt;
 diffuse 1.0 1.0 1.0&lt;br /&gt;
 specular 1.0 1.0 1.0&lt;br /&gt;
 shininess 150&lt;br /&gt;
&lt;br /&gt;
=== Material properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| material || Name. Mandatory! Note, some exporters modify the names from what is visible in the modeling program, for example the Blender 2.6 Collada exporter adds &amp;quot;-material&amp;quot; to each name. You'll have to use this final name. If in doubt, note that both .obj and .dae files are human readable, and you can find the assigned names in them with a text editor.&lt;br /&gt;
|-&lt;br /&gt;
| diffuse|| Diffuse colour RGB. Default white.&lt;br /&gt;
|-&lt;br /&gt;
| specular|| Colour of specular highlights, RGB. Default white. Set to black to disable highlights.&lt;br /&gt;
|-&lt;br /&gt;
| emissive|| Self-illumination colour, RGB. Default black.&lt;br /&gt;
|-&lt;br /&gt;
| shininess|| Sharpness/size of specular highlights, 0 - 200. Default 200.&lt;br /&gt;
|-&lt;br /&gt;
| opacity|| 0-100, controls transparency of the material. A node with a material opacity less than 100 is treated as transparent, otherwise opaque.&lt;br /&gt;
|-&lt;br /&gt;
| tex_diff || Diffuse texture, file name (in the same folder). If you don't specify this, a white dummy texture is generated.&lt;br /&gt;
|-&lt;br /&gt;
| tex_glow||Self-illumination texture, overrides emissive colour parameter. Default none.&lt;br /&gt;
|-&lt;br /&gt;
| tex_spec||Specular highlight colour/intensity texture. Default none. Multiplied by specular colour parameter, so set it to white to leave control entirely to the texture.&lt;br /&gt;
|-&lt;br /&gt;
| use_patterns||yes/no. This material will use the pattern/colour system. Read more below. Default no.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_specularmap.png]]&lt;br /&gt;
Flat specular lighting improved by a specular map&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_glowmap.png]]&lt;br /&gt;
A model lit only by the self-illumination texture&lt;br /&gt;
&lt;br /&gt;
=== Patterns ===&lt;br /&gt;
&lt;br /&gt;
A system to mark customizable color areas on a model without splitting it to separate materials.&lt;br /&gt;
&lt;br /&gt;
Patterns are small grayscale textures placed in the model folder, named pattern*.png. Using gray or white colour you can mark the areas tinted by one of the customizable colours (black marks unaffected areas). The colours are set by the game (faction-specific ship colours, shipyard UI for the player).&lt;br /&gt;
&lt;br /&gt;
The system has several limitations: it is not meant to do fine details, transitioning from one color to another is sharp and it works best with white/light textures. You'll have to experiment.&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_patterns_asp.png]]&lt;br /&gt;
&lt;br /&gt;
== Detail levels ==&lt;br /&gt;
&lt;br /&gt;
Meshes can be grouped into detail levels using the &amp;lt;code&amp;gt;lod pixelsize&amp;lt;/code&amp;gt; directive:&lt;br /&gt;
&lt;br /&gt;
 lod 100&lt;br /&gt;
 mesh hull_low.dae&lt;br /&gt;
 &lt;br /&gt;
 lod 200&lt;br /&gt;
 mesh hull_med.dae&lt;br /&gt;
 &lt;br /&gt;
 lod 1000&lt;br /&gt;
 mesh hull_hi.dae&lt;br /&gt;
 mesh landing_gear.dae&lt;br /&gt;
&lt;br /&gt;
A detail level will be picked if the approximate size of the model on screen is less than &amp;lt;code&amp;gt;pixelsize&amp;lt;/code&amp;gt; (for the highest level it does not matter as long as it's larger than the others). Use the modelviewer to find optimal sizes.&lt;br /&gt;
&lt;br /&gt;
You may specify any number of detail levels in any order, they will be sorted according to size.&lt;br /&gt;
&lt;br /&gt;
== Animations ==&lt;br /&gt;
&lt;br /&gt;
Position, rotation and scale keyframe animation is supported. Since the Blender 2.6 Collada exporter cannot export multiple animations in one file, you will have to put it all in one timeline and split it at the import stage (this is also the only reliable way to get named animations). An animation is defined after all the meshes in format &amp;lt;code&amp;gt;anim name startframe endframe&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 anim gear_down 0 10&lt;br /&gt;
 anim something_else 12 25&lt;br /&gt;
&lt;br /&gt;
Note, Collada uses seconds instead of frame numbers. For the conversion to work, you should create the animations at '''24FPS'''.&lt;br /&gt;
&lt;br /&gt;
The game will recognize animations by name, the list of supported animations is to be decided.&lt;br /&gt;
&lt;br /&gt;
There is no animation blending, so two animations shouldn't be directly controlling the same node.&lt;br /&gt;
&lt;br /&gt;
== Attachments ==&lt;br /&gt;
&lt;br /&gt;
Models may have special &amp;quot;tag point&amp;quot; nodes where other models may be attached. You may define a tag point in Blender by placing an Empty object and giving it one of the predefined names.&lt;br /&gt;
&lt;br /&gt;
The system is meant for attaching equipment: guns, cargo pods, turrets...&lt;br /&gt;
&lt;br /&gt;
Example: A generic gun model attached to a point &amp;quot;tag_gun_right&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_tagpoints01.png]]&lt;br /&gt;
&lt;br /&gt;
The actual list of available names has not been determined yet.&lt;br /&gt;
&lt;br /&gt;
== Collisions ==&lt;br /&gt;
&lt;br /&gt;
By default, the collision mesh of a model is the bounding box of all the meshes. For more control, you can import a custom mesh using the &amp;lt;code&amp;gt;collision&amp;lt;/code&amp;gt; directive in the model definition:&lt;br /&gt;
&lt;br /&gt;
 collision collision.obj&lt;br /&gt;
&lt;br /&gt;
This will be global for all detail levels.&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_collmesh01.png]]&lt;br /&gt;
&lt;br /&gt;
== Decals ==&lt;br /&gt;
&lt;br /&gt;
Decals are meant for customizable insignia on spaceships and changing advertisements on space stations. Up to four unique decals are available for a model (multiple identical decals are allowed). Place a piece of geometry, usually a flat quad, with proper UV coordinates and name it decal_01, 02, 03 or 04. The game will then use a special material on the geometry, or make it invisible if no decal is to be used.&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_decals01.png]]&lt;br /&gt;
&lt;br /&gt;
== Labels ==&lt;br /&gt;
&lt;br /&gt;
Dynamic 3D labels are meant for naming ships and space stations. Put an empty node in the model and give it a name beginning with &amp;quot;label&amp;quot;. The text is set by the game at runtime if supported.&lt;br /&gt;
&lt;br /&gt;
Node scale can be used as usual but the text is not constrained to the node bounds or anything like that, so some trial will be required.&lt;br /&gt;
&lt;br /&gt;
You can use multiple label nodes but they will all show the same text.&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_labels01.png]]&lt;br /&gt;
&lt;br /&gt;
== Minor features ==&lt;br /&gt;
&lt;br /&gt;
=== Billboard lights ===&lt;br /&gt;
&lt;br /&gt;
Simple light sprites placed using empty nodes with special naming (navlight_*). Certain lights will blink when a ship's landing gear is down. This feature is not complete as it needs more support in the game.&lt;br /&gt;
&lt;br /&gt;
=== Thrusters ===&lt;br /&gt;
&lt;br /&gt;
Thrusters are marked with dummy objects. In Blender, create an &amp;quot;Empty&amp;quot; object and point its Z-axis (change the object display type to &amp;quot;arrows&amp;quot; or &amp;quot;single arrow&amp;quot; to visualize this) where the thruster should point. Thruster size is taken from the object scale. Begin the object name with either &amp;lt;code&amp;gt;thruster&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;thruster_linear&amp;lt;/code&amp;gt; so the importer can recognize them (linear thrusters light up only when moving up/down/left/right/forward/backward, not when turning).&lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
&lt;br /&gt;
You can find some testcase models at git://github.com/Luomu/newmodels.git.&lt;br /&gt;
&lt;br /&gt;
The internal scene graph consists of several of these nodes:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Node|| Base class. A node can have a name and one or more parents.&lt;br /&gt;
|-&lt;br /&gt;
| Group|| A group is a Node that can have several children.&lt;br /&gt;
|-&lt;br /&gt;
| MatrixTransform|| A Group that applies a transformation to its child nodes when rendering.&lt;br /&gt;
|-&lt;br /&gt;
| StaticGeometry|| Contains one or more StaticMeshes.&lt;br /&gt;
|-&lt;br /&gt;
| LOD|| Detail level control node, picks one of the child nodes based on the approximate size of the model on screen.&lt;br /&gt;
|-&lt;br /&gt;
| ModelNode || Can be used to attach another Model as a submodel. Use case: dynamic equipment on ships.&lt;br /&gt;
|-&lt;br /&gt;
| More!||Some marginal nodes that exist at the moment are:&lt;br /&gt;
&lt;br /&gt;
* Thruster: spaceship thruster&lt;br /&gt;
* Billboard: can be used for light sprites (navlights on ships)&lt;br /&gt;
* Label3D: dynamic 2d text, meant for labeling ships&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
MatrixTransform nodes are the most commonly used, if a geometry is rotated or scaled it will be parented to a MatrixTransform. A simple form of instancing can be achieved by adding a geometry as the child of several separate MatrixTransforms.&lt;br /&gt;
&lt;br /&gt;
During rendering, the graph is traversed twice. Once for opaque objects, and once for transparent objects (which includes decals, thrusters). The model system does not perform any depth sorting, this improvement job needs to be done elsewhere.&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
An animation consists of Channels. Each channel controls one node (always a MatrixTransform) and has a list of position and rotation Keys. Each key has a time and value. Keys are always linearly interpolated.&lt;br /&gt;
&lt;br /&gt;
At first the animations had proper play/pause/loop functionality but right now it is not so. Animation progress (and fun things like serialization) needs to be controlled directly by whatever feature uses the animation (see: landing gear).&lt;br /&gt;
&lt;br /&gt;
=== Export settings ===&lt;br /&gt;
&lt;br /&gt;
Collada (.dae) export settings for Blender 2.6:&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_exportsettings01.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Art]]&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=3DS_Max&amp;diff=453</id>
		<title>3DS Max</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=3DS_Max&amp;diff=453"/>
		<updated>2013-01-02T15:33:09Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''3DS Max'''&lt;br /&gt;
&lt;br /&gt;
I recommend reading the [[Model system]] page first as most of whats there is still relevant when it comes to creating content for pioneer this is just whats different in 3DS Max.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Orientation''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Max uses different axis orientation to Blender and pioneer and there are a few ways to deal with this but changing the direction of your model so the front is facing the back just before export is probably the easiest.&lt;br /&gt;
&lt;br /&gt;
[[File:OrientationTop.png]]&lt;br /&gt;
&lt;br /&gt;
== '''.OBJ Export''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is probably the easiest format to export your model in but lacks the ability to hold empty nodes for things like thrusters and cant store any animations so this is best to use for things like collision meshes&lt;br /&gt;
&lt;br /&gt;
[[File:ExportObj.png]]&lt;br /&gt;
&lt;br /&gt;
A basic setup of the .OBJ options&lt;br /&gt;
&lt;br /&gt;
[[File:ObjOptions.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''.DAE Export''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The .DAE format is a bit more complicated but can store all the things that the .Obj cant&lt;br /&gt;
&lt;br /&gt;
[[File:ExportDae.png]]&lt;br /&gt;
&lt;br /&gt;
As you can see there are alot more options to play with but this setup works with both thrusters and animations&lt;br /&gt;
&lt;br /&gt;
[[File:DaeOptions.png]]&lt;br /&gt;
&lt;br /&gt;
When exporting thrusters and other empty nodes you will get a warning but this is not a problem and can be turned off in the options &lt;br /&gt;
&lt;br /&gt;
[[File:DaeWarnings.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Empty nodes''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Things like thrusters use empty nodes that can be created using 'Helper Objects'. The best one i have found is the 'Point' helper.&lt;br /&gt;
&lt;br /&gt;
[[File:ThrusterObjects.png]]&lt;br /&gt;
&lt;br /&gt;
Once the object is placed you will want to set its orientation and scale, when setting the scale the object can seem to get very large very quickly while not gaining much size in the model viewer but the size of the object can be changed in max without effecting the scale by using the 'Size' option for the object. The orientation is simple just rotate the top to face the way you want the thruster to point.&lt;br /&gt;
[[File:ThrusterOrientation.png]]&lt;br /&gt;
&lt;br /&gt;
And remember that the node is placed at the center of the helper object and is scaled out from there&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Pioneer_Wiki&amp;diff=452</id>
		<title>Pioneer Wiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Pioneer_Wiki&amp;diff=452"/>
		<updated>2013-01-02T15:31:17Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: /* Content Creation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pioneer is a space adventure game set in the milkyway galaxy at the turn of the 31st century. The game is open-ended, and you are free to explore the millions of star systems in the game. You can land on planets, slingshot past gas giants, and burn yourself to a crisp flying between binary star systems. &lt;br /&gt;
&lt;br /&gt;
* [http://pioneerspacesim.net/download Download Pioneer] for Windows, Linux and Mac OSX&lt;br /&gt;
&lt;br /&gt;
* [http://sourceforge.net/projects/pioneerspacesim/files/nightly/ Development Builds] (warning, may be more unstable than a release) &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Please make this wiki nice. Add stuff about mods, dev, whatever. Be awesome! [[Getting started|How to get started]].&lt;br /&gt;
&lt;br /&gt;
And write a nice front page and get rid of this, ok? :)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{|width=100%&lt;br /&gt;
|width=&amp;quot;33%&amp;quot; style=&amp;quot;background:#bbffbb; border:2px solid #99ee99;  padding:2px 2px 4px 4px; vertical-align: top&amp;quot;|&lt;br /&gt;
===Community===&lt;br /&gt;
* [http://pioneerspacesim.net/ Pioneer Space Sim Homepage]&lt;br /&gt;
* [http://pioneerspacesim.net/forum Forums]&lt;br /&gt;
* [[FAQ]]&lt;br /&gt;
* [[Keyboard and mouse controls]]&lt;br /&gt;
* [http://twitter.com/pioneerspacesim @pioneerspacesim] on Twitter&lt;br /&gt;
* [[Media Coverage]]&lt;br /&gt;
|width=&amp;quot;33%&amp;quot; style=&amp;quot;background:#f0f0ff; border:2px solid #c6c9ff; padding:2px 2px 4px 4px; vertical-align: top&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
===Content Creation===&lt;br /&gt;
* [[Mods]]&lt;br /&gt;
* [[Introduction to Mission Scripting]]&lt;br /&gt;
** [[Interacting with the game: Event-based programming]]&lt;br /&gt;
** [[Interacting with the player: BBS forms]]&lt;br /&gt;
** [[Surviving a reload]]&lt;br /&gt;
* [http://eatenbyagrue.org/f/pioneer/codedoc/ Lua API Reference]&lt;br /&gt;
* Modeling&lt;br /&gt;
** [[Model system]]&lt;br /&gt;
** [[Model viewer]]&lt;br /&gt;
** [[Transitioning to the new model system]]&lt;br /&gt;
** [[3DS Max]]&lt;br /&gt;
* [[Music]]&lt;br /&gt;
* [[Sound Effects]]&lt;br /&gt;
* [[Translations]]&lt;br /&gt;
|width=&amp;quot;33%&amp;quot; style=&amp;quot;background:#fff3f3; border:2px solid #ffc9c9; padding:2px 2px 4px 4px; vertical-align: top&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
===Development===&lt;br /&gt;
* [[Design Scope|Game Scope]]&lt;br /&gt;
* [[Getting Started with Development]]&lt;br /&gt;
** [[Using git and GitHub]] (work in progress)&lt;br /&gt;
** [[Core Team]]&lt;br /&gt;
* [[Development Model]]&lt;br /&gt;
* [[Design_Workflow|Design and Project Management Workflow]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pioneer is brung to you by a flock of [https://github.com/pioneerspacesim/pioneer/blob/master/AUTHORS.txt opensource beardy-weirdies], and is [http://www.gnu.org/licenses/gpl.html Free Software]&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=3DS_Max&amp;diff=451</id>
		<title>3DS Max</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=3DS_Max&amp;diff=451"/>
		<updated>2013-01-02T15:29:51Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: Created page with &amp;quot;'''3DS Max'''  I recommend reading the Model_System page as most of whats there is still relevant when it comes to creating content for pioneer this is just whats different in 3D...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''3DS Max'''&lt;br /&gt;
&lt;br /&gt;
I recommend reading the Model_System page as most of whats there is still relevant when it comes to creating content for pioneer this is just whats different in 3DS Max.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Orientation''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Max uses different axis orientation to Blender and pioneer and there are a few ways to deal with this but changing the direction of your model so the front is facing the back just before export is probably the easiest.&lt;br /&gt;
&lt;br /&gt;
[[File:OrientationTop.png]]&lt;br /&gt;
&lt;br /&gt;
== '''.OBJ Export''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is probably the easiest format to export your model in but lacks the ability to hold empty nodes for things like thrusters and cant store any animations so this is best to use for things like collision meshes&lt;br /&gt;
&lt;br /&gt;
[[File:ExportObj.png]]&lt;br /&gt;
&lt;br /&gt;
A basic setup of the .OBJ options&lt;br /&gt;
&lt;br /&gt;
[[File:ObjOptions.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''.DAE Export''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The .DAE format is a bit more complicated but can store all the things that the .Obj cant&lt;br /&gt;
&lt;br /&gt;
[[File:ExportDae.png]]&lt;br /&gt;
&lt;br /&gt;
As you can see there are alot more options to play with but this setup works with both thrusters and animations&lt;br /&gt;
&lt;br /&gt;
[[File:DaeOptions.png]]&lt;br /&gt;
&lt;br /&gt;
When exporting thrusters and other empty nodes you will get a warning but this is not a problem and can be turned off in the options &lt;br /&gt;
&lt;br /&gt;
[[File:DaeWarnings.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Empty nodes''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Things like thrusters use empty nodes that can be created using 'Helper Objects'. The best one i have found is the 'Point' helper.&lt;br /&gt;
&lt;br /&gt;
[[File:ThrusterObjects.png]]&lt;br /&gt;
&lt;br /&gt;
Once the object is placed you will want to set its orientation and scale, when setting the scale the object can seem to get very large very quickly while not gaining much size in the model viewer but the size of the object can be changed in max without effecting the scale by using the 'Size' option for the object. The orientation is simple just rotate the top to face the way you want the thruster to point.&lt;br /&gt;
[[File:ThrusterOrientation.png]]&lt;br /&gt;
&lt;br /&gt;
And remember that the node is placed at the center of the helper object and is scaled out from there&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=File:ThrusterOrientation.png&amp;diff=450</id>
		<title>File:ThrusterOrientation.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=File:ThrusterOrientation.png&amp;diff=450"/>
		<updated>2013-01-02T15:21:43Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: orientation of the thrusters&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;orientation of the thrusters&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=File:ThrusterObjects.png&amp;diff=449</id>
		<title>File:ThrusterObjects.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=File:ThrusterObjects.png&amp;diff=449"/>
		<updated>2013-01-02T15:13:10Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: the point helper in 3ds max&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;the point helper in 3ds max&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=File:DaeWarnings.png&amp;diff=448</id>
		<title>File:DaeWarnings.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=File:DaeWarnings.png&amp;diff=448"/>
		<updated>2013-01-02T15:09:07Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: warnings generated in max when exporting thrusters&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;warnings generated in max when exporting thrusters&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=File:DaeOptions.png&amp;diff=447</id>
		<title>File:DaeOptions.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=File:DaeOptions.png&amp;diff=447"/>
		<updated>2013-01-02T14:58:24Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: uploaded a new version of &amp;amp;quot;File:DaeOptions.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;export options for .DAE in 3ds max&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=File:DaeOptions.png&amp;diff=446</id>
		<title>File:DaeOptions.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=File:DaeOptions.png&amp;diff=446"/>
		<updated>2013-01-02T14:57:17Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: export options for .DAE in 3ds max&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;export options for .DAE in 3ds max&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=File:ExportDae.png&amp;diff=445</id>
		<title>File:ExportDae.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=File:ExportDae.png&amp;diff=445"/>
		<updated>2013-01-02T14:53:27Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: uploaded a new version of &amp;amp;quot;File:ExportDae.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Export .Dae in max&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=File:ExportDae.png&amp;diff=444</id>
		<title>File:ExportDae.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=File:ExportDae.png&amp;diff=444"/>
		<updated>2013-01-02T14:52:14Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: Export .Dae in max&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Export .Dae in max&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=File:ObjOptions.png&amp;diff=443</id>
		<title>File:ObjOptions.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=File:ObjOptions.png&amp;diff=443"/>
		<updated>2013-01-02T14:42:48Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: quick look at the .obj options that worked for me&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;quick look at the .obj options that worked for me&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=File:ExportObj.png&amp;diff=442</id>
		<title>File:ExportObj.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=File:ExportObj.png&amp;diff=442"/>
		<updated>2013-01-02T14:36:15Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: uploaded a new version of &amp;amp;quot;File:ExportObj.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;export options for .obj part 1&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=File:ExportObj.png&amp;diff=441</id>
		<title>File:ExportObj.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=File:ExportObj.png&amp;diff=441"/>
		<updated>2013-01-02T14:34:41Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: export options for .obj part 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;export options for .obj part 1&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=File:OrientationTop.png&amp;diff=440</id>
		<title>File:OrientationTop.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=File:OrientationTop.png&amp;diff=440"/>
		<updated>2013-01-02T14:23:10Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: uploaded a new version of &amp;amp;quot;File:OrientationTop.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;orientation of a ship in max from the top&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=File:OrientationTop.png&amp;diff=439</id>
		<title>File:OrientationTop.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=File:OrientationTop.png&amp;diff=439"/>
		<updated>2013-01-02T14:19:57Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: orientation of a ship in max from the top&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;orientation of a ship in max from the top&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Model_system&amp;diff=430</id>
		<title>Model system</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Model_system&amp;diff=430"/>
		<updated>2012-12-24T01:49:55Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: /* 3DS Max */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
tl;dr: a simple scenegraph-based approach that has nothing to do with the old system or Lua, focus is on easy importing, supports some animation.&lt;br /&gt;
&lt;br /&gt;
== Importing models ==&lt;br /&gt;
&lt;br /&gt;
The import system theoretically supports [http://assimp.sourceforge.net/main_features_formats.html many different formats] but you are expected to use only some:&lt;br /&gt;
&lt;br /&gt;
* When node structure, node names and animations matter, use '''Collada (.dae)'''&lt;br /&gt;
* For static geometry, such as buildings, OBJ is recommended, this may allow for some optimizations&lt;br /&gt;
&lt;br /&gt;
The only officially tested 3D modelling program at the moment is [http://www.blender.org/ Blender 2.64]. For blender, a quick checklist is:&lt;br /&gt;
&lt;br /&gt;
* Coordinates: X right, Y forward, Z up&lt;br /&gt;
* Always generate UV coordinates for the model&lt;br /&gt;
&lt;br /&gt;
The [[Model viewer]] is supplied with the game.&lt;br /&gt;
&lt;br /&gt;
=== Model definition file ===&lt;br /&gt;
&lt;br /&gt;
Models must be placed under '''data/models'''&lt;br /&gt;
&lt;br /&gt;
To define a model, create a simple &amp;lt;code&amp;gt;name_here.model&amp;lt;/code&amp;gt; text file along with your exported meshes:&lt;br /&gt;
&lt;br /&gt;
 #Comments can be written like this&lt;br /&gt;
 #Define all used materials first&lt;br /&gt;
 Material some-material&lt;br /&gt;
 tex_diff some_texture.png&lt;br /&gt;
 diffuse 0.8 0.7 0.7&lt;br /&gt;
 &lt;br /&gt;
 #Meshes to be imported into this model, should be in the current folder&lt;br /&gt;
 #Mixing different formats should be OK&lt;br /&gt;
 mesh part1.obj&lt;br /&gt;
 mesh part2.obj&lt;br /&gt;
&lt;br /&gt;
== Materials ==&lt;br /&gt;
&lt;br /&gt;
Only material names are imported from 3D models, to set material properties use a small definition like this:&lt;br /&gt;
&lt;br /&gt;
 material CobraI_body&lt;br /&gt;
 tex_diff CobraI_diff.png&lt;br /&gt;
 tex_glow CobraI_emit.png&lt;br /&gt;
 tex_spec CobraI_spec.png&lt;br /&gt;
 diffuse 1.0 1.0 1.0&lt;br /&gt;
 specular 1.0 1.0 1.0&lt;br /&gt;
 shininess 150&lt;br /&gt;
&lt;br /&gt;
=== Material properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| material || Name. Mandatory! Note, some exporters modify the names from what is visible in the modeling program, for example the Blender 2.6 Collada exporter adds &amp;quot;-material&amp;quot; to each name. You'll have to use this final name.&lt;br /&gt;
|-&lt;br /&gt;
| diffuse|| Diffuse colour RGB. Default white.&lt;br /&gt;
|-&lt;br /&gt;
| specular|| Colour of specular highlights, RGB. Default white. Set to black to disable highlights.&lt;br /&gt;
|-&lt;br /&gt;
| emissive|| Self-illumination colour, RGB. Default black.&lt;br /&gt;
|-&lt;br /&gt;
| shininess|| Sharpness/size of specular highlights, 0 - 200. Default 200.&lt;br /&gt;
|-&lt;br /&gt;
| opacity|| 0-100, controls transparency of the material. A node with a material opacity less than 100 is treated as transparent, otherwise opaque.&lt;br /&gt;
|-&lt;br /&gt;
| tex_diff || Diffuse texture, file name (in the same folder). If you don't specify this, a white dummy texture is generated.&lt;br /&gt;
|-&lt;br /&gt;
| tex_glow||Self-illumination texture, overrides emissive colour parameter. Default none.&lt;br /&gt;
|-&lt;br /&gt;
| tex_spec||Specular highlight colour/intensity texture. Default none. Multiplied by specular colour parameter, so set it to white to leave control entirely to the texture.&lt;br /&gt;
|-&lt;br /&gt;
| use_patterns||yes/no. This material will use the pattern/colour system. Read more below. Default no.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_specularmap.png]]&lt;br /&gt;
Flat specular lighting improved by a specular map&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_glowmap.png]]&lt;br /&gt;
A model lit only by the self-illumination texture&lt;br /&gt;
&lt;br /&gt;
=== Patterns ===&lt;br /&gt;
&lt;br /&gt;
A system to mark customizable color areas on a model without splitting it to separate materials.&lt;br /&gt;
&lt;br /&gt;
Patterns are small grayscale textures placed in the model folder, named pattern*.png. Using gray or white colour you can mark the areas tinted by one of the customizable colours (black marks unaffected areas). The colours are set by the game (faction-specific ship colours, shipyard UI for the player).&lt;br /&gt;
&lt;br /&gt;
The system has several limitations: it is not meant to do fine details, transitioning from one color to another is sharp and it works best with white/light textures. You'll have to experiment.&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_patterns_asp.png]]&lt;br /&gt;
&lt;br /&gt;
== Detail levels ==&lt;br /&gt;
&lt;br /&gt;
Meshes can be grouped into detail levels using the &amp;lt;code&amp;gt;lod pixelsize&amp;lt;/code&amp;gt; directive:&lt;br /&gt;
&lt;br /&gt;
 lod 100&lt;br /&gt;
 mesh hull_low.dae&lt;br /&gt;
 &lt;br /&gt;
 lod 200&lt;br /&gt;
 mesh hull_med.dae&lt;br /&gt;
 &lt;br /&gt;
 lod 1000&lt;br /&gt;
 mesh hull_hi.dae&lt;br /&gt;
 mesh landing_gear.dae&lt;br /&gt;
&lt;br /&gt;
A detail level will be picked if the approximate size of the model on screen is less than &amp;lt;code&amp;gt;pixelsize&amp;lt;/code&amp;gt; (for the highest level it does not matter as long as it's larger than the others). Use the modelviewer to find optimal sizes.&lt;br /&gt;
&lt;br /&gt;
You may specify any number of detail levels in any order, they will be sorted according to size.&lt;br /&gt;
&lt;br /&gt;
== Animations ==&lt;br /&gt;
&lt;br /&gt;
Position, rotation and scale keyframe animation is supported. Since the Blender 2.6 Collada exporter cannot export multiple animations in one file, you will have to put it all in one timeline and split it at the import stage (this is also the only reliable way to get named animations). An animation is defined after all the meshes in format &amp;lt;code&amp;gt;anim name startframe endframe&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 anim gear_down 0 10&lt;br /&gt;
 anim something_else 12 25&lt;br /&gt;
&lt;br /&gt;
Note, Collada uses seconds instead of frame numbers. For the conversion to work, you should create the animations at '''24FPS'''.&lt;br /&gt;
&lt;br /&gt;
The game will recognize animations by name, the list of supported animations is to be decided.&lt;br /&gt;
&lt;br /&gt;
There is no animation blending, so two animations shouldn't be directly controlling the same node.&lt;br /&gt;
&lt;br /&gt;
== Attachments ==&lt;br /&gt;
&lt;br /&gt;
Models may have special &amp;quot;tag point&amp;quot; nodes where other models may be attached. You may define a tag point in Blender by placing an Empty object and giving it one of the predefined names.&lt;br /&gt;
&lt;br /&gt;
The system is meant for attaching equipment: guns, cargo pods, turrets...&lt;br /&gt;
&lt;br /&gt;
Example: A generic gun model attached to a point &amp;quot;tag_gun_right&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_tagpoints01.png]]&lt;br /&gt;
&lt;br /&gt;
The actual list of available names has not been determined yet.&lt;br /&gt;
&lt;br /&gt;
== Collisions ==&lt;br /&gt;
&lt;br /&gt;
By default, the collision mesh of a model is the bounding box of all the meshes. For more control, you can import a custom mesh using the &amp;lt;code&amp;gt;collision&amp;lt;/code&amp;gt; directive in the model definition:&lt;br /&gt;
&lt;br /&gt;
 collision collision.obj&lt;br /&gt;
&lt;br /&gt;
This will be global for all detail levels.&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_collmesh01.png]]&lt;br /&gt;
&lt;br /&gt;
== Decals ==&lt;br /&gt;
&lt;br /&gt;
Decals are meant for customizable insignia on spaceships and changing advertisements on space stations. Up to four unique decals are available for a model (multiple identical decals are allowed). Place a piece of geometry, usually a flat quad, with proper UV coordinates and name it decal_01, 02, 03 or 04. The game will then use a special material on the geometry, or make it invisible if no decal is to be used.&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_decals01.png]]&lt;br /&gt;
&lt;br /&gt;
== Labels ==&lt;br /&gt;
&lt;br /&gt;
Dynamic 3D labels are meant for naming ships and space stations. Put an empty node in the model and give it a name beginning with &amp;quot;label&amp;quot;. The text is set by the game at runtime if supported.&lt;br /&gt;
&lt;br /&gt;
Node scale can be used as usual but the text is not constrained to the node bounds or anything like that, so some trial will be required.&lt;br /&gt;
&lt;br /&gt;
You can use multiple label nodes but they will all show the same text.&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_labels01.png]]&lt;br /&gt;
&lt;br /&gt;
== Minor features ==&lt;br /&gt;
&lt;br /&gt;
=== Billboard lights ===&lt;br /&gt;
&lt;br /&gt;
Simple light sprites placed using empty nodes with special naming (navlight_*). Certain lights will blink when a ship's landing gear is down. This feature is not complete as it needs more support in the game.&lt;br /&gt;
&lt;br /&gt;
=== Thrusters ===&lt;br /&gt;
&lt;br /&gt;
Thrusters are marked with dummy objects. In Blender, create an &amp;quot;Empty&amp;quot; object and point its Z-axis (change the object display type to &amp;quot;arrows&amp;quot; or &amp;quot;single arrow&amp;quot; to visualize this) where the thruster should point. Thruster size is taken from the object scale. Begin the object name with either &amp;lt;code&amp;gt;thruster&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;thruster_linear&amp;lt;/code&amp;gt; so the importer can recognize them (linear thrusters light up only when moving up/down/left/right/forward/backward, not when turning).&lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
&lt;br /&gt;
You can find some testcase models at git://github.com/Luomu/newmodels.git.&lt;br /&gt;
&lt;br /&gt;
The internal scene graph consists of several of these nodes:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Node|| Base class. A node can have a name and one or more parents.&lt;br /&gt;
|-&lt;br /&gt;
| Group|| A group is a Node that can have several children.&lt;br /&gt;
|-&lt;br /&gt;
| MatrixTransform|| A Group that applies a transformation to its child nodes when rendering.&lt;br /&gt;
|-&lt;br /&gt;
| StaticGeometry|| Contains one or more StaticMeshes.&lt;br /&gt;
|-&lt;br /&gt;
| LOD|| Detail level control node, picks one of the child nodes based on the approximate size of the model on screen.&lt;br /&gt;
|-&lt;br /&gt;
| ModelNode || Can be used to attach another Model as a submodel. Use case: dynamic equipment on ships.&lt;br /&gt;
|-&lt;br /&gt;
| More!||Some marginal nodes that exist at the moment are:&lt;br /&gt;
&lt;br /&gt;
* Thruster: spaceship thruster&lt;br /&gt;
* Billboard: can be used for light sprites (navlights on ships)&lt;br /&gt;
* Label3D: dynamic 2d text, meant for labeling ships&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
MatrixTransform nodes are the most commonly used, if a geometry is rotated or scaled it will be parented to a MatrixTransform. A simple form of instancing can be achieved by adding a geometry as the child of several separate MatrixTransforms.&lt;br /&gt;
&lt;br /&gt;
During rendering, the graph is traversed twice. Once for opaque objects, and once for transparent objects (which includes decals, thrusters). The model system does not perform any depth sorting, this improvement job needs to be done elsewhere.&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
An animation consists of Channels. Each channel controls one node (always a MatrixTransform) and has a list of position and rotation Keys. Each key has a time and value. Keys are always linearly interpolated.&lt;br /&gt;
&lt;br /&gt;
At first the animations had proper play/pause/loop functionality but right now it is not so. Animation progress (and fun things like serialization) needs to be controlled directly by whatever feature uses the animation (see: landing gear).&lt;br /&gt;
&lt;br /&gt;
=== Export settings ===&lt;br /&gt;
&lt;br /&gt;
Collada (.dae) export settings for Blender 2.6:&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_exportsettings01.png]]&lt;br /&gt;
&lt;br /&gt;
== 3DS Max ==&lt;br /&gt;
&lt;br /&gt;
in 3DS Max an empty node can be created using a point helper found in the helper objects section&lt;br /&gt;
&lt;br /&gt;
[[Category:Art]]&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Model_viewer&amp;diff=429</id>
		<title>Model viewer</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Model_viewer&amp;diff=429"/>
		<updated>2012-12-23T10:42:43Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To enter modelviewer mode, launch the game with:&lt;br /&gt;
&lt;br /&gt;
 pioneer -mv &amp;lt;optional model name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''OSX Only:'' Hold down the Option key while clicking on the pioneer.app icon to launch the model viewer instead of the game.&lt;br /&gt;
&lt;br /&gt;
In windows an easy way to open the model viewer is to create a shortcut to pioneer.exe then add '-mv shipname' to the end of the target in the shortcut properties (without the ' ), then you only have to run the shortcut to load the model viewer.&lt;br /&gt;
&lt;br /&gt;
= Hotkeys =&lt;br /&gt;
&lt;br /&gt;
Esc: Quit&lt;br /&gt;
&lt;br /&gt;
Tab: Toggle UI&lt;br /&gt;
&lt;br /&gt;
PrintScr: Screenshot&lt;br /&gt;
&lt;br /&gt;
Space: Reset camera view + thruster sliders&lt;br /&gt;
&lt;br /&gt;
G: Cycle grid mode&lt;br /&gt;
&lt;br /&gt;
R: Randomize colour sliders&lt;br /&gt;
&lt;br /&gt;
Z: Toggle wireframe mode&lt;br /&gt;
&lt;br /&gt;
Camera view presets are like Blender:&lt;br /&gt;
&lt;br /&gt;
* Numpad 1 - Front view&lt;br /&gt;
* Ctrl+Numpad - Rear view&lt;br /&gt;
* Numpad 3 - Right view&lt;br /&gt;
* Ctrl+Numpad 3 - Left view&lt;br /&gt;
* Numpad 7 - Top view&lt;br /&gt;
* Ctrl+Numpad 7 - Bottom view&lt;br /&gt;
* Numpad2/4/6/8: Rotate view&lt;br /&gt;
&lt;br /&gt;
[[Category:Art]]&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Model_system&amp;diff=428</id>
		<title>Model system</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Model_system&amp;diff=428"/>
		<updated>2012-12-21T23:43:28Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: small update with some 3DS Max info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
tl;dr: a simple scenegraph-based approach that has nothing to do with the old system or Lua, focus is on easy importing, supports some animation.&lt;br /&gt;
&lt;br /&gt;
== Importing models ==&lt;br /&gt;
&lt;br /&gt;
The import system theoretically supports [http://assimp.sourceforge.net/main_features_formats.html many different formats] but you are expected to use only some:&lt;br /&gt;
&lt;br /&gt;
* When node structure, node names and animations matter, use '''Collada (.dae)'''&lt;br /&gt;
* For static geometry, such as buildings, OBJ is recommended, this may allow for some optimizations&lt;br /&gt;
&lt;br /&gt;
The only officially tested 3D modelling program at the moment is [http://www.blender.org/ Blender 2.64]. For blender, a quick checklist is:&lt;br /&gt;
&lt;br /&gt;
* Coordinates: X right, Y forward, Z up&lt;br /&gt;
* Always generate UV coordinates for the model&lt;br /&gt;
&lt;br /&gt;
The [[Model viewer]] is supplied with the game.&lt;br /&gt;
&lt;br /&gt;
=== Model definition file ===&lt;br /&gt;
&lt;br /&gt;
Models must be placed under '''data/models'''&lt;br /&gt;
&lt;br /&gt;
To define a model, create a simple &amp;lt;code&amp;gt;name_here.model&amp;lt;/code&amp;gt; text file along with your exported meshes:&lt;br /&gt;
&lt;br /&gt;
 #Comments can be written like this&lt;br /&gt;
 #Define all used materials first&lt;br /&gt;
 Material some-material&lt;br /&gt;
 tex_diff some_texture.png&lt;br /&gt;
 diffuse 0.8 0.7 0.7&lt;br /&gt;
 &lt;br /&gt;
 #Meshes to be imported into this model, should be in the current folder&lt;br /&gt;
 #Mixing different formats should be OK&lt;br /&gt;
 mesh part1.obj&lt;br /&gt;
 mesh part2.obj&lt;br /&gt;
&lt;br /&gt;
== Materials ==&lt;br /&gt;
&lt;br /&gt;
Only material names are imported from 3D models, to set material properties use a small definition like this:&lt;br /&gt;
&lt;br /&gt;
 material CobraI_body&lt;br /&gt;
 tex_diff CobraI_diff.png&lt;br /&gt;
 tex_glow CobraI_emit.png&lt;br /&gt;
 tex_spec CobraI_spec.png&lt;br /&gt;
 diffuse 1.0 1.0 1.0&lt;br /&gt;
 specular 1.0 1.0 1.0&lt;br /&gt;
 shininess 150&lt;br /&gt;
&lt;br /&gt;
=== Material properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| material || Name. Mandatory! Note, some exporters modify the names from what is visible in the modeling program, for example the Blender 2.6 Collada exporter adds &amp;quot;-material&amp;quot; to each name. You'll have to use this final name.&lt;br /&gt;
|-&lt;br /&gt;
| diffuse|| Diffuse colour RGB. Default white.&lt;br /&gt;
|-&lt;br /&gt;
| specular|| Colour of specular highlights, RGB. Default white. Set to black to disable highlights.&lt;br /&gt;
|-&lt;br /&gt;
| emissive|| Self-illumination colour, RGB. Default black.&lt;br /&gt;
|-&lt;br /&gt;
| shininess|| Sharpness/size of specular highlights, 0 - 200. Default 200.&lt;br /&gt;
|-&lt;br /&gt;
| opacity|| 0-100, controls transparency of the material. A node with a material opacity less than 100 is treated as transparent, otherwise opaque.&lt;br /&gt;
|-&lt;br /&gt;
| tex_diff || Diffuse texture, file name (in the same folder). If you don't specify this, a white dummy texture is generated.&lt;br /&gt;
|-&lt;br /&gt;
| tex_glow||Self-illumination texture, overrides emissive colour parameter. Default none.&lt;br /&gt;
|-&lt;br /&gt;
| tex_spec||Specular highlight colour/intensity texture. Default none. Multiplied by specular colour parameter, so set it to white to leave control entirely to the texture.&lt;br /&gt;
|-&lt;br /&gt;
| use_patterns||yes/no. This material will use the pattern/colour system. Read more below. Default no.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_specularmap.png]]&lt;br /&gt;
Flat specular lighting improved by a specular map&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_glowmap.png]]&lt;br /&gt;
A model lit only by the self-illumination texture&lt;br /&gt;
&lt;br /&gt;
=== Patterns ===&lt;br /&gt;
&lt;br /&gt;
A system to mark customizable color areas on a model without splitting it to separate materials.&lt;br /&gt;
&lt;br /&gt;
Patterns are small grayscale textures placed in the model folder, named pattern*.png. Using gray or white colour you can mark the areas tinted by one of the customizable colours (black marks unaffected areas). The colours are set by the game (faction-specific ship colours, shipyard UI for the player).&lt;br /&gt;
&lt;br /&gt;
The system has several limitations: it is not meant to do fine details, transitioning from one color to another is sharp and it works best with white/light textures. You'll have to experiment.&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_patterns_asp.png]]&lt;br /&gt;
&lt;br /&gt;
== Detail levels ==&lt;br /&gt;
&lt;br /&gt;
Meshes can be grouped into detail levels using the &amp;lt;code&amp;gt;lod pixelsize&amp;lt;/code&amp;gt; directive:&lt;br /&gt;
&lt;br /&gt;
 lod 100&lt;br /&gt;
 mesh hull_low.dae&lt;br /&gt;
 &lt;br /&gt;
 lod 200&lt;br /&gt;
 mesh hull_med.dae&lt;br /&gt;
 &lt;br /&gt;
 lod 1000&lt;br /&gt;
 mesh hull_hi.dae&lt;br /&gt;
 mesh landing_gear.dae&lt;br /&gt;
&lt;br /&gt;
A detail level will be picked if the approximate size of the model on screen is less than &amp;lt;code&amp;gt;pixelsize&amp;lt;/code&amp;gt; (for the highest level it does not matter as long as it's larger than the others). Use the modelviewer to find optimal sizes.&lt;br /&gt;
&lt;br /&gt;
You may specify any number of detail levels in any order, they will be sorted according to size.&lt;br /&gt;
&lt;br /&gt;
== Animations ==&lt;br /&gt;
&lt;br /&gt;
Position, rotation and scale keyframe animation is supported. Since the Blender 2.6 Collada exporter cannot export multiple animations in one file, you will have to put it all in one timeline and split it at the import stage (this is also the only reliable way to get named animations). An animation is defined after all the meshes in format &amp;lt;code&amp;gt;anim name startframe endframe&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 anim gear_down 0 10&lt;br /&gt;
 anim something_else 12 25&lt;br /&gt;
&lt;br /&gt;
Note, Collada uses seconds instead of frame numbers. For the conversion to work, you should create the animations at '''24FPS'''.&lt;br /&gt;
&lt;br /&gt;
The game will recognize animations by name, the list of supported animations is to be decided.&lt;br /&gt;
&lt;br /&gt;
There is no animation blending, so two animations shouldn't be directly controlling the same node.&lt;br /&gt;
&lt;br /&gt;
== Attachments ==&lt;br /&gt;
&lt;br /&gt;
Models may have special &amp;quot;tag point&amp;quot; nodes where other models may be attached. You may define a tag point in Blender by placing an Empty object and giving it one of the predefined names.&lt;br /&gt;
&lt;br /&gt;
The system is meant for attaching equipment: guns, cargo pods, turrets...&lt;br /&gt;
&lt;br /&gt;
Example: A generic gun model attached to a point &amp;quot;tag_gun_right&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_tagpoints01.png]]&lt;br /&gt;
&lt;br /&gt;
The actual list of available names has not been determined yet.&lt;br /&gt;
&lt;br /&gt;
== Collisions ==&lt;br /&gt;
&lt;br /&gt;
By default, the collision mesh of a model is the bounding box of all the meshes. For more control, you can import a custom mesh using the &amp;lt;code&amp;gt;collision&amp;lt;/code&amp;gt; directive in the model definition:&lt;br /&gt;
&lt;br /&gt;
 collision collision.obj&lt;br /&gt;
&lt;br /&gt;
This will be global for all detail levels.&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_collmesh01.png]]&lt;br /&gt;
&lt;br /&gt;
== Decals ==&lt;br /&gt;
&lt;br /&gt;
Decals are meant for customizable insignia on spaceships and changing advertisements on space stations. Up to four unique decals are available for a model (multiple identical decals are allowed). Place a piece of geometry, usually a flat quad, with proper UV coordinates and name it decal_01, 02, 03 or 04. The game will then use a special material on the geometry, or make it invisible if no decal is to be used.&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_decals01.png]]&lt;br /&gt;
&lt;br /&gt;
== Labels ==&lt;br /&gt;
&lt;br /&gt;
Dynamic 3D labels are meant for naming ships and space stations. Put an empty node in the model and give it a name beginning with &amp;quot;label&amp;quot;. The text is set by the game at runtime if supported.&lt;br /&gt;
&lt;br /&gt;
Node scale can be used as usual but the text is not constrained to the node bounds or anything like that, so some trial will be required.&lt;br /&gt;
&lt;br /&gt;
You can use multiple label nodes but they will all show the same text.&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_labels01.png]]&lt;br /&gt;
&lt;br /&gt;
== Minor features ==&lt;br /&gt;
&lt;br /&gt;
=== Billboard lights ===&lt;br /&gt;
&lt;br /&gt;
Simple light sprites placed using empty nodes with special naming (navlight_*). Certain lights will blink when a ship's landing gear is down. This feature is not complete as it needs more support in the game.&lt;br /&gt;
&lt;br /&gt;
=== Thrusters ===&lt;br /&gt;
&lt;br /&gt;
Thrusters are marked with dummy objects. In Blender, create an &amp;quot;Empty&amp;quot; object and point its Z-axis (change the object display type to &amp;quot;arrows&amp;quot; or &amp;quot;single arrow&amp;quot; to visualize this) where the thruster should point. Thruster size is taken from the object scale. Begin the object name with either &amp;lt;code&amp;gt;thruster&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;thruster_linear&amp;lt;/code&amp;gt; so the importer can recognize them (linear thrusters light up only when moving up/down/left/right/forward/backward, not when turning).&lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
&lt;br /&gt;
You can find some testcase models at git://github.com/Luomu/newmodels.git.&lt;br /&gt;
&lt;br /&gt;
The internal scene graph consists of several of these nodes:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Node|| Base class. A node can have a name and one or more parents.&lt;br /&gt;
|-&lt;br /&gt;
| Group|| A group is a Node that can have several children.&lt;br /&gt;
|-&lt;br /&gt;
| MatrixTransform|| A Group that applies a transformation to its child nodes when rendering.&lt;br /&gt;
|-&lt;br /&gt;
| StaticGeometry|| Contains one or more StaticMeshes.&lt;br /&gt;
|-&lt;br /&gt;
| LOD|| Detail level control node, picks one of the child nodes based on the approximate size of the model on screen.&lt;br /&gt;
|-&lt;br /&gt;
| ModelNode || Can be used to attach another Model as a submodel. Use case: dynamic equipment on ships.&lt;br /&gt;
|-&lt;br /&gt;
| More!||Some marginal nodes that exist at the moment are:&lt;br /&gt;
&lt;br /&gt;
* Thruster: spaceship thruster&lt;br /&gt;
* Billboard: can be used for light sprites (navlights on ships)&lt;br /&gt;
* Label3D: dynamic 2d text, meant for labeling ships&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
MatrixTransform nodes are the most commonly used, if a geometry is rotated or scaled it will be parented to a MatrixTransform. A simple form of instancing can be achieved by adding a geometry as the child of several separate MatrixTransforms.&lt;br /&gt;
&lt;br /&gt;
During rendering, the graph is traversed twice. Once for opaque objects, and once for transparent objects (which includes decals, thrusters). The model system does not perform any depth sorting, this improvement job needs to be done elsewhere.&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
An animation consists of Channels. Each channel controls one node (always a MatrixTransform) and has a list of position and rotation Keys. Each key has a time and value. Keys are always linearly interpolated.&lt;br /&gt;
&lt;br /&gt;
At first the animations had proper play/pause/loop functionality but right now it is not so. Animation progress (and fun things like serialization) needs to be controlled directly by whatever feature uses the animation (see: landing gear).&lt;br /&gt;
&lt;br /&gt;
=== Export settings ===&lt;br /&gt;
&lt;br /&gt;
Collada (.dae) export settings for Blender 2.6:&lt;br /&gt;
&lt;br /&gt;
[[File:newmodel_exportsettings01.png]]&lt;br /&gt;
&lt;br /&gt;
== 3DS Max ==&lt;br /&gt;
&lt;br /&gt;
in 3DS Max an empty node can be created using a dummy object found in the helper objects section&lt;br /&gt;
&lt;br /&gt;
[[Category:Art]]&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Interacting_with_the_player:_BBS_forms&amp;diff=352</id>
		<title>Interacting with the player: BBS forms</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Interacting_with_the_player:_BBS_forms&amp;diff=352"/>
		<updated>2012-11-18T18:44:36Z</updated>

		<summary type="html">&lt;p&gt;ImTheFish: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The bulletin board system is currently the only place where real dialogue between a script and the player can take place. Bulletin boards can exist within any &amp;lt;code&amp;gt;SpaceStation&amp;lt;/code&amp;gt; in the current system. They are created in a station the first time that a ship is either spawned, or lands, in that station. They continue to exist until the player leaves the system or quits the game. They are not saved in saved games, although a saved game contains information about which ones did exist.&lt;br /&gt;
&lt;br /&gt;
When a bulletin board is created, the &amp;lt;code&amp;gt;onCreateBB&amp;lt;/code&amp;gt; event is triggered, and passes the &amp;lt;code&amp;gt;SpaceStation&amp;lt;/code&amp;gt; body in which that bulletin board was created. There is an exception to this: The event is not triggered after loading a game for those bulletin boards which, having existed at the time of saving, are re-created. The consequences of this will be covered later (see &amp;quot;[[Surviving a reload]]&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
There are two components to any mission's entry on a bulletin board: The advert and the form. The advert is the part that is displayed on the main bulletin board list, along with all the other entries. The form is the part that appears on screen when the player clicks the advert's button.&lt;br /&gt;
&lt;br /&gt;
==Internationalization==&lt;br /&gt;
&lt;br /&gt;
It is important that scripters are familiar with the Translations library (scroll down to &amp;quot;Lua module translation&amp;quot;). A list of &amp;lt;code&amp;gt;Translate:Add()&amp;lt;/code&amp;gt; calls are usually placed in a file named &amp;lt;code&amp;gt;Languages.lua&amp;lt;/code&amp;gt; and kept in the same subdirectory as the script that needs them.&lt;br /&gt;
&lt;br /&gt;
This is by convention only; all translations, regardless of filename, are available to all scripts, and it would technically be perfectly possible to recycle the translated strings provided by another script. In order to keep the workload as simple as possible for translators, however, we do prefer the convention to be followed.&lt;br /&gt;
&lt;br /&gt;
The script itself makes use of translated strings by getting the translator function and using it to translate strings by token. So, if the &amp;lt;code&amp;gt;Languages.lua&amp;lt;/code&amp;gt; file contained this:&lt;br /&gt;
&lt;br /&gt;
 Translate:Add({&lt;br /&gt;
     English = {&lt;br /&gt;
         ['Please, help me!'] = 'Please, help me!',&lt;br /&gt;
     },&lt;br /&gt;
     Deutsch = {&lt;br /&gt;
         ['Please, help me!'] = 'Bitte, hilf mir!',&lt;br /&gt;
     },&lt;br /&gt;
 })&lt;br /&gt;
&lt;br /&gt;
then in the main script, you would first get the translator function:&lt;br /&gt;
&lt;br /&gt;
 local t = Translate:GetTranslator()&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; could be any other convenient name, in the event that you already have a variable named &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;. Once you have your translator, you can simply use it to translate by giving it the key:&lt;br /&gt;
&lt;br /&gt;
 Comms.ImportantMessage(t('Please, help me!'))&lt;br /&gt;
&lt;br /&gt;
This would put &amp;quot;''Please, help me!''&amp;quot; on the screens of English players, and &amp;quot;''Bitter, hilf mir!''&amp;quot; on the screens of German players.&lt;br /&gt;
&lt;br /&gt;
The translator is fully documented in the codedoc. For the remainder of the document, I shall be using string literals. This is for clarity only; all custom scripts should be fully translatable if they are intended to be included with the game.&lt;br /&gt;
&lt;br /&gt;
==The BBS advert==&lt;br /&gt;
&lt;br /&gt;
Adverts are placed onto a BBS by calling the station's &amp;lt;code&amp;gt;AddAdvert()&amp;lt;/code&amp;gt; method, once the bulletin board has been created. Depending on the nature of your script, you might want to always place one advert on every station (as seen with the Breakdowns &amp;amp; Servicing script), or you might want to place an arbitrary number of adverts on a given station (as seen with deliveries, or assassinations).&lt;br /&gt;
&lt;br /&gt;
The opportunities to add an advert are presented by two events. &amp;lt;code&amp;gt;onCreateBB&amp;lt;/code&amp;gt; is the obvious one; there is also &amp;lt;code&amp;gt;onUpdateBB&amp;lt;/code&amp;gt;, which is called for all existing bulletin boards in the current system, approximately once every hour or two. The actual interval is not particularly predictable.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;AddAdvert()&amp;lt;/code&amp;gt; method takes three arguments. The first is the text that will appear on the advert. The second is the function that will be called when the player clicks the advert. The third is optional, and is a function that can be called when the advert is deleted for any reason.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;AddAdvert()&amp;lt;/code&amp;gt; returns a reference number, which can subsequently be used to remove the advert using &amp;lt;code&amp;gt;RemoveAdvert()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
It's the job of the scripter to decide how many, if any, adverts to add to a bulletin board when &amp;lt;code&amp;gt;onCreateBB&amp;lt;/code&amp;gt; is triggered, and whether to add or remove any when &amp;lt;code&amp;gt;onUpdateBB&amp;lt;/code&amp;gt; is triggered. Tests could include the population of the system, the type of starport or the type of planet. In the future, tests will be able to include the government type of the system.&lt;br /&gt;
&lt;br /&gt;
One important thing to bear in mind is that the script cannot query a bulletin boad to find out what adverts already exist. Each script must carefully track each advert that it has created if it is to have any control over how long they remain, and to be able to re-create them after a reload.&lt;br /&gt;
&lt;br /&gt;
Here is an example of adding an advert. The effect of clicking the advert is simply to send a message to the player console with the name of the station. The advert is only added if the station is in space. There is no mission here; I am simply illustrating the mechanics of adding the advert.&lt;br /&gt;
&lt;br /&gt;
 local onCreateBB = function (station)&lt;br /&gt;
 &lt;br /&gt;
     -- This function can be in any scope that's visible when AddAdvert() is called&lt;br /&gt;
     local sendStationName = function ()&lt;br /&gt;
         Comms.ImportantMessage(station.label)&lt;br /&gt;
     end&lt;br /&gt;
  &lt;br /&gt;
     if station.type == 'STARPORT_ORBITAL' then&lt;br /&gt;
         station:AddAdvert('Need the name of this station?',sendStationName)&lt;br /&gt;
     end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 Event.Register(&amp;quot;onCreateBB&amp;quot;, onCreateBB)&lt;br /&gt;
&lt;br /&gt;
This code will create an advert:&lt;br /&gt;
&lt;br /&gt;
[[File:interact.bbsad.1.png]]&lt;br /&gt;
&lt;br /&gt;
Looking at the image, you will notice that my advert has appeared at a completely arbitrary location on the bulletin board. There is no way to specify the location, and no way to determine it.&lt;br /&gt;
&lt;br /&gt;
Clicking on the advert causes this to happen:&lt;br /&gt;
&lt;br /&gt;
[[File:interact.bbsad.2.png]]&lt;br /&gt;
&lt;br /&gt;
Even though the only thing our function did was to send a message to the console (visible at the bottom), you can see that Pioneer automatically created a form for our advert. The only control is the &amp;quot;Go back&amp;quot; button, and the name and face are defaulted to that which was displayed on the main bulletin board.&lt;br /&gt;
&lt;br /&gt;
==The BBS form==&lt;br /&gt;
&lt;br /&gt;
Once the player has clicked on an advert, they are presented with a form. Each advert has only one form. The content of the form is added by the script, and can be modified at any time. It consists of a title, a face, a message and zero or more clickable options.&lt;br /&gt;
&lt;br /&gt;
The form itself is passed to the function specified in the &amp;lt;code&amp;gt;SpaceStation.AddAdvert()&amp;lt;/code&amp;gt; method. In the example above, that function would be &amp;lt;code&amp;gt;sendStationName()&amp;lt;/code&amp;gt;, which simply ignored any parameters sent to it. This resulted in the form being blank.&lt;br /&gt;
&lt;br /&gt;
The form object which is passed to this function has methods for adding the content. &amp;lt;code&amp;gt;SetTitle()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SetMessage()&amp;lt;/code&amp;gt; each accept a string. &amp;lt;code&amp;gt;SetFace()&amp;lt;/code&amp;gt; takes a table of information which defines the photofit face on the left. &amp;lt;code&amp;gt;AddOption()&amp;lt;/code&amp;gt; adds clickable options with buttons. &amp;lt;code&amp;gt;Clear()&amp;lt;/code&amp;gt; removes the Message and Options, but preserves the Title and Face, while &amp;lt;code&amp;gt;Close()&amp;lt;/code&amp;gt; acts the same way as the &amp;quot;Go back&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
The following example doesn't have any clickable options, but does have a customized form:&lt;br /&gt;
&lt;br /&gt;
 local populateForm = function (form)&lt;br /&gt;
     local facedata = {&lt;br /&gt;
         name = &amp;quot;Bob&amp;quot;,&lt;br /&gt;
         female = true,&lt;br /&gt;
         title = &amp;quot;Lorry driver&amp;quot;,&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     form:SetTitle('This appears above the face picture')&lt;br /&gt;
     form:SetFace(facedata)&lt;br /&gt;
     form:SetMessage([[This is the main message.&lt;br /&gt;
 &lt;br /&gt;
 It is normally a multi-line string.]])&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 local onCreateBB = function (station)&lt;br /&gt;
     station:AddAdvert('This appears in the advert list',populateForm)&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 Event.Register(&amp;quot;onCreateBB&amp;quot;, onCreateBB)&lt;br /&gt;
&lt;br /&gt;
As before, an advert was created:&lt;br /&gt;
&lt;br /&gt;
[[File:interact.bbsad.3.png]]&lt;br /&gt;
&lt;br /&gt;
Randomly, it has appeared at the top of the list.&lt;br /&gt;
&lt;br /&gt;
Clicking on the advert causes this to happen:&lt;br /&gt;
&lt;br /&gt;
[[File:interact.bbsad.4.png]]&lt;br /&gt;
&lt;br /&gt;
Now we can see that &amp;lt;code&amp;gt;populateForm&amp;lt;/code&amp;gt; was called, and it successfully filled the form with content. All of the face options were optional; if they aren't provided, Pioneer will choose random values. I have left out a couple of options here; it's wise to specify them all, because after a saved game is loaded, it's the script's job to make sure that the same face appears (see &amp;quot;[[Surviving a reload]]&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Adding options to the form==&lt;br /&gt;
&lt;br /&gt;
In the example above, I created a function named &amp;lt;code&amp;gt;populateForm()&amp;lt;/code&amp;gt; which was run when the advert button was clicked. That's not the only time it can be run; it is also run whenever options on its form are clicked.&lt;br /&gt;
&lt;br /&gt;
To make use of this, it is passed two additional parameters, both of which &amp;lt;code&amp;gt;populateForm()&amp;lt;/code&amp;gt; ignored. The first parameter is the form object, the second is the advert's unique reference and the third is the number of the option that was clicked. Because it handles all chat events, by convention we instead name this function &amp;lt;code&amp;gt;onChat()&amp;lt;/code&amp;gt;, which is how it shall be named from now on.&lt;br /&gt;
&lt;br /&gt;
The previous example did not store or use the value returned by &amp;lt;code&amp;gt;AddAdvert()&amp;lt;/code&amp;gt;. It is this value which is sent as the second parameter; very useful if your script adds several adverts, each of which might have slightly differently worded content.&lt;br /&gt;
&lt;br /&gt;
When the advert was clicked in the main bulletin board list, it was passed the value &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; as the option.&lt;br /&gt;
&lt;br /&gt;
Form options are declared like this:&lt;br /&gt;
&lt;br /&gt;
   form:AddOption('I am option one',1)&lt;br /&gt;
   form:AddOption('I am option two',2)&lt;br /&gt;
&lt;br /&gt;
These options will appear with the specified caption, and will call &amp;lt;code&amp;gt;onChat()&amp;lt;/code&amp;gt;, which will receive the form object, the advert reference and the number that was specified after the caption in &amp;lt;code&amp;gt;AddOption()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The codedoc has a brilliant example of a complete onChat, which I will reproduce here:&lt;br /&gt;
&lt;br /&gt;
 local onChat = function (form, ref, option)&lt;br /&gt;
     form:Clear()&lt;br /&gt;
 &lt;br /&gt;
     -- option 0 is called when the form is first activated from the&lt;br /&gt;
     -- bulletin board&lt;br /&gt;
     if option == 0 then&lt;br /&gt;
 &lt;br /&gt;
         form:SetTitle(&amp;quot;Favourite colour&amp;quot;)&lt;br /&gt;
         form:SetMessage(&amp;quot;What's your favourite colour?&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
         form:AddOption(&amp;quot;Red&amp;quot;,       1)&lt;br /&gt;
         form:AddOption(&amp;quot;Green&amp;quot;,     2)&lt;br /&gt;
         form:AddOption(&amp;quot;Yellow&amp;quot;,    3)&lt;br /&gt;
         form:AddOption(&amp;quot;Blue&amp;quot;,      4)&lt;br /&gt;
         form:AddOption(&amp;quot;Hang up.&amp;quot;, -1)&lt;br /&gt;
 &lt;br /&gt;
         return&lt;br /&gt;
     end&lt;br /&gt;
 &lt;br /&gt;
     -- option 1 - red&lt;br /&gt;
     if option == 1 then&lt;br /&gt;
         form:SetMessage(&amp;quot;Ahh red, the colour of raspberries.&amp;quot;)&lt;br /&gt;
         form:AddOption(&amp;quot;Hang up.&amp;quot;, -1)&lt;br /&gt;
         return&lt;br /&gt;
     end&lt;br /&gt;
 &lt;br /&gt;
     -- option 2 - green&lt;br /&gt;
     if option == 2 then&lt;br /&gt;
         form:SetMessage(&amp;quot;Ahh green, the colour of trees.&amp;quot;)&lt;br /&gt;
         form:AddOption(&amp;quot;Hang up.&amp;quot;, -1)&lt;br /&gt;
         return&lt;br /&gt;
     end&lt;br /&gt;
 &lt;br /&gt;
     -- option 3 - yellow&lt;br /&gt;
     if option == 3 then&lt;br /&gt;
         form:SetMessage(&amp;quot;Ahh yellow, the colour of the sun.&amp;quot;)&lt;br /&gt;
         form:AddOption(&amp;quot;Hang up.&amp;quot;, -1)&lt;br /&gt;
         return&lt;br /&gt;
     end&lt;br /&gt;
 &lt;br /&gt;
     -- option 4 - blue&lt;br /&gt;
     if option == 4 then&lt;br /&gt;
         form:SetMessage(&amp;quot;Ahh blue, the colour of the ocean.&amp;quot;)&lt;br /&gt;
         form:AddOption(&amp;quot;Hang up.&amp;quot;, -1)&lt;br /&gt;
         return&lt;br /&gt;
     end&lt;br /&gt;
 &lt;br /&gt;
     -- only option left is -1, hang up&lt;br /&gt;
     form:Close()&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Here, every time &amp;lt;code&amp;gt;onChat()&amp;lt;/code&amp;gt; is called, regardless of the specified option, the form is cleared. The option is checked, and the relevant content is added to the form. Any other functions can be called from here, and this is how the script gets input from the player.&lt;br /&gt;
&lt;br /&gt;
An alternative format might be this:&lt;br /&gt;
&lt;br /&gt;
 local onChat = function (form, ref, option)&lt;br /&gt;
     form:Clear()&lt;br /&gt;
 &lt;br /&gt;
     local options = {&lt;br /&gt;
         [0] = function ()&lt;br /&gt;
             form:SetTitle(&amp;quot;Favourite colour&amp;quot;)&lt;br /&gt;
             form:SetMessage(&amp;quot;What's your favourite colour?&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
             form:AddOption(&amp;quot;Red&amp;quot;,       1)&lt;br /&gt;
             form:AddOption(&amp;quot;Green&amp;quot;,     2)&lt;br /&gt;
             form:AddOption(&amp;quot;Yellow&amp;quot;,    3)&lt;br /&gt;
             form:AddOption(&amp;quot;Blue&amp;quot;,      4)&lt;br /&gt;
             form:AddOption(&amp;quot;Hang up.&amp;quot;, -1)&lt;br /&gt;
         end,&lt;br /&gt;
         [1] = function ()&lt;br /&gt;
             form:SetMessage(&amp;quot;Ahh red, the colour of raspberries.&amp;quot;)&lt;br /&gt;
             form:AddOption(&amp;quot;Hang up.&amp;quot;, -1)&lt;br /&gt;
         end,&lt;br /&gt;
         [2] = function ()&lt;br /&gt;
             form:SetMessage(&amp;quot;Ahh green, the colour of trees.&amp;quot;)&lt;br /&gt;
             form:AddOption(&amp;quot;Hang up.&amp;quot;, -1)&lt;br /&gt;
         end,&lt;br /&gt;
         [3] = function ()&lt;br /&gt;
             form:SetMessage(&amp;quot;Ahh yellow, the colour of the sun.&amp;quot;)&lt;br /&gt;
             form:AddOption(&amp;quot;Hang up.&amp;quot;, -1)&lt;br /&gt;
         end,&lt;br /&gt;
         [4] = function ()&lt;br /&gt;
             form:SetMessage(&amp;quot;Ahh blue, the colour of the ocean.&amp;quot;)&lt;br /&gt;
             form:AddOption(&amp;quot;Hang up.&amp;quot;, -1)&lt;br /&gt;
         end,&lt;br /&gt;
         [-1] = function ()&lt;br /&gt;
             form:Close()&lt;br /&gt;
         end&lt;br /&gt;
     }&lt;br /&gt;
     options[option]()&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
==The player's mission list==&lt;br /&gt;
&lt;br /&gt;
Once the player has negotiated with your form, there might well be a mission in play. It could be a delivery, an assassination, a rush to tell somebody not to leave because so-and-so loves them... the possibilities are limited only by your creativity.&lt;br /&gt;
&lt;br /&gt;
The player needs a way to keep track of all the missions that they have agreed to undertake. Pioneer provides this through the player's mission screen, which they can access at any time using the F3 button, and looking at the missions tab.&lt;br /&gt;
&lt;br /&gt;
The content of this screen is controlled by some methods on the &amp;lt;code&amp;gt;Player&amp;lt;/code&amp;gt; object, which can always be found at &amp;lt;code&amp;gt;Game.player&amp;lt;/code&amp;gt;, and which inherits from &amp;lt;code&amp;gt;Ship&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Body&amp;lt;/code&amp;gt;. Missions are added to the screen using the &amp;lt;code&amp;gt;AddMission()&amp;lt;/code&amp;gt; method. It takes a table of info, and returns an integer reference to that mission, which should be stored so that it can be updated or removed later. So, it usually looks a little like &amp;lt;code&amp;gt;ref = Game.player:AddMission(table_of_info)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In practice, it might look more like this:&lt;br /&gt;
&lt;br /&gt;
 local mission_storage={}&lt;br /&gt;
 &lt;br /&gt;
 table.insert(mission_storage,Game.player:AddMission({&lt;br /&gt;
     type = &amp;quot;Fetch beer&amp;quot;,&lt;br /&gt;
     client = &amp;quot;Bert Beerbreath&amp;quot;,&lt;br /&gt;
     due = Game.time + 600, -- ten minutes' time&lt;br /&gt;
     reward = 10,&lt;br /&gt;
     location = Game.player.frameBody.path, -- here, basically&lt;br /&gt;
     status = 'ACTIVE'&lt;br /&gt;
 }))&lt;br /&gt;
 &lt;br /&gt;
 table.insert(mission_storage,Game.player:AddMission({&lt;br /&gt;
     type = &amp;quot;Fetch curry&amp;quot;,&lt;br /&gt;
     client = &amp;quot;Curt Curryface&amp;quot;,&lt;br /&gt;
     due = Game.time + 900, -- fifteen minutes' time&lt;br /&gt;
     reward = 5,&lt;br /&gt;
     location = Game.player.frameBody.path,&lt;br /&gt;
     status = 'ACTIVE'&lt;br /&gt;
 }))&lt;br /&gt;
&lt;br /&gt;
I don't recommend using &amp;lt;code&amp;gt;Game.player.frameBody.path&amp;lt;/code&amp;gt; here. I'm only using it because it always returns something, whether docked or not. A real mission would probably use a space station here.&lt;br /&gt;
&lt;br /&gt;
This creates visible missions on the mission screen:&lt;br /&gt;
&lt;br /&gt;
[[File:interact.misscrn.1.png]]&lt;br /&gt;
&lt;br /&gt;
These missions will remain exactly like that forever, unless a script explicitly makes changes. There is no automatic logic, and no automatic removal. Your script must keep track of them. In this example, I have the references in the &amp;lt;code&amp;gt;mission_storage&amp;lt;/code&amp;gt; table.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;UpdateMission()&amp;lt;/code&amp;gt; method allows a script to alter any detail. The status can be &amp;lt;code&amp;gt;'ACTIVE'&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;'FAILED'&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;'COMPLETED'&amp;lt;/code&amp;gt;. I'm going to change the status of the first mission to &amp;lt;code&amp;gt;'COMPLETED'&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Game.player:UpdateMission(mission_storage[1],{status='COMPLETED'})&lt;br /&gt;
&lt;br /&gt;
The updated information can be a partial table. The unspecified members will remain unchanged:&lt;br /&gt;
&lt;br /&gt;
[[File:interact.misscrn.2.png]]&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;GetMission()&amp;lt;/code&amp;gt; method allows a script to read data from a mission, if the script has the reference. It returns a table with that information. Here, I'm going to add ten minutes to the deadline of the second mission:&lt;br /&gt;
&lt;br /&gt;
 local due_date = Game.player:GetMission(mission_storage[2]).due&lt;br /&gt;
 Game.player:UpdateMission(mission_storage[2],{due = due_date + 600})&lt;br /&gt;
&lt;br /&gt;
The result:&lt;br /&gt;
&lt;br /&gt;
[[File:interact.misscrn.3.png]]&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;RemoveMission()&amp;lt;/code&amp;gt; method allows a script to remove a mission. Here I remove the completed one:&lt;br /&gt;
&lt;br /&gt;
 Game.player:RemoveMission(mission_storage[1])&lt;br /&gt;
 table.remove(mission_storage,1)&lt;br /&gt;
&lt;br /&gt;
And here it isn't:&lt;br /&gt;
&lt;br /&gt;
[[File:interact.misscrn.4.png]]&lt;br /&gt;
&lt;br /&gt;
==Mission flavours==&lt;br /&gt;
&lt;br /&gt;
A script can define a mission, and then place many instances of it onto many bulletin boards. A script that introduces many instances should provide some variety; it would harm immersion if all delivery missions were worded identically, for example.&lt;br /&gt;
&lt;br /&gt;
To introduce variety, we can use tables, which contain all of the lines needed for bulletin board forms, messages and so forth. It's then a simple matter to use a similar, but differently worded, table to make the same misison appear different. A flavour might look like this:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     title = &amp;quot;Shill bidder wanted for auction&amp;quot;,&lt;br /&gt;
     greeting = &amp;quot;Hi there. Want to earn some quick cash?&amp;quot;,&lt;br /&gt;
     yesplease = &amp;quot;Sure. What do you need me to do?&amp;quot;,&lt;br /&gt;
     nothanks = &amp;quot;No, ta - this looks a bit shady.&amp;quot;,&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
An alternative flavour might look like this:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
      title = &amp;quot;Help me win an auction.&amp;quot;,&lt;br /&gt;
      greeting = &amp;quot;Hello. I'll pay you to place fake bids for me. Interested?&amp;quot;,&lt;br /&gt;
      yesplease = &amp;quot;Yes, I like to live dangerously.&amp;quot;,&lt;br /&gt;
      nothanks = &amp;quot;No thanks; I'd rather not get arrested for fraud.&amp;quot;,&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Ideally, we just need a table with as many of these as we can be bothered to write, then select one at random.&lt;br /&gt;
&lt;br /&gt;
There are issues with translation, though. Because flavours are often full of colloquial language, and can feature several ways of saying basically the same thing, translating them all word-for-word is not necessarily productive. To this end, the Translate system features a pair of methods which can ease the handling of flavours, especially in different languages.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Translate:AddFlavour()&amp;lt;/code&amp;gt; method allows a flavour to be added, and marked as being of a specific language. By convention, these statements would appear in the script's &amp;lt;code&amp;gt;Languages.lua&amp;lt;/code&amp;gt; file so that translators could see them and be inspired to write some in other languages. The method takes three arguments. The first is the language of the flavour, as a string. The second is a name, so that the &amp;lt;code&amp;gt;Translate&amp;lt;/code&amp;gt; class can give flavours back to the correct script. The third is the flavour table itself. If my script was named &amp;lt;code&amp;gt;TestModule&amp;lt;/code&amp;gt;, I might define the two flavours above in my &amp;lt;code&amp;gt;Languages.lua&amp;lt;/code&amp;gt; as follows:&lt;br /&gt;
&lt;br /&gt;
 Translate:AddFlavour('English','TestModule',{&lt;br /&gt;
      title = &amp;quot;Shill bidder wanted for auction&amp;quot;,&lt;br /&gt;
      greeting = &amp;quot;Hi there. Want to earn some quick cash?&amp;quot;,&lt;br /&gt;
      yesplease = &amp;quot;Sure. What do you need me to do?&amp;quot;,&lt;br /&gt;
      nothanks = &amp;quot;No, ta - this looks a bit shady.&amp;quot;,&lt;br /&gt;
 })&lt;br /&gt;
 &lt;br /&gt;
 Translate:AddFlavour('English','TestModule',{&lt;br /&gt;
      title = &amp;quot;Help me win an auction.&amp;quot;,&lt;br /&gt;
      greeting = &amp;quot;Hello. I'll pay you to place fake bids for me. Interested?&amp;quot;,&lt;br /&gt;
      yesplease = &amp;quot;Yes, I like to live dangerously.&amp;quot;,&lt;br /&gt;
      nothanks = &amp;quot;No thanks; I'd rather not get arrested for fraud.&amp;quot;,&lt;br /&gt;
 })&lt;br /&gt;
&lt;br /&gt;
As an added benefit, &amp;lt;code&amp;gt;Translate:AddFlavour()&amp;lt;/code&amp;gt; checks all flavour tables for uniformity. It does this by comparing all of the table's keys with that of the first English flavour that was specified; a technical consequence of this is that an English flavour needs to come first in your &amp;lt;code&amp;gt;Languages.lua&amp;lt;/code&amp;gt; file, otherwise Pioneer will give you an error.&lt;br /&gt;
&lt;br /&gt;
To fetch the flavours into your script, use &amp;lt;code&amp;gt;Translate.GetFlavours()&amp;lt;/code&amp;gt;. It takes a single argument, which is the module name that was specified in &amp;lt;code&amp;gt;AddFlavour()&amp;lt;/code&amp;gt;'s second parameter. It doesn't matter to &amp;lt;code&amp;gt;Translate&amp;lt;/code&amp;gt; how many flavours there are in each language, or whether it's an equal number. If my current language is not English, and there are no flavours in that language, English flavours will be used instead. If there is only one flavour in my language, I will only see that one variety.&lt;br /&gt;
&lt;br /&gt;
The following example will select a random flavour from my flavour tables.&lt;br /&gt;
&lt;br /&gt;
 local all_flavours = Translate:GetFlavours('TestModule')&lt;br /&gt;
 local flavour = all_flavours[Engine.rand:Integer(1,#all_flavours)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;GetFlavours()&amp;lt;/code&amp;gt; returns a table of flavours. The second line of code generates a random number between 1 and the number of flavours in that table, and returns that flavour from the table. After this, &amp;lt;code&amp;gt;flavour.title&amp;lt;/code&amp;gt; will either be &amp;lt;code&amp;gt;&amp;quot;Shill bidder wanted for auction&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;Help me win an auction.&amp;quot;&amp;lt;/code&amp;gt;. Adding more flavours means more variety.&lt;br /&gt;
&lt;br /&gt;
==Maintaining immersion==&lt;br /&gt;
&lt;br /&gt;
Fictionally, of course, this bulletin board is visible to any and all ships that dock at the space station, not just the player. It is important that bulletin board missions are not all scaled to the capabilities of the player. Delivery missions with unreasonable deadlines should not be ruled out. Neither should cargo missions requiring much more cargo space than the player's ship has, or combat missions for which the player is completely unqualified.&lt;br /&gt;
&lt;br /&gt;
These missions should deal with the player gracefully; either allowing them to fail, and providing consequences, or preventing them from being given the mission.&lt;br /&gt;
&lt;br /&gt;
It's also important, if your script serves many instances of a mission, to periodically clear away bulletin board adverts and place new ones. Not just those with obvious time constraints, but any others; the assumption that the player should make is that perhaps some other character has taken these missions.&lt;/div&gt;</summary>
		<author><name>ImTheFish</name></author>
		
	</entry>
</feed>