<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://gamecamp.no/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Tutorials</title><link>http://gamecamp.no/blogs/tutorials/default.aspx</link><description /><dc:language /><generator>CommunityServer 2007 SP2 (Build: 20611.960)</generator><item><title>XNA Shader Programmering, Tutorial 5</title><link>http://gamecamp.no/blogs/tutorials/archive/2008/04/17/xna-shader-programmering-tutorial-5.aspx</link><pubDate>Thu, 17 Apr 2008 18:23:00 GMT</pubDate><guid isPermaLink="false">7ca9b034-3ad4-4aeb-9f95-4c8e81e4d749:438</guid><dc:creator>digitalerr0r</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://gamecamp.no/blogs/tutorials/rsscomments.aspx?PostID=438</wfw:commentRss><comments>http://gamecamp.no/blogs/tutorials/archive/2008/04/17/xna-shader-programmering-tutorial-5.aspx#comments</comments><description>&lt;p&gt;
&lt;h1&gt;XNA Shader Programming&lt;/h1&gt;
&lt;p&gt;Welcome back to the XNA Shader Programming series. Since the start of tutorial 1, we have been looking at different lighting algorithms. Todays tutorial will be quite short and different,&amp;nbsp;compared to those others, a pure vertex shader effect for deforming objects.&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Before we start&lt;/h3&gt;
&lt;p&gt;In this tutorial, you will need some basic knowledge of shaderprogramming, a understanding of geometry, vector math and matrix math. Also, the project is for XNA 2.0 and Visual Studio 2005.&lt;/p&gt;
&lt;p&gt;Sourcecode: &lt;a class="" title="de_ShaderTutorial_5.zip" href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNAShaderProgramming/Tutorial%205/de_ShaderTutorial_5.zip" target="_blank"&gt;de_shader_tutorial_5.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Deforming objects&lt;/h2&gt;
&lt;p&gt;Since vertex shaders can be used to process and transform vertices on a per vertex basis, it&amp;#39;s quite ideal to use them to deform objects/meshes. Vertex shaders make it really easy to deform objects, let&amp;#39;s take an example. Say you have a game that will make it possible to create your own character. This includes changing skin color, eye color, hair, clothes and so on. We can&amp;nbsp;in this example create a vertex shader to create a weight property for our character, where say 0 means that our character will be very slim, and 1 that says that our character will be fat.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Fat/Slim&lt;br /&gt;&lt;/h3&gt;
&lt;p&gt;To do this, we need a vertex shader that simply moves a vertex along it&amp;#39;s normal:&lt;br /&gt;&lt;img src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNAShaderProgramming/Tutorial%205/de_t5_1.jpg" alt="" /&gt;&lt;br /&gt;If we move all the vertices along&amp;nbsp;their normals, the object will be bigger, or smaller. &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Ocean waves&lt;/h3&gt;
&lt;p&gt;Instead of making a big bone animated mesh to create a realistic looking ocean in your game, you could use a vertex shader to produce waves.&lt;br /&gt;To do this, you will need a big flat mesh that will represent your ocean without any waves. You could either do this in 3Ds, or produce it with code. It will need many vertexes, as the shader will move them up and down&amp;nbsp;according to a sine/cos function.&lt;br /&gt;&lt;img style="WIDTH:431px;HEIGHT:316px;" height="316" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNAShaderProgramming/Tutorial%205/de_t5_2.jpg" width="431" alt="" /&gt;&lt;br /&gt;As we can see in this picture, we got a plane defined by alot of vertexes. We can here use a Vertex Shader to move all vertexes by its Y-axis&amp;nbsp;with a sine function, say f(y)=sin(y). Say vertex X is moved with pos.Y = sin(X.pos+time);&lt;br /&gt;This will produce waves on the ocean. Ofcourse, this is really simple and pretty ugly. There is alot of differen Ocean algorithms out there, so if you want to look more closely on this subject, just do a google on the topic.&lt;br /&gt;&lt;br /&gt;To make the ocean look better, you could apply a normal map to create small bumps on the surface, in addition to huge waves. You can also mix sine and cos functions to make more realistic waves.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&amp;quot;Fake Spherical harmonics&amp;quot;&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;This is what I&amp;#39;m going to implement today. Its pretty much a combination of the slim/fat algorithm and the ocean algorithm. The example will use a sphere object, and apply a pretty advanced sin/cos function to move vertexes along&amp;nbsp;their normal&amp;nbsp;in order to&amp;nbsp;deform it, based on time.&lt;br /&gt;&lt;img src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNAShaderProgramming/Tutorial%205/de_t5_3.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Implementing the shader&lt;/h2&gt;&lt;br /&gt;The shader is just a Vertex Shader. The pixel shader will only do some basic lighting to make it look more real. You can add normal-mapping here and so on to create really cool looking effects( refer to my last tutorial, 4 ).&lt;br /&gt;In this shader, we will need a time variable, so we can move our vertexes along with a timer to make it look animated, and then we only make a huge mess of sine and cos functions to make it look cool. Feel free to play with these values.&lt;br /&gt;Here is the Vertex Shader for this effect:&lt;br /&gt;&lt;pre class="code"&gt;float4 g_fTime;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre class="code"&gt;&lt;p&gt;OUT VS(float4 Pos : POSITION, float3 N : NORMAL)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; OUT Out = (OUT)0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float angle=(g_fTime%360)*2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float freqx = 1.0f+sin(g_fTime)*4.0f;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float freqy = 1.0f+sin(g_fTime*1.3f)*4.0f;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float freqz = 1.0f+sin(g_fTime*1.1f)*4.0f;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float amp = 1.0f+sin(g_fTime*1.4)*30.0f;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float f = sin(N.x*freqx + g_fTime) * sin(N.y*freqy + g_fTime) * sin(N.z*freqz + g_fTime);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pos.z += N.z * amp * f;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pos.x += N.x * amp * f;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pos.y += N.y * amp * f;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Out.Pos = mul(Pos, matWorldViewProj);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Out.N = mul(N, matWorld);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float4 PosWorld = mul(Pos, matWorld);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Out.L = vecLightDir;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Out.V = vecEye - PosWorld;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; return Out;&lt;br /&gt;}&lt;/p&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This shader calculates an amplitude and a frequency in order to find a smooth value that the vertex can be moved to, based on its vertex.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Using the shader&lt;/h2&gt;
&lt;p&gt;Nothing new here. We only pass a variable time to our shader trough the g_fTime parameter&amp;nbsp;defined in our shader file.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://gamecamp.no/aggbug.aspx?PostID=438" width="1" height="1"&gt;</description></item><item><title>XNA Shader Programmering, Tutorial 4</title><link>http://gamecamp.no/blogs/tutorials/archive/2008/04/11/xna-shader-programmering-tutorial-4.aspx</link><pubDate>Fri, 11 Apr 2008 16:53:00 GMT</pubDate><guid isPermaLink="false">7ca9b034-3ad4-4aeb-9f95-4c8e81e4d749:434</guid><dc:creator>digitalerr0r</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://gamecamp.no/blogs/tutorials/rsscomments.aspx?PostID=434</wfw:commentRss><comments>http://gamecamp.no/blogs/tutorials/archive/2008/04/11/xna-shader-programmering-tutorial-4.aspx#comments</comments><description>&lt;h1&gt;XNA Shader Programming&lt;/h1&gt;
&lt;p&gt;Welcome back to the XNA Shader Programming series. I hope you enjoyed the last 3 tutorials, and have started to get a grip on shaders! &lt;br /&gt;Last time we talked about Specular lighting, and how to implement this in our own engines. Today I&amp;#39;m going to take this to the next level, and implement Normal Mapping. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Before we start&lt;/h3&gt;
&lt;p&gt;In this tutorial, you will need some basic knowledge of shaderprogramming, vector math and matrix math. Also, the project is for XNA 2.0 and Visual Studio 2005.&lt;/p&gt;
&lt;p&gt;Sourcecode: &lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNAShaderProgramming/Tutorial%204/de_ShaderTutorial_4.zip"&gt;de_shader_tutorial04.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;Normal Mapping&lt;/h2&gt;
&lt;p&gt;Normal mapping is a way to make a low-poly object look like a high-poly objekt, without having to add more polygons to the model. We can make surfaces, like walls, look alot more detailes and realistic by using the technique in todays lesson. &lt;br /&gt;A easy way to descibe normal mapping is that it is used to fake the existence of geometry. &lt;br /&gt;&lt;br /&gt;To compute normal mapping, we will need two textures: one for the colormap, like a stone texture, and a normal map that describes the direction of a normal. Instead of calculating the Light by using Vertex normals, we calculate lighting by using the normals stored in the normal map. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNAShaderProgramming/Tutorial%204/de4_1.jpg" alt="" /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Sounds easy, ey? Well, there is one more thing. In most Normal mapping techniques( like the one I&amp;#39;m describing today ), the the normals are stored in something that is called &lt;em&gt;texture space coordinate system&lt;/em&gt;, or &lt;em&gt;tangent space coordinate system,.&lt;/em&gt; Since the light vector is handled in object or world space, we need to transform the light vector into the same space as the normals in the normalmap. &lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;Tangen space&lt;/h2&gt;
&lt;p&gt;To describe tangent space, take a look at this image: &lt;br /&gt;&lt;img src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNAShaderProgramming/Tutorial%204/de4_2.jpg" alt="" /&gt;&amp;nbsp; &lt;br /&gt;Our shader will create a vector W for the texture space coordinate system by using the normal. Then we will calculate U with the help of a DirectX Util function called D3DXComputeTangent() and then calculate vector V by taking the corss-product of W and U. &lt;br /&gt;V = WxU. &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Lets take a closer look on how to implement this later, for now, let&amp;#39;s focus on todays next thing: Textures! &lt;br /&gt;As you might have noticed, we need textures to implement normal mapping. Two textures to be spesific. &lt;br /&gt;&lt;br /&gt;So, how do we load textures? In XNA this is very simple, and I&amp;#39;ll cover this later. And guess what? It&amp;#39;s just as simple to implement textures in our shaders. &lt;br /&gt;To implement textures, we need to create something that is called Texture samplers. A texture sampler, as the name describes, sets the sampler state on a texture. This could be info about how the texture should use filtering( trilinear in our case ), and how the U,V coordinates of the texturemap will behave. This can be clamping the texture, mirroring the texture and so on. &lt;br /&gt;&lt;br /&gt;To create a sampler for our texture, we first need to define a texture variable the sampler will use: &lt;br /&gt;&lt;br /&gt;texture ColorMap; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;We can now use ColorMap to create a texture sampler: &lt;br /&gt;&lt;br /&gt;sampler ColorMapSampler = sampler_state &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp; Texture = &amp;lt;ColorMap&amp;gt;; // sets our sampler to use ColorMap &lt;br /&gt;&amp;nbsp;&amp;nbsp; MinFilter = Linear;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // enabled trilinear filtering for this texture &lt;br /&gt;&amp;nbsp;&amp;nbsp; MagFilter = Linear; &lt;br /&gt;&amp;nbsp;&amp;nbsp; MipFilter = Linear;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; AddressU&amp;nbsp; = Clamp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // sets our texture to clamp &lt;br /&gt;&amp;nbsp;&amp;nbsp; AddressV&amp;nbsp; = Clamp; &lt;br /&gt;};&lt;/p&gt;
&lt;p&gt;So, we got a texture and a sampler for this texture. &lt;br /&gt;Before we can start using the texture in our shaders, we need to set a sampler stage in our technique: &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;technique NormalMapping &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pass P0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sampler[0] = (ColorMapSampler);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VertexShader = compile vs_1_1 VS(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelShader&amp;nbsp; = compile ps_2_0 PS(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;Ok, now we are ready to use our texture! &lt;br /&gt;Since we are using a pixels shader to map a texture to an object, we can simply create a vector named color: &lt;br /&gt;float4 Color; &lt;br /&gt;&lt;br /&gt;and set the values in the color variable to equal the color in our texture at texturecoordinate UV. &lt;br /&gt;In HLSL, this can easily be done by using a HLSL function called tex2D( s, t ); where s is the sampler, and t is the texture coordinate of the pixel we are currently working on. &lt;br /&gt;Color = tex2D( ColorMapSampler, Tex ); // Tex is an input to our pixel shader, from our vertex shader. It is the texture coordinate our PS is currently working on. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Texture coordinates?? Well, let me explain that. A texture coordinate is simpla a 2D coordinate ( U,V ) that is store in our 3D model or object. It is used to map a texture onto the object and are ranging from 0 to 1. &lt;br /&gt;&lt;img src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNAShaderProgramming/Tutorial%204/de4_3.jpg" alt="" /&gt;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;With texture coordinates, the model can have textures assigned to different places, say an Iris texture on the eyeball part of a human-model, or a mouth somewhere in a human face. &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;As for the lighting algortihm, we will use Specular lighting. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Ok, guess we are done with the teory, hope you got an overview of the different components needed in the Normal Map shader. &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;Implementing the shader&lt;/h2&gt;
&lt;p&gt;The biggest differences on this shader and the specular lighting shader is that we will use tangent space instead of object space, and that the normals used for lighting calculation will be retrived from a normal map. &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Lets start by declaring a few global variables: &lt;br /&gt;&lt;/p&gt;&lt;pre class="code"&gt;float4x4 matWorldViewProj;    
float4x4 matWorld;    
float4 vecLightDir;
float4 vecEye;&lt;/pre&gt;
&lt;p&gt;Nothing new here, lets continue by creating an instance and a sampler for the color map, and the normal map. &lt;br /&gt;&lt;/p&gt;&lt;pre class="code"&gt;texture ColorMap;
sampler ColorMapSampler = sampler_state
{
   Texture = &amp;lt;ColorMap&amp;gt;;
   MinFilter = Linear;
   MagFilter = Linear;
   MipFilter = Linear;   
   AddressU  = Clamp;
   AddressV  = Clamp;
};

texture NormalMap;
sampler NormalMapSampler = sampler_state
{
   Texture = &amp;lt;NormalMap&amp;gt;;
   MinFilter = Linear;
   MagFilter = Linear;
   MipFilter = Linear;   
   AddressU  = Clamp;
   AddressV  = Clamp;
};&lt;br /&gt;&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;We create an instance of the ColorMap texture&amp;nbsp; and a sampler for it. These textures will be set trough a parameter from our main application. As you can se, we are using trilinear filtering for both our texture. &lt;br /&gt;Now, the output structure that the Vertex Shader will return looks just the same as in the specular lighting shader: &lt;br /&gt;&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;struct &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;OUT
&lt;/span&gt;{
    float4 Pos  : POSITION;
    float2 Tex : TEXCOORD0;
    float3 Light : TEXCOORD1;
    float3 View : TEXCOORD2;
};&lt;br /&gt;&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Let&amp;#39;s continue with the Vertex Shader. There is a lot of new things here, mostly because we want to calculate the tangent space. Have a look at the code: &lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;OUT VS(float4 Pos : POSITION, float2 Tex : TEXCOORD, float3 N : NORMAL, float3 T : TANGENT  )
{
    OUT Out = (OUT)0;      
    Out.Pos = mul(Pos, matWorldViewProj);&lt;span style="COLOR:green;"&gt;
    
    &lt;/span&gt;float3x3 worldToTangentSpace;
    worldToTangentSpace[0] = mul(T, matWorld);
    worldToTangentSpace[1] = mul(cross(T, N), matWorld);
    worldToTangentSpace[2] = mul(N, matWorld);
        
    Out.Tex = Tex;
    
    float4 PosWorld = mul(Pos, matWorld);    
    
    Out.Light = mul(worldToTangentSpace, vecLightDir);     &lt;span style="COLOR:green;"&gt;// L
    &lt;/span&gt;Out.View = mul(worldToTangentSpace, vecEye - PosWorld);    &lt;span style="COLOR:green;"&gt;// V
    
   &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;Out;
}&lt;/pre&gt;
&lt;p&gt;We start by transforming the position as usually. &lt;br /&gt;Then we create a 3x3 matrix, worldToTangentSpace, that is used to transform from world space to tangent space. &lt;br /&gt;&lt;br /&gt;Basically, what we get from this vertex shader is the transformed Position, and a transformed Light and View vector based on the tangent space matrix. This is because, as mentioned earlier, the normal map is stored in tangen space. So to calculate a proper light based on the normal map, we need to do this to have all vectors in the same space. &lt;br /&gt;&lt;br /&gt;So, now that we have our vectos in the right space, we are ready to implement the pixel shader. &lt;br /&gt;The pixelshader need to get the pixelcolor from the colormap, and the normal from the normal map. &lt;br /&gt;Once this is done, we can calulate the ambient, diffuse and specular lighting based on the normal from our normal map. &lt;br /&gt;&amp;nbsp; &lt;br /&gt;The code for implementing the pixel shader is pretty much straigth forward, have a look at the code: &lt;br /&gt;&lt;/p&gt;&lt;pre class="code"&gt;float4 PS(float2 Tex: TEXCOORD0, float3 L : TEXCOORD1, float3 V : TEXCOORD2) : COLOR 
{
&lt;span style="COLOR:green;"&gt;    &lt;/span&gt;float4 Color = tex2D(ColorMapSampler, Tex);    
    
&lt;span style="COLOR:green;"&gt;    &lt;/span&gt;float3 N =(2 * (tex2D(NormalMapSampler, Tex)))- 1.0; 
     
     
&lt;span style="COLOR:green;"&gt;    &lt;/span&gt;float3 LightDir = normalize(L);    &lt;span style="COLOR:green;"&gt;// L
    &lt;/span&gt;float3 ViewDir = normalize(V);    &lt;span style="COLOR:green;"&gt;// V
        
    &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;D = saturate(dot(N, LightDir)); 
    
&lt;span style="COLOR:green;"&gt;    &lt;/span&gt;float3 R = normalize(2 * D * N - LightDir);  &lt;span style="COLOR:green;"&gt;// R
     
    &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;S = min(pow(saturate(dot(R, ViewDir)), 3), Color.w);

    &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;0.2 * Color + Color * D + S;    
}&lt;br /&gt;&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;There ain&amp;#39;t much new here, except for the N variable and the calculation on specular lighting. &lt;br /&gt;The normal use the same function as getting the pixel color from the colormap: tex2D(s,t); &lt;br /&gt;And, its pretty much the same thing. We need to make sure that the normal can range from -1 and 1 so we multiply the normal with two, and subtract one. &lt;br /&gt;float3 N =(2 * (tex2D(NormalMapSampler, Tex)))- 1.0; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;And also, to compute how shiny the surface will be( specular lighting ) we can use the alphachannel in our colormap to make it possible for artists to specify how shiny different parts of a texture will be. &lt;br /&gt;&lt;br /&gt;Finally, we create the technique and initiates the samplers used in this shader. &lt;br /&gt;&lt;/p&gt;&lt;pre class="code"&gt;technique NormalMapping
{
    pass P0
    {
        Sampler[0] = (ColorMapSampler);        
        Sampler[1] = (NormalMapSampler);        
    &lt;span style="COLOR:green;"&gt;
        &lt;/span&gt;VertexShader = compile vs_1_1 VS();
        PixelShader  = compile ps_2_0 PS();
    }
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Using the shader&lt;/h2&gt;
&lt;p&gt;Ok, not much new when it comes to using the shader, except for the textures! &lt;br /&gt;&lt;br /&gt;To initiate and use textures in XNA we are going to use the built in Texture2D class.&lt;br /&gt;&lt;br /&gt;&lt;span style="COLOR:#2b91af;"&gt;Texture2D &lt;/span&gt;colorMap;&lt;br /&gt;&lt;span style="COLOR:#2b91af;"&gt;Texture2D &lt;/span&gt;normalMap;&lt;br /&gt;&lt;/p&gt;&lt;pre class="code"&gt;Now we are ready to initialise the texutres using the Content.Load function. We assume that you have created a normal map and a colormap for your object.&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;colorMap = Content.Load&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Texture2D&lt;/span&gt;&amp;gt;(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;stone&amp;quot;&lt;/span&gt;);&lt;br /&gt;normalMap = Content.Load&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Texture2D&lt;/span&gt;&amp;gt;(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;normal&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;/p&gt;&lt;pre class="code"&gt;All that is left is to pass the textures into the shader. &lt;br /&gt;This is done exactly the same way as other parameters passed to the shader. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="code"&gt;effect.Parameters[&lt;span style="COLOR:#a31515;"&gt;&amp;quot;ColorMap&amp;quot;&lt;/span&gt;].SetValue(colorMap);
effect.Parameters[&lt;span style="COLOR:#a31515;"&gt;&amp;quot;NormalMap&amp;quot;&lt;/span&gt;].SetValue(normalMap);&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;h2&gt;Excersises&lt;/h2&gt;
&lt;p&gt;1. Play with different colormaps and see how the outcome is. &lt;br /&gt;2. Try different models, like a cube to create a detailed brickwall or a stonewall. &lt;br /&gt;3. Implement a normal map shader, with detailed control for all light values( ambient, diffuse, specualar ) and make it possible to enable or disable different parts of the algorithm( tips: use a boolean to set disabled values to zero ). This could result in a pretty cool and flexible shader for your applications.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I hope you now understand how normal mapping is implemented, but if not, please give me some feedback so I know what part I need to work on. &lt;br /&gt;But, as you can see, to create good looking effects you won&amp;#39;t have to write big and advanced shaders!&lt;/p&gt;
&lt;p&gt;Next time, I&amp;#39;m going to write a tutorial about deforming objects.&lt;/p&gt;&lt;img src="http://gamecamp.no/aggbug.aspx?PostID=434" width="1" height="1"&gt;</description><category domain="http://gamecamp.no/blogs/tutorials/archive/tags/XNA/default.aspx">XNA</category><category domain="http://gamecamp.no/blogs/tutorials/archive/tags/Normal+map/default.aspx">Normal map</category><category domain="http://gamecamp.no/blogs/tutorials/archive/tags/Shader/default.aspx">Shader</category><category domain="http://gamecamp.no/blogs/tutorials/archive/tags/HLSL/default.aspx">HLSL</category></item><item><title>XNA Shader Programmering, Tutorial 3</title><link>http://gamecamp.no/blogs/tutorials/archive/2008/04/09/xna-shader-programmering-tutorial-3.aspx</link><pubDate>Tue, 08 Apr 2008 22:02:00 GMT</pubDate><guid isPermaLink="false">7ca9b034-3ad4-4aeb-9f95-4c8e81e4d749:433</guid><dc:creator>digitalerr0r</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://gamecamp.no/blogs/tutorials/rsscomments.aspx?PostID=433</wfw:commentRss><comments>http://gamecamp.no/blogs/tutorials/archive/2008/04/09/xna-shader-programmering-tutorial-3.aspx#comments</comments><description>&lt;h1&gt;XNA Shader Programming&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Tutorial 3 by Petri T. Wilhelmsen aka. digitalerr0r &lt;br /&gt;&lt;a href="http://www.gamecamp.no/"&gt;www.gamecamp.no&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Since the site is being more international atm, I dediced to write the 3rd tutorial on English. Hope this won&amp;#39;t be a problem for most of you, but if you got any questions, please don&amp;#39;t hesitate contacting me.&lt;/p&gt;
&lt;p&gt;In todays lesson, we are going to implement an other lighting algorithm called Specular Lighting. This algeorithm builds on the Ambient and Diffuse lighting tutorial, so if you haven&amp;#39;t been trough my last tutorials, now is the time. :)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Before we start: &lt;br /&gt;&lt;/strong&gt;In this tutorial, you will need some basic knowledge of shaderprogramming, vector math and matrix math. Also, the project is for XNA 2.0 and Visual Studio 2005.&lt;/p&gt;
&lt;p&gt;Sourcecode: &lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNAShaderProgramming/Tutorial%203/de_ShaderTutorial_3.zip"&gt;de_shader_tutorial03.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Specular lighting&lt;/h2&gt;
&lt;p&gt;So far, we got a nice lighting model for making a good looking lighting on objects. But, what if we got a blank, polished or shiny object we want to render? Say a metal surface, plastic, glass, bottle and so on. &lt;/p&gt;
&lt;p&gt;To simulate this, we need to implement a new vector to our lighting algorithm: The eye vector. &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Whats &amp;quot;the eye&amp;quot; vector, you might think? Well, it&amp;#39;s a pretty easy answer to this. It&amp;#39;s the vector that points from our camera position to the camera target.&lt;/p&gt;
&lt;p&gt;We already got this vector in our application code: &lt;br /&gt;&lt;/p&gt;&lt;pre class="code"&gt;viewMatrix   = &lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt;.CreateLookAt( &lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt;(x, y, zHeight), &lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt;.Zero, &lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt;.Up );&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;The position of &amp;quot;The eye&amp;quot; is located here: &lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt;(x, y, zHeight)&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;So let&amp;#39;s take this vector, and store it in a variable:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:#2b91af;"&gt;Vector4 &lt;/span&gt;vecEye = &lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Vector4&lt;/span&gt;(x, y, zHeight,0);&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;Let&amp;#39;s look more closely about how to use the shader after we have created it. &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;The formula for Specular Lighting is&lt;/p&gt;
&lt;h2&gt;&lt;em&gt;I=Ai*Ac+Di*Dc*N.L+Si*Sc*(R.V)^n&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Where &lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;&lt;em&gt;R=2*(N.L)*N-L&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNAShaderProgramming/Tutorial%203/t3_1.jpg" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;As we can see, we got the new Eye vector V, and aslo we got a reflection vector R.&lt;/p&gt;
&lt;p&gt;To compute the Specular light, we need to take the dot product of R and V and use this in the power of n where n is controlling how &amp;quot;shiny&amp;quot; the object is.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Implementing the shader&lt;/h2&gt;
&lt;p&gt;It&amp;#39;s time to implement the shader, but first, let&amp;#39;s look at the result:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNAShaderProgramming/Tutorial%203/t3_2.jpg" alt="" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;As you can see, this object looks polished/shiny, only by using the shader we are going to implement! &lt;br /&gt;Pretty cool, ey?&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Lets start by declaring a few variables we will need for this shader:&lt;br /&gt;&lt;/p&gt;&lt;pre class="code"&gt;float4x4 matWorldViewProj;    
float4x4 matWorld;    
float4 vecLightDir;
float4 vecEye;
float4 vDiffuseColor;
float4 vSpecularColor;
float4 vAmbient;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;And then the output structure for our Vertex Shader. The shader will return the transformed position , Light vector, Normal vector and view vector( the Eye vector ) for a given vertex.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;struct &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;OUT
&lt;/span&gt;{
    float4 Pos  : POSITION;
    float3 L : TEXCOORD0;
    float3 N : TEXCOORD1;
    float3 V : TEXCOORD2;
};&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;Not much new in the vertex shader since last time, except for the V vector. V is calculated by subtracting the transformed position from the Eye vector. &lt;br /&gt;Since V is a part of the OUT structure, and we have defined OUT Out, we can calculate V with the following code: &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;float4 PosWorld = mul(Pos,matWorld); &lt;br /&gt;Out.L = vecEye - PosWorld&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;where vecEye is a vector passed into the shader trough a shader-parameter.( The camera position ).&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre class="code"&gt;OUT VS(float4 Pos : POSITION, float3 N : NORMAL)
{
    OUT Out = (OUT)0;      
    
    Out.Pos = mul(Pos, matWorldViewProj);    
    Out.N = mul(N, matWorld);                
    
    float4 PosWorld = mul(Pos, matWorld);    
    
    Out.L = vecLightDir;
    Out.V = vecEye - PosWorld;
    
   &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;Out;
}&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;And then its time to implement the pixelshader. We start with normalizing the Normal, LightDir and ViewDir to make calculations a bit simpler. &lt;br /&gt;The pixelshader will reatun a float4, that represents the finished color, I, of the current pixel, based on the formula for specular lighding described earlier.&lt;br /&gt;&lt;br /&gt;Then, we will calculate direction of the diffuse light as we did in Tutorial 2.&lt;br /&gt;&lt;br /&gt;The new thing in the Pixel Shader for Specular Lighting is to calculate and use a reflectionvector for L by N, and using this vector to compute the specular light.&lt;br /&gt;&lt;br /&gt;So, we start with computing the reflectionvector of L by N: &lt;br /&gt;R = 2 * (N.L) * N – L &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As we can se, we have already computed the Dotproduct N.L when computing the diffuse light. Lets use this and write the following code: &lt;br /&gt;float3 Reflect = normalize(2 * Diff * Normal - LightDir); &lt;br /&gt;&lt;br /&gt;Now, all there is left is to compute the specular light. We know that this is computed by taking the power of the dotproduct of the reflection vecotor and the view vector, by n: (R.V)^n &lt;br /&gt;You can think of n as a factor for how shiny the object will be. The more n is, the less shiny it is, so play with n to get the result you like.&lt;br /&gt;&lt;br /&gt;As you might have noticed, we are using a new HLSL function pow(a,b). What this does is quite simple, it returns a^b. &lt;br /&gt;&lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;Specular = pow(saturate(dot(Reflect, ViewDir)), 15);&lt;br /&gt;&lt;br /&gt;Phew, we are finally ready to put all this together and compute the final pixelcolor: &lt;br /&gt;&lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;vAmbient + vDiffuseColor * Diff + vSpecularColor * Specular;&lt;br /&gt;&lt;br /&gt;This formula should no longer be a suprise for anyone, right? &lt;br /&gt;We start by calculating the Ambient and Diffuse light, and add these together. Then we take the specular light color and multiply it with the Specular component we just calculated, and add it with the Ambient and Diffuse color.&lt;/p&gt;
&lt;p&gt;The pixelshader for this tutorial could look like this: &lt;br /&gt;&lt;br /&gt;float4 PS(float3 L: TEXCOORD0, float3 N : TEXCOORD1, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; float3 V : TEXCOORD2) : COLOR&lt;br /&gt;{&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float3 Normal = normalize(N);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float3 LightDir = normalize(L);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float3 ViewDir = normalize(V);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;Diff = saturate(dot(Normal, LightDir)); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;// R = 2 * (N.L) * N – L&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;float3 Reflect = normalize(2 * Diff * Normal - LightDir);&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;Specular = pow(saturate(dot(Reflect, ViewDir)), 15); &lt;span style="COLOR:green;"&gt;// R.V^n&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // I = A + Dcolor * Dintensity * N.L + Scolor * Sintensity * (R.V)n&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;vAmbient + vDiffuseColor * Diff + vSpecularColor * Specular; &lt;br /&gt;}&lt;/p&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="code"&gt;&lt;font face="Trebuchet MS"&gt;And offcourse, we have to specify a technique for this shader, and compile the Vertex and Pixel shader:&lt;/font&gt;

technique SpecularLight
{
    pass P0
    {
        &lt;span style="COLOR:green;"&gt;// compile shaders
        &lt;/span&gt;VertexShader = compile vs_1_1 VS();
        PixelShader  = compile ps_2_0 PS();
    }
}&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;The whole code for the shader( .fx ) file is: &lt;br /&gt;&lt;/p&gt;&lt;pre class="code"&gt;float4x4 matWorldViewProj;    
float4x4 matWorld;    
float4 vecLightDir;
float4 vecEye;
float4 vDiffuseColor;
float4 vSpecularColor;
float4 vAmbient;


&lt;span style="COLOR:blue;"&gt;struct &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;OUT
&lt;/span&gt;{
    float4 Pos  : POSITION;
    float3 L : TEXCOORD0;
    float3 N : TEXCOORD1;
    float3 V : TEXCOORD2;
};


OUT VS(float4 Pos : POSITION, float3 N : NORMAL)
{
    OUT Out = (OUT)0;      
    
    Out.Pos = mul(Pos, matWorldViewProj);    
    Out.N = mul(N, matWorld);                
    
    float4 PosWorld = mul(Pos, matWorld);    
    
    Out.L = vecLightDir;
    Out.V = vecEye - PosWorld;
    
   &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;Out;
}


float4 PS(float3 L: TEXCOORD0, float3 N : TEXCOORD1, 
            float3 V : TEXCOORD2) : COLOR
{   
    float3 Normal = normalize(N);
    float3 LightDir = normalize(L);
    float3 ViewDir = normalize(V);    
    
    &lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;Diff = saturate(dot(Normal, LightDir)); 
    
    &lt;span style="COLOR:green;"&gt;// R = 2 * (N.L) * N – L
    &lt;/span&gt;float3 Reflect = normalize(2 * Diff * Normal - LightDir);  
    &lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;Specular = pow(saturate(dot(Reflect, ViewDir)), 15); &lt;span style="COLOR:green;"&gt;// R.V^n

    // I = A + Dcolor * Dintensity * N.L + Scolor * Sintensity * (R.V)n
    &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;vAmbient + vDiffuseColor * Diff + vSpecularColor * Specular; 
}


technique SpecularLight
{
    pass P0
    {
        &lt;span style="COLOR:green;"&gt;// compile shaders
        &lt;/span&gt;VertexShader = compile vs_1_1 VS();
        PixelShader  = compile ps_2_0 PS();
    }
}&lt;/pre&gt;
&lt;h2&gt;Using the shader&lt;/h2&gt;
&lt;p&gt;There is almost nothing new when it comes to using the shader in an application since my last tutorial, except for setting the vecEye parameter to the shader. &lt;br /&gt;We just take the position of the camera and pass it to our shader. If you are using a camera-class, there might be a function for getting the camera position. It&amp;#39;s really up to you how you decide to get it. &lt;br /&gt;In my example, i use the same variables for setting the camera position, and creating a vector that is passed to the shader. &lt;br /&gt;&lt;br /&gt;&lt;span style="COLOR:#2b91af;"&gt;Vector4 &lt;/span&gt;vecEye = &lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Vector4&lt;/span&gt;(x, y, zHeight,0); &lt;br /&gt;&lt;br /&gt;and pass it to the shader: &lt;br /&gt;effect.Parameters[&amp;quot;vecEye&amp;quot;].SetValue(vecEye);&lt;br /&gt;&lt;br /&gt;Setting parameters in a shader from the application and how to implement the shader should not be a new topic for you if you&amp;#39;r at this stage, so I won&amp;#39;t go into further detail about this. Please refer to Tutorial 2 and Tutorial 1 about this, or send me an e-mail.&lt;br /&gt;&lt;br /&gt;We also have to remember to set the technique to &amp;quot;SpecularLight&amp;quot;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;Excersises&lt;/h2&gt;
&lt;p&gt;1. Make a new global variable in the shader that specifies the &amp;quot;shininess&amp;quot; of the object. You should be able to set this variable from the application that is using the shader. &lt;br /&gt;2. In this tutorial, you don&amp;#39;t have so much control over the light settings( like setting Ai and Ac, Di and Dc ). Make this shader to support setting Ai, Ac, Di, Dc, Si and Sc where Si and Sc is the color and intensitivity for the specular light&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks for reading this tutorial, hope I covered it enough for you to understand! &lt;br /&gt;If you have any comments, feedback or questions, please ask me on petriw(at)gmail.com, or find me on the forums.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Next time I&amp;#39;m going to cover Normal mapping, and how to use textures in shaders.&lt;/p&gt;&lt;img src="http://gamecamp.no/aggbug.aspx?PostID=433" width="1" height="1"&gt;</description></item><item><title>Compressing audio in Xna for Windows</title><link>http://gamecamp.no/blogs/tutorials/archive/2008/04/02/compressing-audio-in-xna-for-windows.aspx</link><pubDate>Wed, 02 Apr 2008 15:55:00 GMT</pubDate><guid isPermaLink="false">7ca9b034-3ad4-4aeb-9f95-4c8e81e4d749:426</guid><dc:creator>Einar Ingebrigtsen</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://gamecamp.no/blogs/tutorials/rsscomments.aspx?PostID=426</wfw:commentRss><comments>http://gamecamp.no/blogs/tutorials/archive/2008/04/02/compressing-audio-in-xna-for-windows.aspx#comments</comments><description>&lt;p&gt;Xna does not support MP3 or WMA, neither on Xbox or Windows. For Xbox you have a format called XMA that is pretty much like WMA on Windows, but for Xna for Windows you have to resort to uncompressed (PCM) or close to uncompressed (ADPCM). This tutorial shows you how you can use ADPCM and get at least some compression for your sounds and save a bit of space. The average compression rate is 27% for the default settings.&lt;/p&gt;  &lt;p&gt;We will be using XACT (Microsoft Cross-Platform Audio Creation Tool) that comes with both Xna 1.0 and 2.0. &lt;/p&gt;  &lt;p&gt;Create a new project by going to File-&amp;gt;New Project (Ctrl +N) and create yourself an empty project.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/CompressingaudioinXnaforWindows_FB55/image_4.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="314" alt="image" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/CompressingaudioinXnaforWindows_FB55/image_thumb_1.png" width="438" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You then get a screen looking something like this: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/CompressingaudioinXnaforWindows_FB55/image_6.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="538" alt="image" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/CompressingaudioinXnaforWindows_FB55/image_thumb_2.png" width="429" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;First we will create a compression preset by right-clicking the compression presets and select new compression preset:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/CompressingaudioinXnaforWindows_FB55/image_10.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="33" alt="image" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/CompressingaudioinXnaforWindows_FB55/image_thumb_4.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Give it a name, so you&amp;#39;ll recognize it later on in the process.&lt;/p&gt;  &lt;p&gt;Now we need to select ADPCM and samples per block:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/CompressingaudioinXnaforWindows_FB55/image_12.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="286" alt="image" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/CompressingaudioinXnaforWindows_FB55/image_thumb_5.png" width="293" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;We&amp;#39;ll leave the samples per block to 128, which is default. The quality of the sound is quite good with this setting.&lt;/p&gt;  &lt;p&gt;Now we need to create a wave bank by right-clicking the wave banks in the project and choose new wave bank:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/CompressingaudioinXnaforWindows_FB55/image_14.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="57" alt="image" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/CompressingaudioinXnaforWindows_FB55/image_thumb_6.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Leave the default settings for now.&lt;/p&gt;  &lt;p&gt;You&amp;#39;re then given a window where all your wave files will exist for that particular wave bank. Here we can insert our wave files.    &lt;br /&gt;Just right-click inside the window and choose to insert wave files: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/CompressingaudioinXnaforWindows_FB55/image_16.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="292" alt="image" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/CompressingaudioinXnaforWindows_FB55/image_thumb_7.png" width="491" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Select your wave file: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/CompressingaudioinXnaforWindows_FB55/image_18.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="300" alt="image" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/CompressingaudioinXnaforWindows_FB55/image_thumb_8.png" width="420" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;We can now select the compression preset we want to use for the imported wave by selecting the wave file and then selecting the correct preset in the properties in the lower left of the application:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/CompressingaudioinXnaforWindows_FB55/image_20.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="367" alt="image" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/CompressingaudioinXnaforWindows_FB55/image_thumb.png" width="415" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Now we need to create sound bank by right-clicking the sound banks and choose new sound bank:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/CompressingaudioinXnaforWindows_FB55/image_24.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="40" alt="image" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/CompressingaudioinXnaforWindows_FB55/image_thumb_11.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Open your wave bank and select the wave file you want to be cue in the sound and drag it from the wave bank onto the cue part of the window.    &lt;br /&gt;The result should be something like this: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/CompressingaudioinXnaforWindows_FB55/image_26.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="335" alt="image" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/CompressingaudioinXnaforWindows_FB55/image_thumb_12.png" width="567" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You now have a project you can build and use from your solution programmatically.&lt;/p&gt;&lt;img src="http://gamecamp.no/aggbug.aspx?PostID=426" width="1" height="1"&gt;</description></item><item><title>XNA 3D Engine - Camera and Game services (Part 3)</title><link>http://gamecamp.no/blogs/tutorials/archive/2008/03/16/xna-3dengine-camera-and-game-services-part-3.aspx</link><pubDate>Sun, 16 Mar 2008 01:42:00 GMT</pubDate><guid isPermaLink="false">7ca9b034-3ad4-4aeb-9f95-4c8e81e4d749:404</guid><dc:creator>raymond</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://gamecamp.no/blogs/tutorials/rsscomments.aspx?PostID=404</wfw:commentRss><comments>http://gamecamp.no/blogs/tutorials/archive/2008/03/16/xna-3dengine-camera-and-game-services-part-3.aspx#comments</comments><description>&lt;span style="mso-ansi-language:en-gb;"&gt;Welcome to the third part of this tutorial. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;You can download the project for all the three parts at the bottom of the page. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Today we’ll look at how to create a camera class for our engine, and how it will play along with the hero class we made. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;The first thing we need to do is to create an IHero interface for the camera to query. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;A nice way to do that (if you don’t have Resharper) is to enter the class designer for the project, right click the hero class and select “extract interface”. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Choose the rotation and position member to create the new interface. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;It should look like this: &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;interface&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;IHero &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:#2b91af;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt; Position { &lt;span style="COLOR:blue;"&gt;get&lt;/span&gt;; } &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;FONT-FAMILY:;"&gt;float&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt; Rotation { &lt;span style="COLOR:blue;"&gt;get&lt;/span&gt;; } &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;In the game class, right after we add the hero component, we’ll add the hero game service like this: &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="COLOR:green;"&gt;// Add the IHero service to the Game Services. &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:green;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.Services.AddService(&lt;span style="COLOR:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="COLOR:#2b91af;"&gt;IHero&lt;/span&gt;), hero); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;Game services are objects with a typically long life cyclus. We need them when we want an object exposed to many other objects. It’s also important that we don’t expose our services too much. We don’ want our camera to change the position of our hero or our scene to change the projection matrix of our camera. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Now we can finally create the camera. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;A 3D camera needs to expose a view matrix and a projection matrix for our scene. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;The projection matrix typically doesn’t change a lot, so let’s concentrate on the view matrix. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;To calculate the view matrix we need to know the position our camera is in, and what direction we are looking. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;We get the hero’s position and rotation from our IHero game service. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;The position is a point in 3d space, here represented as a Vector. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;The rotation is in radians and we need that for calculating where the camera should look at. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Our camera class looks like this: &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;FONT-FAMILY:;"&gt;using&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt; Microsoft.Xna.Framework; &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;FONT-FAMILY:;"&gt;namespace&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt; XNA3DEngine &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;class&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;Camera&lt;/span&gt; : &lt;span style="COLOR:#2b91af;"&gt;GameComponent&lt;/span&gt;, &lt;span style="COLOR:#2b91af;"&gt;ICamera &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:#2b91af;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;FONT-FAMILY:;"&gt;private&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt; &lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt; _position; &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;private&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt; _lookAt; &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;private&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt; _viewMatrix; &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;FONT-FAMILY:;"&gt;private&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt; &lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt; _projectionMatrix; &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;private&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;IHero&lt;/span&gt; hero; &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; Camera(&lt;span style="COLOR:#2b91af;"&gt;Game&lt;/span&gt; game) : &lt;span style="COLOR:blue;"&gt;base&lt;/span&gt;(game) &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;hero = (&lt;span style="COLOR:#2b91af;"&gt;IHero&lt;/span&gt;)Game.Services.GetService(&lt;span style="COLOR:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="COLOR:#2b91af;"&gt;IHero&lt;/span&gt;)); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt; Position &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;get&lt;/span&gt; { &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;._position; } &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;set&lt;/span&gt; { &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;._position = &lt;span style="COLOR:blue;"&gt;value&lt;/span&gt;; } &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt; LookAt &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;get&lt;/span&gt; { &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;._lookAt; } &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;set&lt;/span&gt; { &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;._lookAt = &lt;span style="COLOR:blue;"&gt;value&lt;/span&gt;; } &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt; ViewMatrix &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;get&lt;/span&gt; { &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;._viewMatrix; } &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt; ProjectionMatrix &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;get&lt;/span&gt; { &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;._projectionMatrix; } &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;///&lt;/span&gt;&lt;span style="COLOR:green;"&gt; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;param name=&amp;quot;gameTime&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:green;"&gt;Time elapsed since the last call to Microsoft.Xna.Framework.GameComponent.Update(Microsoft.Xna.Framework.GameTime)&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;/param&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:gray;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;override&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; Update(&lt;span style="COLOR:#2b91af;"&gt;GameTime&lt;/span&gt; gameTime) &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;updatePosition(); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;._viewMatrix = &lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt;.CreateLookAt(&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;._position, &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;._lookAt, &lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt;.Up); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;private&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; updatePosition() &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:green;"&gt;// Gets the position of our hero from the IHero service. &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:green;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;._position = hero.Position; &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:green;"&gt;// Updates our cameras lookAt vector. &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:green;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;updateLookatVector(); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;private&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; updateLookatVector() &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:green;"&gt;// Turn the camera in the direction that our hero is facing &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:green;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt; rotation = &lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt;.CreateRotationY(hero.Rotation); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:green;"&gt;// Gets the displacement vector. &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:green;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt; transformReference = &lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt;.Transform(&lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt;.Forward, rotation); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:green;"&gt;// Finally changes the lookAt vector. this wants to be right in front of the character. &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:green;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:green;"&gt;// It&amp;#39;s very important to change this every time the character moves or rotates. &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:green;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:green;"&gt;// if the lookAt vector isn&amp;#39;t directly in front of the character at all times, &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:green;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:green;"&gt;// it moves out of sync (and kind of funny :D). &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:green;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;._lookAt = _position + transformReference; &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;override&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; Initialize() &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;._projectionMatrix = &lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt;.CreatePerspectiveFieldOfView( &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;MathHelper&lt;/span&gt;.ToRadians(40.0f), &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.Game.GraphicsDevice.DisplayMode.AspectRatio, &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;0.1f, &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;10000.0f); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;base&lt;/span&gt;.Initialize(); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;We need our scene to know about the camera class, so we have to expose the camera as a service too. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Create this interface for our camera: &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;interface&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;ICamera &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:#2b91af;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt; ProjectionMatrix { &lt;span style="COLOR:blue;"&gt;get&lt;/span&gt;; } &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;COLOR:#2b91af;FONT-FAMILY:;"&gt;Matrix&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt; ViewMatrix { &lt;span style="COLOR:blue;"&gt;get&lt;/span&gt;; } &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-no-proof:yes;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;Now we have to add both the camera game component and the game service. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;Add these lines between our hero and scene initialization code: &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:green;"&gt;// Add our camera class &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:green;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Camera camera = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;Camera&lt;/span&gt;(&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;);&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.Components.Add(camera); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:green;"&gt;// Add the ICamera service to the Game Services. &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:green;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.Services.AddService(&lt;span style="COLOR:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="COLOR:#2b91af;"&gt;ICamera&lt;/span&gt;), camera); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;This is great, now our hero checks for input in it’s update method and our camera positions itself in its update method. The only thing that’s missing now, is to update our scene class to actually use our camera’s view and projection matrix. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;Add this as a private field to our scene class: &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;FONT-FAMILY:;"&gt;private&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt; &lt;span style="COLOR:#2b91af;"&gt;ICamera&lt;/span&gt; camera;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;In the initialize method, get a reference to the camera object like so: &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;camera = (&lt;span style="COLOR:#2b91af;"&gt;ICamera&lt;/span&gt;)Game.Services.GetService(&lt;span style="COLOR:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="COLOR:#2b91af;"&gt;ICamera&lt;/span&gt;)); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;Now change the Draw method: &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;FONT-FAMILY:;"&gt;public&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt; &lt;span style="COLOR:blue;"&gt;override&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; Draw(Microsoft.Xna.Framework.&lt;span style="COLOR:#2b91af;"&gt;GameTime&lt;/span&gt; gameTime) &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="COLOR:#2b91af;"&gt;ModelMesh&lt;/span&gt; mesh &lt;span style="COLOR:blue;"&gt;in&lt;/span&gt; scene.Meshes) &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="COLOR:#2b91af;"&gt;BasicEffect&lt;/span&gt; effect &lt;span style="COLOR:blue;"&gt;in&lt;/span&gt; mesh.Effects) &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;effect.View = camera.ViewMatrix; &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;effect.Projection = camera.ProjectionMatrix; &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;mesh.Draw(); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;base&lt;/span&gt;.Draw(gameTime); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-no-proof:yes;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;Hit F5 and voila! You can move the character around with the arrow keys. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNA3DEngineCameraandGameservicesPart3_2791/clip_image002_2.jpg"&gt;&lt;img style="BORDER-RIGHT:0px;BORDER-TOP:0px;BORDER-LEFT:0px;BORDER-BOTTOM:0px;" height="192" alt="clip_image002" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNA3DEngineCameraandGameservicesPart3_2791/clip_image002_thumb.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;That’s it for now. The next part will be a little more advanced as we are delving into collision detection. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;Until then, here’s the code I promised you: &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;div class="wlWriterSmartContent" id="scid:18d43e01-4549-4fde-8ca6-c7b4b7385fac:03cdcd3f-2285-40ef-a7b4-7f2b463be91b" style="PADDING-RIGHT:0px;DISPLAY:inline;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
&lt;p&gt;Download Solution - &lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNA3DEngineCameraandGameservicesPart3_2791/XNA3DEngine_2.zip"&gt;XNA3DEngine.zip&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://gamecamp.no/aggbug.aspx?PostID=404" width="1" height="1"&gt;</description></item><item><title>XNA 3D Engine - Hero class and rendering (Part 2)</title><link>http://gamecamp.no/blogs/tutorials/archive/2008/02/17/xna-3dengine-rendering-amp-hero-class.aspx</link><pubDate>Sun, 17 Feb 2008 20:25:00 GMT</pubDate><guid isPermaLink="false">7ca9b034-3ad4-4aeb-9f95-4c8e81e4d749:348</guid><dc:creator>raymond</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://gamecamp.no/blogs/tutorials/rsscomments.aspx?PostID=348</wfw:commentRss><comments>http://gamecamp.no/blogs/tutorials/archive/2008/02/17/xna-3dengine-rendering-amp-hero-class.aspx#comments</comments><description>&lt;span style="mso-ansi-language:en-gb;"&gt;In this second part of the tutorial we’ll look at how to render our scene, and building our hero class. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;The code for both parts is available from a link at the bottom of the article. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Navigate to the Scene class we made. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;This is still just an empty class, so what want to do now is to draw our model. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;First we need to load it. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Add these as members of our class: &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;private&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt; &lt;span style="COLOR:#2b91af;"&gt;Model&lt;/span&gt; scene; &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;..and in LoadContent(), add: &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;scene = &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.Game.Content.Load&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Model&lt;/span&gt;&amp;gt;(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;CastleSiege&amp;quot;&lt;/span&gt;); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;This basically means that we load some content of type “Model” into our “scene” member. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Let’s go and draw our model, this will be the most complicated task in this part of the tutorial. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;A model consists of several ModelMeshes. The ModelMesh has its own Effect, which in turn has a view, projection and world matrix. It also has a Draw method, which means that we have control of both movement and visibility of our modelmeshes in the model. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;There is much more to it than this, but let’s take one step at a time. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;In our Draw Method, we’ll first need to iterate over our modelmeshes. Then we’ll iterate over the effects and set its matrices. After that, we’ll draw the modelmesh. Here’s how: &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;FONT-FAMILY:;"&gt;public&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt; &lt;span style="COLOR:blue;"&gt;override&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; Draw(Microsoft.Xna.Framework.&lt;span style="COLOR:#2b91af;"&gt;GameTime&lt;/span&gt; gameTime) &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="COLOR:#2b91af;"&gt;ModelMesh&lt;/span&gt; mesh &lt;span style="COLOR:blue;"&gt;in&lt;/span&gt; scene.Meshes) &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="COLOR:#2b91af;"&gt;BasicEffect&lt;/span&gt; effect &lt;span style="COLOR:blue;"&gt;in&lt;/span&gt; mesh.Effects) &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;effect.World = &lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt;.CreateTranslation(&lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt;(0,-80,0)); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;effect.Projection = &lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt;.CreatePerspectiveFieldOfView( &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;MathHelper&lt;/span&gt;.ToRadians(40.0f), &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.Game.GraphicsDevice.DisplayMode.AspectRatio, &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;0.1f, &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;10000.0f); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;mesh.Draw(); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;base&lt;/span&gt;.Draw(gameTime); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;We set the world matrix to position our model slightly more up in the y axis, that’s because the model’s origo is in the “ground” of our castle. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;The projection matrix is a tutorial of it’s own, but this just means how we view the world. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;XNA luckily has a helper function like CreatePerspectiveFieldOfView to make it easier for us. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;mso-no-proof:yes;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Notice that we don’t set our view matrix. &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;This is something we have to add later when we start to move around in our scene. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Finally, we have to register our scene component with our Game object. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Go to the XNA3DEngine class, and navigate to the Initialize method. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;It will look like this: &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;protected&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;override&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; Initialize() &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Scene&lt;/span&gt; scene = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;Scene&lt;/span&gt;(&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.Components.Add(scene); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;base&lt;/span&gt;.Initialize(); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;It’s in the game’s “Components” collection that our gamecomponents reside. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;OK, hit F5 now and let’s see the result so far. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNA3DEngineRenderingHeroclass_12EE7/clip_image002_4.jpg"&gt;&lt;img style="BORDER-RIGHT:0px;BORDER-TOP:0px;BORDER-LEFT:0px;BORDER-BOTTOM:0px;" height="192" alt="clip_image002" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNA3DEngineRenderingHeroclass_12EE7/clip_image002_thumb_1.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Cool, we are actually in a 3d scene now. Hit alt+F4 to close the game window. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;First thing we’ll need to do now is to make it possible to move around in our world. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;In the drawing code above, we excluded the view matrix. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;The view matrix is the one that changes how we view the model &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;To encapsulate the work we have to do in constructing the view matrix, we need a camera class…but we also need a Hero class to hold positional information. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;But which of these classes should we start building now? &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Does our hero tell the camera where he is, or is it the camera that tells him where he should be? &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;You guessed correctly; let’s introduce… our Hero game component. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Our hero needs to move or rotate, based on the user input. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;The movement and rotation is based on the position/direction he is facing, so the Hero class must contain his position and rotation in radians. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Here’s the class: &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;FONT-FAMILY:;"&gt;using&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt; Microsoft.Xna.Framework; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;FONT-FAMILY:;"&gt;using&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt; Microsoft.Xna.Framework.Input; &lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;FONT-FAMILY:;"&gt;namespace&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt; XNA3DEngine &lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;///&lt;/span&gt;&lt;span style="COLOR:green;"&gt; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;summary&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:gray;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:gray;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;///&lt;/span&gt;&lt;span style="COLOR:green;"&gt; This is a game component that implements IUpdateable.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:green;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;///&lt;/span&gt;&lt;span style="COLOR:green;"&gt; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;/summary&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:gray;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:gray;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;class&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;Hero&lt;/span&gt; : &lt;span style="COLOR:#2b91af;"&gt;GameComponent&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:#2b91af;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;private&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt; position; &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt; Position&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;get&lt;/span&gt; { &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; position; }&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;private&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;float&lt;/span&gt; rotation;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;float&lt;/span&gt; Rotation &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;get&lt;/span&gt; { &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; rotation; } &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; Hero(&lt;span style="COLOR:#2b91af;"&gt;Game&lt;/span&gt; game)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;: &lt;span style="COLOR:blue;"&gt;base&lt;/span&gt;(game) &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.position = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt;(0, 80, 0); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.rotation = 0f;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;///&lt;/span&gt;&lt;span style="COLOR:green;"&gt; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;summary&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:gray;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;///&lt;/span&gt;&lt;span style="COLOR:green;"&gt; Allows the game component to perform any initialization it needs to before starting&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:green;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;///&lt;/span&gt;&lt;span style="COLOR:green;"&gt; to run.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;This is where it can query for any required services and load content.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:green;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;///&lt;/span&gt;&lt;span style="COLOR:green;"&gt; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;/summary&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:gray;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:gray;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;override&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; Initialize()&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;base&lt;/span&gt;.Initialize();&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;///&lt;/span&gt;&lt;span style="COLOR:green;"&gt; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;summary&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:gray;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;///&lt;/span&gt;&lt;span style="COLOR:green;"&gt; Allows the game component to update itself. &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:green;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:green;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;///&lt;/span&gt;&lt;span style="COLOR:green;"&gt; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;/summary&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:gray;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;///&lt;/span&gt;&lt;span style="COLOR:green;"&gt; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;param name=&amp;quot;gameTime&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:green;"&gt;Provides a snapshot of timing values.&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;/param&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:gray;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:gray;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;override&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; Update(&lt;span style="COLOR:#2b91af;"&gt;GameTime&lt;/span&gt; gameTime)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;KeyboardState&lt;/span&gt; state = &lt;span style="COLOR:#2b91af;"&gt;Keyboard&lt;/span&gt;.GetState(); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (state.IsKeyDown(&lt;span style="COLOR:#2b91af;"&gt;Keys&lt;/span&gt;.Up))&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;move(&lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt;(0, 0, -10));&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;else&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (state.IsKeyDown(&lt;span style="COLOR:#2b91af;"&gt;Keys&lt;/span&gt;.Down))&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;move(&lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt;(0, 0, 10));&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (state.IsKeyDown(&lt;span style="COLOR:#2b91af;"&gt;Keys&lt;/span&gt;.Right))&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;rotate(-0.01f);&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;else&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (state.IsKeyDown(&lt;span style="COLOR:#2b91af;"&gt;Keys&lt;/span&gt;.Left))&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;rotate(0.01f);&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;base&lt;/span&gt;.Update(gameTime);&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;private&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; move(&lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt; translation)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:green;"&gt;// Extract the rotation matrix that reflects the direction we are facing.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:green;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt; forwardMovement = &lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt;.CreateRotationY(Rotation); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:green;"&gt;// Then reposition ourselves according to the direction we are facing.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:green;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;position += &lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt;.Transform(translation, forwardMovement); &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;private&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; rotate(&lt;span style="COLOR:blue;"&gt;float&lt;/span&gt; rotationSpeed)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;rotation += rotationSpeed;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;}&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt; &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;This is pretty straightforward. The movement is done by first extracting the rotation matrix from the “rotation” member and then move in the direction specified by the translation vector. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;The rotation is in radians, and you add it to turn left, and subtract from it to turn right. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;To register our game component, go back to our game class and add this before our scene initialization: &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Hero&lt;/span&gt; hero = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;Hero&lt;/span&gt;(&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;);&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;FONT-FAMILY:;"&gt;this&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;.Components.Add(hero);&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt; &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;This is it. In the next part of the tutorial we’ll add a camera to our game and I’ll explain how the camera and our hero interact with our game world. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Until next time, take care!&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:fb3a1972-4489-4e52-abe7-25a00bb07fdf:30396237-1c6a-48cc-bcac-78478e19d863" style="PADDING-RIGHT:0px;DISPLAY:inline;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
&lt;p&gt;Code - &lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNA3DEngineRenderingHeroclass_12EE7/XNA3DEnginePart2_1.zip" target="_blank"&gt;XNA 3D-Engine Part 2&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://gamecamp.no/aggbug.aspx?PostID=348" width="1" height="1"&gt;</description></item><item><title>XNA 3D Engine - Introduction (Part 1)</title><link>http://gamecamp.no/blogs/tutorials/archive/2008/02/15/xna3dengine-introduction-part-1.aspx</link><pubDate>Fri, 15 Feb 2008 01:38:00 GMT</pubDate><guid isPermaLink="false">7ca9b034-3ad4-4aeb-9f95-4c8e81e4d749:344</guid><dc:creator>raymond</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://gamecamp.no/blogs/tutorials/rsscomments.aspx?PostID=344</wfw:commentRss><comments>http://gamecamp.no/blogs/tutorials/archive/2008/02/15/xna3dengine-introduction-part-1.aspx#comments</comments><description>&lt;span style="mso-ansi-language:en-gb;"&gt;This is the first part in a series of many, in which we&amp;#39;ll explain how to make a 3D engine in XNA from the ground up. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;We expect the reader to have some knowledge in C# and linear algebra. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Here’s what you need to be able to create games built in XNA: &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style="MARGIN-TOP:0cm;"&gt;
&lt;li class="MsoNormal" style="mso-list:l0 level1 lfo1;tab-stops:list 36.0pt;"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Any copy of Visual Studio 2005 or Visual C# 2005 Express 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="MsoNormal" style="mso-list:l0 level1 lfo1;tab-stops:list 36.0pt;"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Microsoft XNA Game Studio 2.0 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="MsoNormal" style="mso-list:l0 level1 lfo1;tab-stops:list 36.0pt;"&gt;Graphics card that supports DirectX 9.0c and Shader Model 1.1 (some ”starter kits” need Shader Model 2.0) &lt;/li&gt;&lt;/ul&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Let&amp;#39;s start by opening Visual Studio 2005 and create a new project. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Go to “Visual C#” and “XNA Game Studio 2.0”, then select ”Windows Game (2.0)” and call the project ”XNA3DEngine”. Click “Ok”. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;The first thing we’d like to do is to rename our “Game1” class to “XNA3DEngine”. You can do that from the solution explorer by right clicking on the file, and then choose “Rename”. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Next, delete the SpriteBatch field and the instantiation in “LoadContent()”. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;This is code that is generated for us but we don’t need it now. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;You can now test build your application by hitting F5. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;You’ll se a nice cornflower blue screen, isn’t that nice! &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNA3DEngineIntroductionPart1_26D8/clip_image002_2.jpg"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="213" alt="clip_image002" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNA3DEngineIntroductionPart1_26D8/clip_image002_thumb.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;The code that does this is in a method in our game class called Draw(GameTime gameTime). &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;The draw method is where all the graphics operations are taking place, and later we’ll create DrawableGameComponents that has the exactly same method. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Exit by hitting Alt+F4 and you’ll bounce back to the code. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;We can see in solution explorer that a Content folder has been made for us. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Let’s put our content there&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;Follow the link at the bottom of this tutorial to download the content&lt;/p&gt;
&lt;p&gt;Unzip it to whatever folder you like, then right click on “Content”, choose “Add” and “Existing Item”. Choose the files you downloaded and then hit the arrow button next to the “Add” button. Then click “Add As Link”. &lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNA3DEngineIntroductionPart1_26D8/clip_image004_2.jpg"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="113" alt="clip_image004" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNA3DEngineIntroductionPart1_26D8/clip_image004_thumb.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Right click on the CastleSiege.x file and verify that Build action is set to compile: &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNA3DEngineIntroductionPart1_26D8/clip_image006_2.jpg"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="94" alt="clip_image006" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNA3DEngineIntroductionPart1_26D8/clip_image006_thumb.jpg" width="129" border="0" /&gt;&lt;/a&gt; &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Now that we have added our content we need to display it. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;XNA does this amazingly easy as you are about to see. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Right click on the project in the solution explorer and click “Add”-&amp;gt;”New Item…” &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNA3DEngineIntroductionPart1_26D8/clip_image008_2.jpg"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="152" alt="clip_image008" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNA3DEngineIntroductionPart1_26D8/clip_image008_thumb.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Choose the GameComponent template, and call it “Scene.cs”. Click OK. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;This just creates a normal game component without our Draw method.&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Lets change the class definition with this: &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;FONT-FAMILY:;"&gt;public&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt; &lt;span style="COLOR:blue;"&gt;class&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;Scene&lt;/span&gt; : &lt;span style="COLOR:#2b91af;"&gt;DrawableGameComponent &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;FONT-FAMILY:;"&gt;&lt;span style="COLOR:#2b91af;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:#2b91af;FONT-FAMILY:;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Click “Class Diagram” in the Solution explorer. Right click our “Scene” class there, choose Intellisense-&amp;gt;Override members. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Expand the GameComponent class in the listbox, and choose to override the Draw and LoadContent methods and hit “OK”. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Go back to your scene class and you’ll see that the methods you selected to be overridden are implemented. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;OK, this is just meant as a teaser for what’s to come here on &lt;a href="http://www.gamecamp.no/"&gt;www.gamecamp.no&lt;/a&gt; &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;In the next part of this tutorial, we’ll look at how easy XNA can display our scene component. &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s the graphics:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:fb3a1972-4489-4e52-abe7-25a00bb07fdf:f81fd8ca-8732-4817-a1f8-b37b91f3b0a0" style="PADDING-RIGHT:0px;DISPLAY:inline;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
&lt;p&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNA3DEngineIntroductionPart1_26D8/Graphics.zip" target="_blank"&gt;Graphics.zip&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;Here’s the code so far:&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt; 
&lt;div class="wlWriterSmartContent" id="scid:fb3a1972-4489-4e52-abe7-25a00bb07fdf:142e5289-b702-45b5-b150-a89e398d1fe8" style="PADDING-RIGHT:0px;DISPLAY:inline;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
&lt;p&gt;Code - &lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNA3DEngineIntroductionPart1_26D8/XNA3DEngine.zip" target="_blank"&gt;XNA3DEngine.zip&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;See you next time, take care! &lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;img src="http://gamecamp.no/aggbug.aspx?PostID=344" width="1" height="1"&gt;</description></item><item><title>XNA 2.0 - Getting Started</title><link>http://gamecamp.no/blogs/tutorials/archive/2008/02/12/xna-2-0-getting-started.aspx</link><pubDate>Tue, 12 Feb 2008 21:01:00 GMT</pubDate><guid isPermaLink="false">7ca9b034-3ad4-4aeb-9f95-4c8e81e4d749:335</guid><dc:creator>Einar Ingebrigtsen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://gamecamp.no/blogs/tutorials/rsscomments.aspx?PostID=335</wfw:commentRss><comments>http://gamecamp.no/blogs/tutorials/archive/2008/02/12/xna-2-0-getting-started.aspx#comments</comments><description>&lt;p&gt;This tutorial is meant as a starting point for those of you who wants to try out XNA and get started with programming. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;What is XNA?     &lt;br /&gt;&lt;/strong&gt;XNA is a set of tools and runtime environment for developing games. The default programming languages supported are Visual Basic.net and C# built on top of the .net framework. It was first announced in march 2004 at the &lt;a href="http://en.wikipedia.org/wiki/Game_Developers_Conference" target="_blank"&gt;Games Developers Conference&lt;/a&gt; in San Jose, California. With XNA you can write games that can target a Windows based PC with DirectX or better and a Xbox 360. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;What do I need?     &lt;br /&gt;&lt;/strong&gt;In order for you to get started with XNA you will need a set of tools. This article will only focus on the free tools that Microsoft provides. If you need anything else, please refer to the &lt;a href="http://creators.xna.com" target="_blank"&gt;XNA Creators web-site&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;img src="http://creators.xna.com/Themes/default/images/number_sphere1.png" alt="" /&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Microsoft Visual Studio 2005 Express&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&amp;#160;&lt;/td&gt;        &lt;td&gt;         &lt;ul&gt;           &lt;li&gt;&lt;a href="http://www.microsoft.com/express/2005/download/default.aspx" target="_blank"&gt;Download and Install Visual Studio 2005 Express&lt;/a&gt;&lt;/li&gt;            &lt;li&gt;&lt;a href="http://go.microsoft.com/?linkid=7175500" target="_blank"&gt;Learn more about Visual Studio 2005&lt;/a&gt;&lt;/li&gt;         &lt;/ul&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;img src="http://creators.xna.com/Themes/default/images/number_sphere2.png" alt="" /&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Update Visual Studio 2005&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&amp;#160;&lt;/td&gt;        &lt;td&gt;         &lt;ul&gt;           &lt;li&gt;Install Visual Studio 2005 Express Editions Service Pack 1. Select &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=7B0B0339-613A-46E6-AB4D-080D4D4A8C4E&amp;amp;displaylang=en"&gt;VS80sp1-KB926749-X86-INTL.exe&lt;/a&gt; download option at the bottom.&lt;/li&gt;         &lt;/ul&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;img src="http://creators.xna.com/Themes/default/images/number_sphere3.png" alt="" /&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Install XNA Game Studio 2.0&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&amp;#160;&lt;/td&gt;        &lt;td&gt;         &lt;ul&gt;           &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=DF80D533-BA87-40B4-ABE2-1EF12EA506B7&amp;amp;displaylang=en" target="_blank"&gt;Download and install XNA Game Studio 2.0&lt;/a&gt;&lt;/li&gt;         &lt;/ul&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;img src="http://creators.xna.com/Themes/default/images/number_sphere4.png" alt="" /&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Start using XNA Game Studio 2.0&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&amp;#160;&lt;/td&gt;        &lt;td&gt;         &lt;ul&gt;           &lt;li&gt;Start XNA Game Studio 2.0 by clicking on your Start Menu, then on &lt;strong&gt;Microsoft XNA Game Studio 2.0&lt;/strong&gt;, then either &lt;strong&gt;Microsoft Visual C# 2005 Express Edition&lt;/strong&gt; or &lt;strong&gt;Microsoft Visual Studio 2005&lt;/strong&gt;. You&amp;#8217;re ready to start making games.&lt;/li&gt;         &lt;/ul&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;If you&amp;#39;re interested in connecting your Xbox 360 up and start developing games for it, please read the following article at &lt;a href="http://go.microsoft.com/fwlink/?LinkID=106135&amp;amp;clcid=0x409" target="_blank"&gt;Microsoft&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://gamecamp.no/aggbug.aspx?PostID=335" width="1" height="1"&gt;</description></item><item><title>Creating a simple XNA Camera class</title><link>http://gamecamp.no/blogs/tutorials/archive/2008/01/29/creating-a-simple-xna-camera-class.aspx</link><pubDate>Tue, 29 Jan 2008 18:18:00 GMT</pubDate><guid isPermaLink="false">7ca9b034-3ad4-4aeb-9f95-4c8e81e4d749:271</guid><dc:creator>Einar Ingebrigtsen</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://gamecamp.no/blogs/tutorials/rsscomments.aspx?PostID=271</wfw:commentRss><comments>http://gamecamp.no/blogs/tutorials/archive/2008/01/29/creating-a-simple-xna-camera-class.aspx#comments</comments><description>&lt;p&gt;Libraries such as XNA, DirectX or OpenGL provides a set of facilities for rendering different types such as polygons and objects, but they normally do not include things you are used to in a 3D game engine. The facilities missing is normally something you put together yourself, often using built math facilities in the target library and platform.&lt;/p&gt; &lt;p&gt;This tutorial is meant to be very simplistic and will only show the basics of how you can build a reusable camera class for your own projects.&lt;/p&gt; &lt;p&gt;A camera is defined as a point in 3D space the camera is located and another point in which the camera is pointing towards, in addition the camera has a vector indicating what is up in the world. With these 3 variables we can manipulate the camera as we want to. By using these variables (and a couple of others) we can calculate the matrices needed to translate the 3D world onto the screen. We need 2 matrices; a view matrix that will rotate the world according to the camera in 3D and then we need a projection matrix that will translate the 3D data to the 2D screen.&lt;/p&gt; &lt;p&gt;In XNA we have a lot of math methods to help us achieve this very easy : &lt;/p&gt; &lt;p&gt;First we need to calculate the aspect ratio of the 2D screen, we will need this to create our projection matrix.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;._aspectRatio = ((&lt;span style="color:blue;"&gt;float&lt;/span&gt;)viewport.Width) / ((&lt;span style="color:blue;"&gt;float&lt;/span&gt;)viewport.Height);&lt;/p&gt; &lt;p&gt;We take the viewports width and divide it by the height of the viewport, e.g. 640 / 480 = 1.33333...&lt;br /&gt;Then we can calculate the projection matrix by using a static method on the Matrix class : &lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;._projectionMatrix = &lt;span style="color:#2b91af;"&gt;Matrix&lt;/span&gt;.CreatePerspectiveFieldOfView(
                            &lt;span style="color:#2b91af;"&gt;MathHelper&lt;/span&gt;.ToRadians(40.0f),
                            &lt;span style="color:blue;"&gt;this&lt;/span&gt;._aspectRatio,
                            1.0f,
                            10000.0f);
&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The first argument is the field of view in radians. By using the MathHelper.ToRadians() method we can convert from angles to radians. In our example we create a field of view of 40 degrees. Then we pass in the aspect ratio we calculated. The last two arguments represents the near clipping distance and the far clipping distance. These arguments are the distance from the camera when objects/polygons are clipped. The projection matrix will most likely not change, unless you rescale the viewport or want to change the field of view or the clipping distances, so it is sufficient to do this during construction of the camera.&lt;/p&gt;
&lt;p&gt;We now have the projection matrix, we only need the view matrix in order to complete our camera. &lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;._viewMatrix = 
    &lt;span style="color:#2b91af;"&gt;Matrix&lt;/span&gt;.CreateLookAt(&lt;span style="color:blue;"&gt;this&lt;/span&gt;._position, &lt;span style="color:blue;"&gt;this&lt;/span&gt;._lookAt, &lt;span style="color:#2b91af;"&gt;Vector3&lt;/span&gt;.Up);
&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;The Matrix class provides a static method called CreateLookAt(), this method takes in the position of the camera the location where the camera is looking at and a up vector which we get from the Vector3 class since we are pretty much going for default stuff. This matrix creation should be called every time you render your scene, in case the camera has changed. &lt;/p&gt;
&lt;p&gt;All the code above assumes you have a set of properties and fields setup in your class, the entire class will look something like this : &lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Camera
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;private &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Vector3 &lt;/span&gt;_position;
    &lt;span style="color:blue;"&gt;private &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Vector3 &lt;/span&gt;_lookAt;
    &lt;span style="color:blue;"&gt;private &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Matrix &lt;/span&gt;_viewMatrix;
    &lt;span style="color:blue;"&gt;private &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Matrix &lt;/span&gt;_projectionMatrix;
    &lt;span style="color:blue;"&gt;private float &lt;/span&gt;_aspectRatio;

    &lt;span style="color:blue;"&gt;public &lt;/span&gt;Camera(&lt;span style="color:#2b91af;"&gt;Viewport &lt;/span&gt;viewport)
    {
        &lt;span style="color:blue;"&gt;this&lt;/span&gt;._aspectRatio = ((&lt;span style="color:blue;"&gt;float&lt;/span&gt;)viewport.Width) / ((&lt;span style="color:blue;"&gt;float&lt;/span&gt;)viewport.Height);
        &lt;span style="color:blue;"&gt;this&lt;/span&gt;._projectionMatrix = &lt;span style="color:#2b91af;"&gt;Matrix&lt;/span&gt;.CreatePerspectiveFieldOfView(
                                    &lt;span style="color:#2b91af;"&gt;MathHelper&lt;/span&gt;.ToRadians(40.0f),
                                    &lt;span style="color:blue;"&gt;this&lt;/span&gt;._aspectRatio,
                                    1.0f,
                                    10000.0f);
    }

    &lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Vector3 &lt;/span&gt;Position
    {
        &lt;span style="color:blue;"&gt;get &lt;/span&gt;{ &lt;span style="color:blue;"&gt;return this&lt;/span&gt;._position; }
        &lt;span style="color:blue;"&gt;set &lt;/span&gt;{ &lt;span style="color:blue;"&gt;this&lt;/span&gt;._position = &lt;span style="color:blue;"&gt;value&lt;/span&gt;; }
    }
    &lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Vector3 &lt;/span&gt;LookAt
    {
        &lt;span style="color:blue;"&gt;get &lt;/span&gt;{ &lt;span style="color:blue;"&gt;return this&lt;/span&gt;._lookAt; }
        &lt;span style="color:blue;"&gt;set &lt;/span&gt;{ &lt;span style="color:blue;"&gt;this&lt;/span&gt;._lookAt = &lt;span style="color:blue;"&gt;value&lt;/span&gt;; }
    }
    &lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Matrix &lt;/span&gt;ViewMatrix
    {
        &lt;span style="color:blue;"&gt;get &lt;/span&gt;{ &lt;span style="color:blue;"&gt;return this&lt;/span&gt;._viewMatrix; }
    }
    &lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Matrix &lt;/span&gt;ProjectionMatrix
    {
        &lt;span style="color:blue;"&gt;get &lt;/span&gt;{ &lt;span style="color:blue;"&gt;return this&lt;/span&gt;._projectionMatrix; }
    }
    &lt;span style="color:blue;"&gt;public void &lt;/span&gt;Update()
    {
        &lt;span style="color:blue;"&gt;this&lt;/span&gt;._viewMatrix = 
            &lt;span style="color:#2b91af;"&gt;Matrix&lt;/span&gt;.CreateLookAt(&lt;span style="color:blue;"&gt;this&lt;/span&gt;._position, &lt;span style="color:blue;"&gt;this&lt;/span&gt;._lookAt, &lt;span style="color:#2b91af;"&gt;Vector3&lt;/span&gt;.Up);
    }
}
&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="code"&gt;During construction of your game you initialize your camera : &lt;br /&gt;&lt;/pre&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;._camera = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Camera&lt;/span&gt;(graphics.GraphicsDevice.Viewport);
&lt;span style="color:blue;"&gt;this&lt;/span&gt;._camera.LookAt = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Vector3&lt;/span&gt;(0.0f, 0.0f, -1.0f);
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In your Draw method you do something like this : &lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;._camera.Update();
&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;...&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;When drawing your object(s), walk through the &amp;quot;effects&amp;quot; in the mesh and set the following : &lt;/p&gt;&lt;pre class="code"&gt;effect.View = &lt;span style="color:blue;"&gt;this&lt;/span&gt;._camera.ViewMatrix;
effect.Projection = &lt;span style="color:blue;"&gt;this&lt;/span&gt;._camera.ProjectionMatrix;
&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Then you are good to go with a camera class that is easier to manipulate and have a more better feel to it than using the Matrix, MathHelper and Vector classes directly to achieve the same result. In addition you get an abstraction on top of XNA that will enable you in some ways to be able to create games that aren&amp;#39;t aware of the platform they are running on. &lt;/p&gt;&lt;img src="http://gamecamp.no/aggbug.aspx?PostID=271" width="1" height="1"&gt;</description></item><item><title>XNA Shader Programmering, Tutorial 2</title><link>http://gamecamp.no/blogs/tutorials/archive/2007/12/16/xna-shader-programming-tutorial-2.aspx</link><pubDate>Sun, 16 Dec 2007 19:57:00 GMT</pubDate><guid isPermaLink="false">7ca9b034-3ad4-4aeb-9f95-4c8e81e4d749:216</guid><dc:creator>digitalerr0r</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://gamecamp.no/blogs/tutorials/rsscomments.aspx?PostID=216</wfw:commentRss><comments>http://gamecamp.no/blogs/tutorials/archive/2007/12/16/xna-shader-programming-tutorial-2.aspx#comments</comments><description>&lt;h1 align="left"&gt;XNA Shader Programmering&lt;/h1&gt;
&lt;p align="left"&gt;Tutorial&amp;nbsp;2 av Petri T. Wilhelmsen aka. digitalerr0r&lt;br /&gt;&lt;a href="http://www.gamecamp.no/"&gt;www.gamecamp.no&lt;/a&gt;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I forrige artikkel snakket vi litt om hvordan en kunne implementere shadere i XNA, og touchet såvidt borti shader programmering. I dag skal jeg gå gjennom en annen lys algoritme, som bygger på Ambient Litghting som vi sist gikk gjennom.&lt;/p&gt;
&lt;p&gt;Jeg skal ikke fokusere på hvordan en skal hente og bruke shadere via XNA nå, så om du ikke kan dette, ta en titt på XNA Shader Programming - Tutorial 1 før du går videre med denne.&lt;/p&gt;
&lt;p&gt;Ambient lighting er ikke akuratt eye-candy, og objektene ser heller ikke veldig 3D ut. Men, det er en viktig del i mange sammenhenger, og kan se pent ut da en blander det med noe annet. Derfor skal vi her se på Diffuse Lighting, som kan gjøre scenene dine mye mer pene og dynamiske!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Føt vi starter:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For å forstå denne tutorialen her burde du ha noe kjennskap til regning med vektorer og matriser, og vært igjennom Tutorial 1 av denne serien.&lt;/p&gt;
&lt;p&gt;Kildekode: &lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNAShaderProgramming/Tutorial%202/de_ShaderTutorial_2.zip"&gt;de_ShaderTutorial_2.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Diffuse Lighting&lt;/h3&gt;
&lt;p&gt;Vi skal nå se på noe som heter Diffuse Lighting! Algoritmen bygger på ambient lighting algoritmen fra Tutorial 1:&lt;/p&gt;
&lt;p&gt;I = Aintensity * Acolor&lt;/p&gt;
&lt;p&gt;Som vi ser, så er dette et lys som ikke har noen retning, den bare er der og gir et &amp;quot;lys grunnlag&amp;quot; til alle objekter. Diffuse lighting er vel en av de enkleste lys-algortimene som støtter at lyset har en retning.&lt;/p&gt;
&lt;p&gt;Diffuse lighting algoritmen er litt tyngre, sett fra et matematiskt perspektiv, enn ambient lighting, men det er ikke noe å være redd for. Dette er egentlig veldig lett! Selv om jeg ikke er en matte-lærer av noe slag, skal jeg gjøre mitt beste på å forklare alt som står bak denne algoritmen vi nå skal se på.&lt;/p&gt;
&lt;p&gt;For å kalkulere diffuse lighting, må vi bruke to vektorer, en vektor N som er normalen til en flate, og en vektor L som er retningen på lyset. Disse to vektorene bestemmer hvor &amp;quot;mye&amp;quot; lys flaten skal reflektere. Er L paralell med N, vil den reflektere mest, og er L paralell med flaten, vil den reflektere minst. Vi kan si at vinkelen mellom L og N er med på å bestemme hvor mye flaten skal reflektere lys!&lt;/p&gt;
&lt;p&gt;&lt;img src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNAShaderProgramming/Tutorial%202/1.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;For å beregne dette kan vi bruke en lov fra vektorverdenen som heter Dot-produktet, eller skalar produktet. Denne regelen blir brukt til å bl.a finne vinkelen mellom to vektorer, og kan defineres slik: Gitt to vektorer N og L har vi&lt;/p&gt;
&lt;p&gt;N.L = |N| x |L| x cos(a)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;em&gt;der |N| er lengden av vektor N, |L| er lengden av vektor L og cos(a) er vinkelen mellom vektorene.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dette kan vi bruke i formelen vår. Men vi skal også bruke to hjelpevariabler: Dintensity og Dcolor. Dintesity skal bestemme hvor kraftig Diffuse Lightingen skal være, og Dcolor bestemmer fargen på lyset.&lt;/p&gt;
&lt;p&gt;Da har vi gått igjennom de forskjellie komponentene ved Diffuse Lighting, og kan dermed se på hele formelen.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Diffuse Lighting algoritmen:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I = Aintensity x Acolor + Dintensity x Dcolor x N.L&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Vi ser at vi fortsatt har tatt vare på Ambient Lighting formelen. Dette er fordi vi fortsatt vil at et basislys i bunn av alt, slik at alle delene av en modell kan i hvertfall ha litt lys. Så plusser vi på intensitiviteten, fargen og Dot-produktet mellom N og L for å beregne Diffuse Lighting.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Implementere shaderen&lt;/h3&gt;
&lt;p&gt;Da er det på tide å programmere selve shaderen, og få noen resultater ut på skjermen!&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;img height="412" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNAShaderProgramming/Tutorial%202/2.JPG" width="549" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Denne tutorialen baserer seg på Tutorial 1, så du kan gjerne åpne solution filen for forrige tutorial, og bygge den videre slik at den støtter Diffuse Lighting! Hvis ikke, må du lage et nytt prosjekt og skrive koden for å initialisere og hente inn shaderen vi nå skal lage.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Vi starter med å definere noen globale variabler, som skal bli satt til shaderen gjennom applikasjonen:&lt;/p&gt;&lt;pre class="code"&gt;float4x4    matWorldViewProj;
float4x4    matInverseWorld;
float4      vLightDirection;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Her har vi et par nye variabler: matInverseWorld og vLightDirection. matInverseWorld blir beregnet i applikasjonen ved å invertere matrisen til World matrisen, og brukes til å regne ut en korrekt normal. vLightDirection blir brukt til å sette retningen på lyset vårt!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;OUT er en struktur som vår Vertex shader skal returnere. Denne inneholder fortsatt posisjonen på vertexen, men i tillegg vil vi ha ut retningen på lyset L, og normalen til vertexen N. Disse blir definert som TEXCOORD0 og TEXCOORD1, som sier i hvilket register på skjermkortet vi vil lagre denne informasjonen.TEXCOORDn blir ofte brukt til å lagre litt ymse data, der n er større eller lik 0, og mindre eller lik antallet støttet av skjermkortet du programmerer mot( som oftest et sted mellom 0 og 8 ).&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;struct &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;OUT 
&lt;/span&gt;{ 
    float4 Pos: POSITION; 
    float3 L:    TEXCOORD0; 
    float3 N:    TEXCOORD1; 
}; &lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Så definerer vi selve funkjsonen for Vertex Shaderen, og som vi ser, skal den returnere OUT. Vertex shaderen tar inn to parametere som er posisjonen på- og normalen N til vertexen som passerer gjennom shaderen:&lt;/p&gt;&lt;pre class="code"&gt;OUT VertexShader( float4 Pos: POSITION, float3 N: NORMAL ) 
{ 
    OUT Out = (OUT) 0; 
    Out.Pos = mul(Pos, matWorldViewProj); 
    Out.L = normalize(vLightDirection); 
    Out.N = normalize(mul(matInverseWorld, N)); 
    &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;Out; 
} &lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;La oss dele opp koden over i små biter:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&amp;quot;Out.Pos = mul(Pos, matWorldViewProj);&amp;quot;&lt;/strong&gt; transformerer vertexposisjonen med matWorldViewProj, slik at den havner rett sted på skjermen. 
&lt;li&gt;&lt;strong&gt;&amp;quot;Out.L = normalize(vLightDirection);&amp;quot;&lt;/strong&gt; normaliserer vektoren vLightDirection. 
&lt;li&gt;&lt;strong&gt;&amp;quot;Out.N = normalize(mul(matInverseWorld, N));&amp;quot;&lt;/strong&gt; multipliserer matrisen matInverseWorld med vektoren N, og normaliserer resultatet. &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;normalize(x) er en funksjon definert av HLSL, der normalize returnerer en normalisert versjon av vektoren x.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;PixelShader skal også denne gangen bare returnere fargen på pixelen som passerer gjennom shaderen, men tar nå inn to nye verdier: L og N. L er da retningen på lyset til den gjeldende pixelen, beregnet av VertexShader, og N er normalen til Pixelen, som også beregnes av VertexShader.&lt;/p&gt;
&lt;p&gt;Vi starter med å regne ut Ambient Lighting, så Diffuse Lighting:&lt;/p&gt;&lt;pre class="code"&gt;float4 PixelShader(float3 L: TEXCOORD0, float3 N: TEXCOORD1) : COLOR 
{ &lt;/pre&gt;&lt;pre class="code"&gt;    // ambient lighting
    &lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;Ai = 0.8f; 
    float4 Ac = float4(0.075, 0.075, 0.2, 1.0); &lt;br /&gt;   &lt;br /&gt;    // diffuse lighting    
    &lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;Di = 1.0f; 
    float4 Dc = float4(1.0, 1.0, 1.0, 1.0); 
    &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;Ai * Ac + Di * Dc * saturate(dot(L, N)); 
} &lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Her ser vi noe nytt: &lt;strong&gt;saturate(dot(L, N))&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;saturate(x) er en funksjon definert av HLSL språket, der x kan være et skalar, en vektor eller en matrise. Funksjonen &amp;quot;klemmer&amp;quot; verdien x til å befinne seg i et område mellom 0 og 1.&lt;/p&gt;
&lt;p&gt;Dette betyr at vi her bergener Dot-produktet til L og N, også endre resultatet slik at det havner på en skala mellom 0 og 1 ved å passere resultatet inni saturate funksjonen.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;return Ai * Ac + Di * Dc * saturate(dot(L, N));&amp;quot;&lt;/strong&gt; bør nå ikke se helt ukjent ut?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I = Aintensity x Acolor + Dintensity x Dcolor x N.L&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Til slutt definerer vi teknikken DiffuseLight, med et pass P0. Denne kan vi da kalle fra koden for å bruke den shaderen vi nå har laget :)&lt;/p&gt;&lt;pre class="code"&gt;technique DiffuseLight 
{ 
    pass P0 
    { 
        VertexShader = compile vs_1_1 VertexShader(); 
        PixelShader = compile ps_1_1 PixelShader(); 
    } 
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Hele koden for shaderen skal nå se slik ut:&lt;/p&gt;&lt;pre class="code"&gt;float4x4    matWorldViewProj;
float4x4    matInverseWorld;
float4      vLightDirection;

&lt;span style="COLOR:blue;"&gt;struct &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;OUT
&lt;/span&gt;{
    float4 Pos: POSITION;
    float3 L:    TEXCOORD0;
    float3 N:    TEXCOORD1;
};

OUT VertexShader( float4 Pos: POSITION, float3 N: NORMAL )
{
    OUT Out = (OUT) 0;
    Out.Pos = mul(Pos, matWorldViewProj);
    
    Out.L = normalize(vLightDirection);
    Out.N = normalize(mul(matInverseWorld, N));
    
    &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;Out;
}

float4 PixelShader(float3 L: TEXCOORD0, float3 N: TEXCOORD1) : COLOR
{
    &lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;Ai = 0.8f;
    float4 Ac = float4(0.075, 0.075, 0.2, 1.0);
    &lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;Di = 1.0f;
    float4 Dc = float4(1.0, 1.0, 1.0, 1.0);
    
    &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;Ai * Ac + Di * Dc * saturate(dot(L, N));
}

technique DiffuseLight
{
    pass P0
    {
        VertexShader = compile vs_1_1 VertexShader();
        PixelShader = compile ps_1_1 PixelShader();
    }
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Bruke shaderen i applikasjonen vår&lt;/h3&gt;
&lt;p&gt;Da shaderen er ferdig, er vi klare til å bruke denne i applikasjonene/spillene vi lager. Jeg skal ikke gå gjennom hele prosessen her, fordi dette ble gjort i XNA Shader Programmering - Tutorial 1, men jeg skal gå gjennom det som er forskjellig fra Tutorial 1.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Det nye her, er egentlig bare det som ligger i Render funksjonen vår. Vi må jo sette teknikken vår effekt skal bruke:&lt;/p&gt;&lt;pre class="code"&gt;effect.CurrentTechnique = effect.Techniques[&lt;span style="COLOR:#a31515;"&gt;&amp;quot;DiffuseLight&amp;quot;&lt;/span&gt;];&lt;/pre&gt;
&lt;p&gt;Der DiffuseLight er navnet på teknikken vi lagde.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Neste steg er å sende inn de forskjellige parameterverdiene som shaderen krever for å fungere:&lt;/p&gt;&lt;pre class="code"&gt;worldMatrix = bones[mesh.ParentBone.Index] * renderMatrix;

&lt;span style="COLOR:#2b91af;"&gt;Matrix &lt;/span&gt;worldInverse = &lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt;.Invert(worldMatrix);
&lt;span style="COLOR:#2b91af;"&gt;Vector4 &lt;/span&gt;vLightDirection = &lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Vector4&lt;/span&gt;(0.0f, 0.0f, 1.0f, 1.0f);
effect.Parameters[&lt;span style="COLOR:#a31515;"&gt;&amp;quot;matWorldViewProj&amp;quot;&lt;/span&gt;].SetValue(worldMatrix * viewMatrix * projMatrix);
effect.Parameters[&lt;span style="COLOR:#a31515;"&gt;&amp;quot;matInverseWorld&amp;quot;&lt;/span&gt;].SetValue(worldInverse);
effect.Parameters[&lt;span style="COLOR:#a31515;"&gt;&amp;quot;vLightDirection&amp;quot;&lt;/span&gt;].SetValue(vLightDirection);&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;worldInverse blir beregnet av en funksjon Invert som finnes i Matrix klassen. Denne funksjonen brukes til å invertere en matrise. Vi ser her at worldInverse er det samme som den inverse av worldMatrix. Vi sender så worldInverse til matInverseWorld i shaderen.&lt;/p&gt;
&lt;p&gt;Så definerer vi en vektor som skal fortelle shaderen hvilke retning lyset har( husker du vektoren L som vi bruker i vertex shaderen? Dette er denne).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Dette er det som er nytt i Render funksjonen. Kjører du applikasjonen nå, vil du se det samme objektet som i Tutorial 1, men med en litt penere lys-setting! Nå ser det faktisk 3D ut, eller hva? ;)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Oppgaver&lt;/strong&gt;&lt;br /&gt;1. Lek deg gjerne med de forskjellige verdiene i shaderen, slik at du forstår hvilken innvirkning de forskjellige komponenetene har for lys-settingen!&lt;br /&gt;2. Gjør det mulig å sette Diffuse fargen via en parameter til shaderen( som en global variabel ).&lt;br /&gt;3. Lag to effekter i shaderen, en som bare er Ambient Lighting( se tutorial 1 ) og en som er Diffuse Lighting, slik at du selv kan velge hvilken lys-algoritme du vil bruke da du tegner objekter.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Da er vi ferdige med Tutorial 2!&lt;/p&gt;
&lt;p&gt;Som vi ser er det ikke veldig avansert å lage lys som ser ganske bra ut, eller hva?&lt;br /&gt;Nestegang skal jeg ta for meg Specular Lighting, som igjen bygger på Diffuse Lighting algoritmen vi har skrevet idag!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Spørsmål? ta kontakt via &lt;a href="mailto:petriw@gmail.com"&gt;petriw@gmail.com&lt;/a&gt; eller via forumet på &lt;a href="http://www.gamecamp.no/"&gt;www.gamecamp.no&lt;/a&gt;&lt;/p&gt;&lt;img src="http://gamecamp.no/aggbug.aspx?PostID=216" width="1" height="1"&gt;</description></item><item><title>XNA Shader Programmering, Tutorial 1</title><link>http://gamecamp.no/blogs/tutorials/archive/2007/12/07/xna-shader-programmering-tutorial-1.aspx</link><pubDate>Fri, 07 Dec 2007 11:01:00 GMT</pubDate><guid isPermaLink="false">7ca9b034-3ad4-4aeb-9f95-4c8e81e4d749:183</guid><dc:creator>digitalerr0r</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://gamecamp.no/blogs/tutorials/rsscomments.aspx?PostID=183</wfw:commentRss><comments>http://gamecamp.no/blogs/tutorials/archive/2007/12/07/xna-shader-programmering-tutorial-1.aspx#comments</comments><description>&lt;h1 align="left"&gt;XNA Shader Programmering&lt;/h1&gt;
&lt;p align="left"&gt;Tutorial 1 av Petri T. Wilhelmsen aka. digitalerr0r&lt;br /&gt;&lt;a href="http://www.gamecamp.no/"&gt;www.gamecamp.no&lt;/a&gt;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&lt;br /&gt;Velkommen til XNA Shader Programming tutorial serien! Mitt navn er Petri Wilhelmsen og jeg er et medlem av gruppen Dark Codex, som bl.a deltar på The Gathering konkuransene. Dette er min første tutorial, så feedback hadde vært veldig bra!&lt;/p&gt;
&lt;p align="left"&gt;Denne tutorial serien vil ta deg med i gjennom mange temaer innenfor shadere, samt hvordan en kan bruke dem til å lage kul grafikk og funksjonalitet ved hjelp av GPUen din. Vi starter med noe teori (ja, jeg veit det er kjedelig, men jeg skal prøve å være rask ), og går deretter over til praktisk shader programmering hvor jeg vil introdusere bl.a. noen lys algoritmer, normal mapping, parallax mapping og mye annet.&lt;br /&gt;Den første delen av tutorial serien vil ta for seg teori biten, en shader som transformerer et objekt og en en algoritme for Ambient lighting. Deretter vil jeg ta for meg mer avanserte shadere.&lt;br /&gt;Teori-delen er ikke veldig detaljert, men er skrevet for at du skal få deg en kort og enkel oversikt over de viktige emnene ved shader programmering. Jeg vil forklare emner nærmere da vi faktisk får bruk for dem, så fortvil ikke om du ikke helt henger med gjennom teorien!&lt;/p&gt;
&lt;p align="left"&gt;Den pratiske delen går steg for steg i gjennom hvordan du skal lage et prosjekt, kode shaderen, implementere og bruke den i XNA. Dette er på ingen måte den beste metoden for å gjøre dette på, men skal være forholdsvis lett å følge. 
&lt;p align="left"&gt;Forkunnskaper: Noe programmering i XNA, slik at du forstår hvordan du kan rendre ut et 3D objekt, og sette opp view og projection matriser, samt utføre regne-operasjoner med matriser. Jeg forklarer litt om dette i denne tutorialen, men ikke nok til at dere som ikke har vært borti dette før, kan forstå hva som skjer. 
&lt;p align="left"&gt;Kildekoden til tutorial 1 kan du finne her: &lt;a class="" href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNAShaderProgramming/Tutorial%201/Source.zip"&gt;Tutorial1, Kildekode&lt;/a&gt; 
&lt;h3&gt;En historie om Shaders&lt;/h3&gt;
&lt;p align="left"&gt;Før DirectX8 kom hadde GPU programmererne en fast måte å transformere pixels og vertexes på, noe som heter ”Fixed pipeline”. Dette gjorde at utviklerene ikke hadde noen mulighet for å endre hvordan disse skulle bli tranformert på, noe som gjorde at grafikken på f.eks DirectX 7.0 spillene kunne bli ganske like hverandre. DirectX 8.0 introduserte Vertex og Pixel shadere, som var en metode utviklere kunne bruke for å selv bestemme og endre hvordan vertex og pixels skulle bli tranformert, noe som ga utrolig mye fleksibilitet.&lt;/p&gt;
&lt;p align="left"&gt;Utviklerene brukte da et assembly liknende språk for å skrive shadere, noe som var vanskelig og tungvindt, og det var kun støtte for Shader Model 1.0. Dette ble forbedret da DirectX 9.0 kom, hvor vi ble introdusert til High Level Shader Language (HLSL), som erstattet assembly-programmeringen med noe som liknet mer på C-programmering. Dette gjorde shadere mye enklere å lage, lese og lære. 
&lt;p align="left"&gt;Nå nylig ble DirectX 10.0 sluppet ut, som støtter Shader Model 4.0, samt introduserer en ny shader: Geometry Shader. Ulempen er at DirectX 10.0 krever et ganske nytt skjermkort, og fungerer kun i Windows Vista. 
&lt;p align="left"&gt;XNA støtter kun Shader Model 1.0 – 3.0, men fungerer da på Windows XP, Vista og Xbox 360! 
&lt;h3&gt;Ok, hva er shaders?&lt;/h3&gt;
&lt;p align="left"&gt;Etter å ha pratet litt rundt historien om shaders, er det kanskje på tide å fortelle litt om hva shadere egentlig er? Som nevnt kan du bruke shaders til å endre måten vertexer og pixler blir tranformert og prosessert på. Vertex shaders tranformerer vertexer, og pixel shaders transformerer pixler. I figuren under ser vi hvordan et program, vertex shader og en pixel shader jobber sammen for å produsere et bilde i frame bufferen( som da tilslutt skal vises på skjermen ).&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;img src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNAShaderProgramming/Tutorial%201/1.JPG" alt="" /&gt;&lt;/p&gt;
&lt;p align="left"&gt;En ting som er viktig å huske på er at mange skjermkort ikke støtter de nyeste funksjonene i en shader. Dette bør en da ta hensyn til da en utvikler shadere, slik at en kan lage alternative metoder for eldre skjermkort, og la de nye bruke andre metoder. 
&lt;p align="left"&gt;&lt;b&gt;Vertex Shaders&lt;br /&gt;&lt;/b&gt;Vertex shader brukes da til å manipulere vertex-data, per vertex. Dette kan f.eks være en shader som skal gjøre objekter “fetere” under rendering, ved å flytte vertexene fra sin orginale posisjon til en ny posisjon langs vertexen sin normal, noe som gjøres for hver vertex på de objektene som blir tegned ved bruk av shaderen. &lt;/p&gt;
&lt;p align="left"&gt;Vertex shaderen tar input fra en vertex struktur definert i f.eks koden, og loader dette da inn I shaderen fra vertex bufferen du sender til shadere. Dette kan f.eks være Position, Color, Normal og Tangent. Jeg vil introdusere de forskjellige bitene i en senere tutorial.&lt;br /&gt;Vertex shaderen kan gi output for senere bruk i f.eks pixel shaderen, og fungerer enten ved at du definerer en struktur i shaderen og får vertex shader funksjonen til å returnere denne, eller ved å definere parametere med out syntaksen. Output kan f.eks være Position, Fog, Color og Texture coordinates.&lt;br /&gt;&lt;/p&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;struct &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;VS_OUTPUT
&lt;/span&gt;{
    float4 Pos: POSITION;
};&lt;/pre&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:#2b91af;"&gt;VS_OUTPUT &lt;/span&gt;VS( float4 Pos: POSITION )
{
    &lt;span style="COLOR:#2b91af;"&gt;VS_OUTPUT &lt;/span&gt;Out = (&lt;span style="COLOR:#2b91af;"&gt;VS_OUTPUT&lt;/span&gt;) 0;
    ...
    &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;Out;
}&lt;/pre&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:green;"&gt;// eller..&lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:green;"&gt;
&lt;/span&gt;float3 VS(&lt;span style="COLOR:blue;"&gt;out &lt;/span&gt;float2 tex : TEXCOORD0) : POSITION
{
      tex = float2(1.0, 1.0);
      &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;float3(0.0, 1.0, 0.0);
}&lt;/pre&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;&lt;b&gt;Pixel Shaders&lt;br /&gt;&lt;/b&gt;Pixel shaderen manipulerer pixelene til et objekt som blir sendt I gjennom shaderen. Dette kan f.eks være et objekt vi ønsker å beregne en per pixel lys algoritme på. Pixel shaderen henter data fra vertex shaderns output verdier, som position, normals, color og texture coordinates. Input til pixel shaderen kan f.eks være posisjon til pixelen( x,y ), color, texture coordinates osv.&lt;/p&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;float4 PS(&lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;vPos : VPOS, float2 tex : TEXCOORD0) : COLOR
{
      ...
      &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;float4(1.0f, 0.3f, 0.7f, 1.0f);
}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;Pixel shaders kan bare ha to verdier som output, og det er Color og Depth. Color forteller hvilken farge pixelen har, og depth er en ting vi kommer tilbake til litt senere. 
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;HLSL&lt;/h3&gt;
&lt;p align="left"&gt;&lt;b&gt;&lt;/b&gt;High Level Shading Language brukes til å programmere shadere. Ved hjelp av dette språket kan en definere variabler, funksjoner, datatyper, tester( if/else/for/do/while..) og mye annet, samt lage logikk for hvordan pixel og vertex shaderne skal fungere.&lt;br /&gt;Under har vi noen nøkkelord definert av HLSL, dette er selvfølgelig ikke alle men det viktigste er at du er klar over at det finnes mye å velge i. Da jeg introduserer nye datatyper( ol. ) senere I tutorialen, vil jeg forklare disse grundig!&lt;/p&gt;
&lt;p align="left"&gt;&lt;br /&gt;&lt;b&gt;Eksempler på lovlige datatyper i HSLS&lt;/b&gt;&lt;br /&gt;bool true eller false&lt;br /&gt;int 32-bit heltall&lt;br /&gt;half 16bit heltall&lt;br /&gt;float 32bit desimaltall&lt;br /&gt;double 64bit desimaltall&lt;/p&gt;
&lt;p align="left"&gt;&lt;br /&gt;&lt;b&gt;Eksempler på lovlige vektorer i HSLS&lt;br /&gt;&lt;/b&gt;float3 vektorTest&lt;br /&gt;float vektorTest[3]&lt;br /&gt;vector vektorTest&lt;br /&gt;float2 vektorTest&lt;br /&gt;bool3 vectorTest&lt;/p&gt;
&lt;p align="left"&gt;&lt;br /&gt;&lt;b&gt;Eksempler på lovlige matriser i HSLS&lt;br /&gt;&lt;/b&gt;float3x3 en 3x3 matrise av type float&lt;br /&gt;float2x2 en 2x2 matrise av type float&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;Vi har også en rekke med funksjoner som kan brukes I HLSL til bl.a regne operasjoner. 
&lt;p align="left"&gt;cos( x ) Returnerer cosnius til x&lt;br /&gt;sin( x) Returnerer sinus til x&lt;br /&gt;cross( a, b ) Returnerer kryssproduktet av to vektor a og b&lt;br /&gt;dot( a,b ) Returnerer dotproduktet av to vektorer a og b&lt;br /&gt;normalize( v ) Returnerer en normalisert vektor av v ( v / lengden av v )&lt;/p&gt;
&lt;p align="left"&gt;&lt;br /&gt;For en komplett liste, gå til &lt;a href="http://msdn2.microsoft.com/en-us/library/bb509611.aspx"&gt;http://msdn2.microsoft.com/en-us/library/bb509611.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p align="left"&gt;&lt;br /&gt;HLSL tilbyr en rekke med funkjonaliteter for å gjøre shader utviklingen enklere, og det er nettopp dette vi skal lære oss i denne tutorialen, så mer om dette temaet etter teori delen.&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h3&gt;Effect filer&lt;/h3&gt;
&lt;p align="left"&gt;&lt;b&gt;&lt;/b&gt;Effect filene ( .fx ) gjør bruken av HLSL enklere, og du kan samle det meste av shaderkoden i en .fx fil! Filen inneholder f.eks globale variabler, funksjoner, strukturer ( f.eks Out ), Vertex shaderen, Pixel shaderen, en eller flere teknikker med en eller flere pass, shadere, teksturer mm.&lt;br /&gt;Vi har tidligere sett kort på hvordan vi kan definere stukturer, variabler og funksjoner i en shader, og jeg vil nå forklare alt dette med teknikker og pass. En shader kan inneholde en eller flere teknikker. Hver teknikk har et unikt navn, og vi kan fra applikasjonen bestemme hvilken teknikk vi vil bruke ved å sette CurrentTechnique egenskapen til Effect.&lt;br /&gt;&lt;/p&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;effect.CurrentTechnique = effect.Techniques[&lt;span style="COLOR:#a31515;"&gt;&amp;quot;AmbientLight&amp;quot;&lt;/span&gt;];&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;&lt;br /&gt;Her sier vi at effect( som er en ferdig lastet shader ) skal bruke en teknikk med navn AmbientLight. En teknikk kan ha en eller flere pass, og vi må huske å prosessere alle passene til en teknikk om vi vil ha det resultatet vi ønsker.&lt;/p&gt;
&lt;p align="left"&gt;Dette er et eksempler på en shader som har en teknikk og et pass:&lt;br /&gt;&lt;/p&gt;
&lt;p align="left"&gt;technique Shader&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pass P0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VertexShader = compile vs_1_1 VS();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelShader = compile ps_1_1 PS();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;Dette er et eksempler på en shader som har en teknikk og to pass:&lt;/p&gt;
&lt;p align="left"&gt;technique Shader&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pass P0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VertexShader = compile vs_1_1 VS();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelShader = compile ps_1_1 PS();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;pass P1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VertexShader = compile vs_1_1 VS_Other();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelShader = compile ps_1_1 PS_Other();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;Dette er et eksempler på en shader som har to teknikker:&lt;br /&gt;&lt;/p&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;technique Shader_11
{
    pass P0
    {
        VertexShader = compile vs_1_1 VS();
        PixelShader = compile ps_1_1 PS();
    }
}

technique Shader_2a
{
    pass P0
    {
        VertexShader = compile vs_1_1 VS2();
        PixelShader = compile ps_2_a PS2();
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;Vi ser her at shaderen har to teknikker, den ene bruker f.eks Shader Model 1, mens den andre er for nyere skjemkort med støtte for Pixel Shader 2. Disse to teknikkene kan f.eks gjøre det samme, men ved bruk av forskjellig kode slik at det passer for all hardware! 
&lt;p align="left"&gt;Vi kan også sende inn teksturer til shadere, noe vi vil komme tilbake til senere! 
&lt;h3&gt;Implementering av Shadere I XNA&lt;/h3&gt;
&lt;p align="left"&gt;Heldigvis er det veldig enkelt å bruke shaderei XNA. Dette gjøres faktisk med veldig få linjer kode. Under har vi en liten liste vi kan følge for å implementere shadere:&lt;br /&gt;1. Programmer en shader&lt;br /&gt;2. Legg shaderfilen( .fx ) i f.eks “Contents”&lt;br /&gt;3. Lag en instanse av Effect klassen&lt;br /&gt;4. Initier denne instansen&lt;br /&gt;5. Velg hvilken teknikk du vil bruke i shaderen&lt;br /&gt;6. Start shaderen&lt;br /&gt;7. Sett parametere til shaderen&lt;br /&gt;8. Tegn objetet du vil skal bruke shaderen&lt;br /&gt;9. Stopp shaderen&lt;/p&gt;
&lt;p align="left"&gt;1.For å kode en shader kan vi bruke f.eks notepad, visual studio eller 3. parts programmer. Jeg bruker nVidia FX Composer 2.0 som kan lastes ned gratis: &lt;a href="http://developer.nvidia.com/object/fx_composer_home.html"&gt;http://developer.nvidia.com/object/fx_composer_home.html&lt;/a&gt; 
&lt;p align="left"&gt;2. Da shaderen er laget, kan du kopiere filen inn i prosjektet, slik at den får et asset name:&lt;br /&gt;&amp;nbsp;&lt;img src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNAShaderProgramming/Tutorial%201/5.JPG" alt="" /&gt;&lt;/p&gt;
&lt;p align="left"&gt;3. XNA Framework har en Effect klasse, som kan brukes til å laste inn effekter og kompilere dem. For å lage en instanse av Effekt klassen gjør du slik:&lt;br /&gt;&lt;/p&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:#2b91af;"&gt;Effect &lt;/span&gt;effect;&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;&lt;br /&gt;Effect er en del av “Microsoft.Xna.Framework.Graphics”, så husk å inkludere denne i prosjektet:&lt;br /&gt;&lt;/p&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;using &lt;/span&gt;Microsoft.Xna.Framework.Graphics&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;4. For å initiere shaderen kan vi bruke noe av funksjonaliteten Content gir oss. Vi kan loade shaderen fra prosjektet, eller fra en fil.&lt;br /&gt;&lt;/p&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;effect = Content.Load&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Effect&lt;/span&gt;&amp;gt;(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Shader&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;Her er &lt;span style="COLOR:#a31515;"&gt;&amp;quot;Shader&amp;quot; &lt;/span&gt;asset navnet og effect er en instanse av class Effect. 
&lt;p align="left"&gt;5. Valg av teknikk er like enkelt som alt annet, bare meld i fra til effect at du vil bruke en teknikk med gitt navn, f.eks AmbientLight.&lt;br /&gt;&lt;/p&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;effect.CurrentTechnique = effect.Techniques[&lt;span style="COLOR:#a31515;"&gt;&amp;quot;AmbientLight&amp;quot;&lt;/span&gt;];&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;Techniques gir deg tilgang til alle teknikkene i effect, og du kan sende inn en key for å hente ut en spesifikk teknikk. Dette kan gjøres ved at du tester hva slags støtte det er for shadere i GPUen, og bruke resulatet til å velge den rette shaderen for de rette grafikk-kortene. 
&lt;p align="left"&gt;6. For å starte å bruke en Effect, kaller du bare Begin() funksjonen:&lt;br /&gt;&lt;/p&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;effect.Begin();&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;7. Mange shadere har parametere, og det finnes forskjellige metoder å hente/sette de på. Vi vil i denne tutorialen kun bruke en enkel måte for å gjøre det litt lettere å følge med. Andre metoder vil bli brukt senere!&lt;br /&gt;Dette er ikke den raskeste måten å sette parametere på, men den fungerer bra:&lt;br /&gt;&lt;/p&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;effect.Parameters[&lt;span style="COLOR:#a31515;"&gt;&amp;quot;matWorldViewProj&amp;quot;&lt;/span&gt;].SetValue(&lt;br /&gt;          worldMatrix * viewMatrix * projMatrix);&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;&lt;br /&gt;&amp;quot;matWorldViewProj&amp;quot; er definert i shaderen: float4x4 matWorldViewProj; og worldMatrix * viewMatrix * projMatrix er en matrise.&lt;br /&gt;&lt;br /&gt;SetValue setter en verdi til parameteren og sender den til shaderen, mens GetValue&amp;lt;Type&amp;gt; henter en verdi fra parameteren, der Type er datatypen du vil hente ut. GetValueInt32() henter et heltall fra shaderen.&lt;/p&gt;
&lt;p align="left"&gt;8. Tegning av objekter kan bli gjort på mange forskjellige måter. I mitt eksempel, tegner jeg ut et 3D objekt hentet fra en .X fil ved å gå gjennom hver mesh og meshpart i .X filen. 
&lt;p align="left"&gt;9. For å stoppe shaderen, eller effekten, kaller du End() metoden til Effect:&lt;br /&gt;&lt;/p&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;effect.End();&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;Da er vi i gjennom de forskjellige stegene for å implementere og bruke en shader i XNA, og vi er dermed ferdig med den teoretiske delen av tutorialen! Gratulerer, du har kommet langt. 
&lt;h2&gt;Ambient Lighting Algoritmen&lt;/h2&gt;
&lt;p align="left"&gt;Alle objekter har som oftest et slags globalt basiskt minimums lys, et slags lys som bare eksisterer i rommet og treffer alle objekter fra alle kanter. Det er dette vi kaller for Ambient Lighting, og skal implementere nå!&lt;/p&gt;
&lt;p align="left"&gt;Ambient lighting er ikke noe spesielt spennende, men kan være et godt hjelpemiddel for at ikke alle objekter som ikke blir truffet av andre ”lysstråler ”skal være 100% mørke. 
&lt;p align="left"&gt;Formelen for Ambient lighting er:&lt;/p&gt;
&lt;p align="left"&gt;I = Aintensity x Acolor ( 1.1)&lt;/p&gt;
&lt;p align="left"&gt;Der I står for lys intensitiviteten, Aintensity står for intensitiviteten for Ambient lyset, og Acolor står for fargen på Ambient lyset. 
&lt;p align="left"&gt;Det er relativt enkelt å implementere denne lys algoritmen, og er derfor en god start på tutorialen J. 
&lt;p align="left"&gt;&amp;nbsp;&lt;img height="397" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNAShaderProgramming/Tutorial%201/2.JPG" width="382" alt="" /&gt;&lt;br /&gt;Dette er hva vi skal lage i dag!&lt;/p&gt;
&lt;p align="left"&gt;&lt;b&gt;Programmere selve effekten&lt;br /&gt;&lt;/b&gt;Det kan være lurt å laste ned sourcekoden, slik at du har tilgang til 3D objektene og en kildekode som fungerer, og har en referanse om du skulle ha problemer med stegne under.&lt;br /&gt;Start med å lage et nytt prosjekt i VS2005 eller VC# Express og velg Windows Game( 2.0 ) templaten under XNA Game Studio&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;img style="WIDTH:604px;HEIGHT:419px;" height="397" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNAShaderProgramming/Tutorial%201/3.JPG" width="541" alt="" /&gt;&lt;/p&gt;&lt;b&gt;&lt;/b&gt;
&lt;p align="left"&gt;Velg et ordentlig navn på prosjektet, og trykk OK. 
&lt;p align="left"&gt;Trykk F5 for å se om prosjektet kjører og at alt er greit. 
&lt;p align="left"&gt;Høyreklikk på Content, eller på den folderen du vil ha effekt filene dine liggende, velg Add-&amp;gt;New Item. Da vil et vindu komme fram, der du skal velge ”Effect File”. Gi den navnet&amp;nbsp; Shader.fx .&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;img height="374" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/XNAShaderProgramming/Tutorial%201/4.JPG" width="610" alt="" /&gt;&lt;/p&gt;
&lt;p align="left"&gt;Da vil Shader.fx komme fram under Contents. Dobbeltklikk på Shader.fx, og et default effekt dokument vil bli åpnet. Slett alt innholdet i denne, slik at vi kan begynne fra blanke ark! 
&lt;p align="left"&gt;For å lage en shader må vi være klar over hva den skal gjøre. For det første, skal vi ha en Vertex Shader som skal transformere alle vertexene basert på matWorldViewProj ( slik at objektet blir vist der vi vil at den skal bli vist, matWorldViewProj er en variabel som vi setter utenfor shaderen ). Så skal vi ha en pixel shader som vil gi ambient lighting til pixlene i objektet. 
&lt;p align="left"&gt;Vi starter med å definere en matrise som skal inneholde World*View*Projection matrisene( De som definerer hvor objektet står, hvor du ser og hvordan du ser): 
&lt;div align="left"&gt;&lt;pre class="code"&gt;float4x4 matWorldViewProj;&lt;/pre&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;Deretter trenger vi en struktur som definerer hva Vertex shaderen skal returnere av data. 
&lt;div align="left"&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;struct &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;OUT
&lt;/span&gt;{
    float4 Pos: POSITION;
};&lt;/pre&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;Her ser vi at vi lager en struktur med navnet OUT, som inneholder en variabel av type float4 med navn Pos, der ”:POSITION” forteller noe om hvilket register en vil ha verdien i. &lt;br /&gt;&lt;br /&gt;Register? Et ”lager” i skjermkortet som kan inneholde data. Skjermkortet har egne registre for posisjon, normaler, texcoord osv. Dette er noe du ikke trenger å tenke på i første omgang, bare vit at skal du ha posisjonen til et objekt, brus :POSITION.&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;Da vi har stukturen klar, kan vi begynne å skrive selve Vertex Shader logikken. Her henter vi World/Model view posisjonen til objektet, og transformerer den i forhold til matWorldViewProj. 
&lt;p align="left"&gt;&lt;br /&gt;Vi starter med å lage funksjonen VertexShader( float4 Pos: POSITION ) med returdata OUT, og parameteren Pos. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p align="left"&gt;Deretter definere vi en instanse av OUT med navn Out, og nullstiller det slik at vi ikke har noe random data. Så setter vi Out.Pos til å være lik resultatet av mul(Pos, matWorldViewProj). mul(a,b) multipliserer matrise a med en annen matrise b, og returnerer resultatet. Da vi er ferdig med å behandle/endre den dataen vi vil, kan vi returnere Out objektet for videre behandling i render pipelinen. 
&lt;div align="left"&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:#2b91af;"&gt;OUT &lt;/span&gt;VertexShader( float4 Pos: POSITION )
{
    &lt;span style="COLOR:#2b91af;"&gt;OUT &lt;/span&gt;Out = (&lt;span style="COLOR:#2b91af;"&gt;OUT&lt;/span&gt;) 0;
    Out.Pos = mul(Pos, matWorldViewProj);
    &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;Out;
}&lt;/pre&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;Deretter lager vi logikken for Pixel shaderen. Vi starter med å lage funkjsonen PixelShader() : COLOR med returtype float4. ”: COLOR” gjør så vi behandler returdata fra denne funksjonen som en COLOR verdi. 
&lt;div align="left"&gt;&lt;pre class="code"&gt;float4 PixelShader() : COLOR
{
    &lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;Ai = 0.8f;
    float4 Ac = float4(0.075, 0.075, 0.2, 1.0);
    
    &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;Ai * Ac;
}&lt;/pre&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;Innholdet til pixelshaderen er ganske rett fram, vi definerer intensitiviteten til A i float Ai = 0.8f; og fargen til A i Ac = float4(0.075, 0.075, 0.2, 1.0);. Ac tilsvarer en ganske mørk lilla farge. Da variabelene er definert, returnerer vi Ai * Ac slik at vi får den fargen og intensitiviteten på ambient lyset vi vil ha. Legg merke til at vi returnerer en verdi som følger formelen for Ambient Lighting( 1.1 ). Ai brukes til å velge ”styrken” på fargen, mens Ac bestemmer hvilken farge objektet skal få. 
&lt;p align="left"&gt;Fordi vi lager en effektfil, må vi ha en teknikk med minst et pass. Denne kodebiten gjør ikke mye annet enn å definere en teknikk med navnet AmbientLight, som inneholder et pass P0. Deretter setter vi at denne effektfilens VertexShader ligger i funksjonen VertexShader(), og PixelShaderen ligger i PixelShader(). compile vs_1_1 og compile ps_1_1 kompilerer koden i shaderen med støtte for vertex shader 1.1 og pixel shader 1.1. 
&lt;p align="left"&gt;technique AmbientLight&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pass P0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VertexShader = compile vs_1_1 VertexShader();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelShader = compile ps_1_1 PixelShader();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;
&lt;p align="left"&gt;Da har vi endelig fått skrevet shaderen vår, og mangler da bare å implementere denne til XNA og bruke den! Jeg kommer ikke til å forklare hvordan matriser og hvordan tegning av et 3D objekt fungerer i detalj, så hvis du ikke forstår hva som står her, burde du lese litt om dette. 
&lt;p align="left"&gt;Dobbeltklikk på Game1.cs og lag en instanse av Effect med navn effect.&lt;br /&gt;Skriv dette der du definerer dine variabler for klassen: &lt;/p&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:#2b91af;"&gt;Effect &lt;/span&gt;effect;&lt;/pre&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;Vi trenger også noen hjelpevariabler slik at vi kan sette opp en view, world og projection matrise:&lt;/p&gt;
&lt;p align="left"&gt;&lt;br /&gt;Skriv inn dette over &lt;span style="COLOR:#2b91af;"&gt;Effect &lt;/span&gt;effect;&lt;strong&gt; :&lt;br /&gt;&lt;/p&gt;&lt;/strong&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;width, height;
&lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;x = 0, y = 0;
&lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;zHeight = 15.0f;
&lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;moveObject = 0;&lt;/pre&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;Så kan vi definere matrisene våre:&lt;br /&gt;&lt;/p&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:#2b91af;"&gt;Matrix &lt;/span&gt;renderMatrix, objectMatrix, worldMatrix, viewMatrix, projMatrix;
&lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt;[] bones;&lt;/pre&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;Og 3D objektet vårt:&lt;br /&gt;&lt;/p&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:#2b91af;"&gt;Model &lt;/span&gt;m_Model;&lt;/pre&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;Koden skal så langt se slik ut: 
&lt;div align="left"&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;width, height;
&lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;x = 0, y = 0;
&lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;zHeight = 15.0f;
&lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;moveObject = 0;

&lt;span style="COLOR:#2b91af;"&gt;GraphicsDeviceManager &lt;/span&gt;graphics;
&lt;span style="COLOR:#2b91af;"&gt;SpriteBatch &lt;/span&gt;spriteBatch;

&lt;span style="COLOR:green;"&gt;// 3D Object
&lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Model &lt;/span&gt;m_Model;

&lt;span style="COLOR:#2b91af;"&gt;Effect &lt;/span&gt;effect;

&lt;span style="COLOR:green;"&gt;// Matrices
&lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Matrix &lt;/span&gt;renderMatrix, objectMatrix, worldMatrix, viewMatrix, projMatrix;
&lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt;[] bones;&lt;/pre&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;Så må vi nullstille modell objektet vårt i konstruktoren.&lt;br /&gt;Legg til &lt;b&gt;m_Model = null; i &lt;/b&gt;konstruktoren:&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;public &lt;/span&gt;Game1()
{
    graphics = &lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;GraphicsDeviceManager&lt;/span&gt;(&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;);
    Content.RootDirectory = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;Content&amp;quot;&lt;/span&gt;;
    m_Model = &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;;
}&lt;/pre&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;Så går vi videre til Initialize funksjonen, hvor vi først henter dimensjonen/oppløsningen på vinduet vårt, nullstiller worldMatrix, og setter en projection. Vi henter også effekt filen vår, ”Shader”, fra Content og legger den i effect slik: 
&lt;div align="left"&gt;&lt;pre class="code"&gt;effect = Content.Load&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Effect&lt;/span&gt;&amp;gt;(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Shader&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;Koden for Initialize ser slik ut:&lt;br /&gt;&lt;/p&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;protected override void &lt;/span&gt;Initialize()
{
      width = graphics.GraphicsDevice.Viewport.Width;
      height = graphics.GraphicsDevice.Viewport.Height;

      &lt;span style="COLOR:green;"&gt;// Set worldMatrix to Identity
      &lt;/span&gt;worldMatrix = &lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt;.Identity;
            
      &lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;aspectRatio = (&lt;span style="COLOR:blue;"&gt;float&lt;/span&gt;)width / (&lt;span style="COLOR:blue;"&gt;float&lt;/span&gt;)height;
      &lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;FieldOfView = (&lt;span style="COLOR:blue;"&gt;float&lt;/span&gt;)&lt;span style="COLOR:#2b91af;"&gt;Math&lt;/span&gt;.PI / 2,
                NearPlane = 1.0f, 
                FarPlane = 1000.0f;
                projMatrix = &lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt;.CreatePerspectiveFieldOfView( &lt;br /&gt;                       FieldOfView, aspectRatio, NearPlane, FarPlane );

      &lt;span style="COLOR:green;"&gt;// Load and compile our Shader into our Effect instance.
      &lt;/span&gt;effect = Content.Load&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Effect&lt;/span&gt;&amp;gt;(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Shader&amp;quot;&lt;/span&gt;);

      &lt;span style="COLOR:green;"&gt;// Vertex declaration for rendering our 3D model.
      &lt;/span&gt;graphics.GraphicsDevice.VertexDeclaration = &lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;VertexDeclaration&lt;/span&gt;(&lt;br /&gt;                           graphics.GraphicsDevice,  &lt;br /&gt;                           &lt;span style="COLOR:#2b91af;"&gt;VertexPositionNormalTexture&lt;/span&gt;.VertexElements);


      &lt;span style="COLOR:blue;"&gt;base&lt;/span&gt;.Initialize();
}&lt;/pre&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;Det viktigste her er VertexDeclaration.og Content.Load&amp;lt;Effect&amp;gt;(&amp;quot;Shader&amp;quot;); Det er her vi bestemmer hvilke data som skal bli sendt til Vertex Shaderen! Vi ser her at vi skal sende inn Vertex, Position, Normal og Texture til shaderen, noe vi henter fra 3D objekt filen. 
&lt;p align="left"&gt;Da vi har fått hentet inn shaderen vår, og satt opp matrisene, kan vi gå videre til LoadContent() funksjonen. Her loader vi 3D modellen, og setter opp diverse data for 3D modellen vår.&lt;br /&gt;&lt;br /&gt;Koden ser slik ut:&lt;/p&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;protected override void &lt;/span&gt;LoadContent()
{
      spriteBatch = &lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;SpriteBatch&lt;/span&gt;(GraphicsDevice);

      &lt;span style="COLOR:green;"&gt;// Load our 3D model and transform bones.
      &lt;/span&gt;m_Model = Content.Load&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Model&lt;/span&gt;&amp;gt;(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;dclogo__&amp;quot;&lt;/span&gt;);
      bones = &lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt;[&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.m_Model.Bones.Count];
      &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.m_Model.CopyAbsoluteBoneTransformsTo(bones);
}&lt;/pre&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;Update inneholder bare kode for å kalkulere og oppdatere viewMatrix, renderMatrix og objectMatrix( for å rotere objektet vårt) .&lt;br /&gt;Koden ser slik ut:&lt;/p&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;protected override void &lt;/span&gt;Update(&lt;span style="COLOR:#2b91af;"&gt;GameTime &lt;/span&gt;gameTime)
{
      zHeight = 80;

      &lt;span style="COLOR:blue;"&gt;float &lt;/span&gt;m = (&lt;span style="COLOR:blue;"&gt;float&lt;/span&gt;)gameTime.ElapsedGameTime.Milliseconds/1000;
      moveObject += m;

      &lt;span style="COLOR:green;"&gt;// Move our object by doing some simple matrix calculations.
      &lt;/span&gt;objectMatrix = &lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt;.CreateRotationX( moveObject / 2 )&lt;br /&gt;                     * &lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt;.CreateRotationZ(-moveObject / 4 );
           
      renderMatrix = &lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt;.CreateScale( 0.5f );
      viewMatrix   = &lt;span style="COLOR:#2b91af;"&gt;Matrix&lt;/span&gt;.CreateLookAt( &lt;br /&gt;          &lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt;(x, y, zHeight), &lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt;.Zero, &lt;span style="COLOR:#2b91af;"&gt;Vector3&lt;/span&gt;.Up );

      renderMatrix = objectMatrix * renderMatrix;

      &lt;span style="COLOR:blue;"&gt;base&lt;/span&gt;.Update(gameTime);
}&lt;/pre&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;Da er vi kommet til siste steg i denne tutorialen, og det er Draw(..) funksjonen! Her skjer det mye i Shader verdenen. 
&lt;p align="left"&gt;Koden for Draw() ser slik ut: 
&lt;div align="left"&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;protected override void &lt;/span&gt;Draw(&lt;span style="COLOR:#2b91af;"&gt;GameTime &lt;/span&gt;gameTime)
{
      graphics.GraphicsDevice.Clear(&lt;span style="COLOR:#2b91af;"&gt;Color&lt;/span&gt;.Black);


      effect.CurrentTechnique = effect.Techniques[&lt;span style="COLOR:#a31515;"&gt;&amp;quot;AmbientLight&amp;quot;&lt;/span&gt;];

      &lt;span style="COLOR:green;"&gt;// Begin our effect
      &lt;/span&gt;effect.Begin();

      &lt;span style="COLOR:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="COLOR:#2b91af;"&gt;EffectPass &lt;/span&gt;pass &lt;span style="COLOR:blue;"&gt;in &lt;/span&gt;effect.CurrentTechnique.Passes)
      {
          &lt;span style="COLOR:green;"&gt;// Begin current pass
            &lt;/span&gt;pass.Begin();

            &lt;span style="COLOR:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="COLOR:#2b91af;"&gt;ModelMesh &lt;/span&gt;mesh &lt;span style="COLOR:blue;"&gt;in &lt;/span&gt;m_Model.Meshes)
            {
                &lt;span style="COLOR:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="COLOR:#2b91af;"&gt;ModelMeshPart &lt;/span&gt;part &lt;span style="COLOR:blue;"&gt;in &lt;/span&gt;mesh.MeshParts)
                  {
                        worldMatrix = &lt;br /&gt;                             bones[mesh.ParentBone.Index]*renderMatrix;&lt;br /&gt;
                        effect.Parameters[&lt;span style="COLOR:#a31515;"&gt;&amp;quot;matWorldViewProj&amp;quot;&lt;/span&gt;].SetValue( &lt;br /&gt;                                   worldMatrix * viewMatrix * projMatrix);

                        &lt;span style="COLOR:green;"&gt;// Render our meshpart
                        &lt;/span&gt;graphics.GraphicsDevice.Vertices[0].SetSource(&lt;br /&gt;                                                     mesh.VertexBuffer,&lt;br /&gt;                                                     part.StreamOffset,&lt;br /&gt;                                                     part.VertexStride);&lt;br /&gt;
                        graphics.GraphicsDevice.Indices = mesh.IndexBuffer;&lt;br /&gt;
                        graphics.GraphicsDevice.DrawIndexedPrimitives(&lt;br /&gt;                                             &lt;span style="COLOR:#2b91af;"&gt;PrimitiveType&lt;/span&gt;.TriangleList,&lt;br /&gt;                                             part.BaseVertex, 0,&lt;br /&gt;                                             part.NumVertices,&lt;br /&gt;                                             part.StartIndex,&lt;br /&gt;                                             part.PrimitiveCount);
                }
           }

           &lt;span style="COLOR:green;"&gt;// Stop current pass
           &lt;/span&gt;pass.End();
      }
      &lt;span style="COLOR:green;"&gt;// Stop using this effect
      &lt;/span&gt;effect.End();

      &lt;span style="COLOR:blue;"&gt;base&lt;/span&gt;.Draw(gameTime);
}&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;Vi starter med å velge hvilken teknikk vi vil bruke, og da skal vi så klart bruke teknikken vi definerte i starten av denne delen, AmbientLight. 
&lt;p align="left"&gt;Deretter kaller vi effect.Begin() slik at vi begynner å bruke shaderen vår. 
&lt;p align="left"&gt;Så går vi i gjennom alle passene som er definert i AmbientLight teknikken( som her bare er en ). Da vi er i et pass, kan vi tegne det vi vil. Vi starter med å gå i gjennom alle delene av et 3D objekt og setter opp matrisene for den. Da matrisene er klare, kan vi sende den til shaderen, slik at objektet vil få riktig posisjon: 
&lt;div align="left"&gt;&lt;pre class="code"&gt;effect.Parameters[&lt;span style="COLOR:#a31515;"&gt;&amp;quot;matWorldViewProj&amp;quot;&lt;/span&gt;].SetValue(&lt;br /&gt;                worldMatrix * viewMatrix * projMatrix);&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;&lt;br /&gt;Her setter vi da matrisen matWorldViewProj i shaderen, til å være worldMatrix * viewMatrix * projMatrix.&lt;/p&gt;
&lt;p align="left"&gt;Da alle parameterene våre, her bare en, er satt, kan vi tegne ut selve 3D objektet!&lt;br /&gt;Denne lille kodebiten er ikke så farlig som den ser ut til å være:&lt;/p&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;graphics.GraphicsDevice.Vertices[0].SetSource(mesh.VertexBuffer,&lt;br /&gt;                          part.StreamOffset, part.VertexStride);&lt;br /&gt;
graphics.GraphicsDevice.Indices = mesh.IndexBuffer;
&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;SetSource(..) er en funksjon som brukes til å sette kilden der vi skal hente vertex streamen fra! Funksjonen er definert slik: &lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;public void &lt;/span&gt;SetSource (
            VertexBuffer vb,
            &lt;span style="COLOR:blue;"&gt;int &lt;/span&gt;offsetInBytes,
            &lt;span style="COLOR:blue;"&gt;int &lt;/span&gt;vertexStride )&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;i&gt;
&lt;p align="left"&gt;&lt;br /&gt;&lt;/i&gt;Der vb er vertex buffer kilden, offsetInBytes er hvor fra vi vil starte streamen, og vertexStride er størrelsen på elementene i vertex bufferen.&lt;i&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p align="left"&gt;Alt den gjør er da å hente ut vertex bufferen og index bufferen til det gjeldende 3D objekt delen, for så å bruke dem til å skrive ut alle vertexene: 
&lt;div align="left"&gt;&lt;pre class="code"&gt;graphics.GraphicsDevice.DrawIndexedPrimitives(&lt;span style="COLOR:#2b91af;"&gt;PrimitiveType&lt;/span&gt;.TriangleList,
                                              part.BaseVertex, 0, 
                                              part.NumVertices,
                                              part.StartIndex, 
                                              part.PrimitiveCount);&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;DrawIndexedPrimitives(..) har mange parametere, men er ganske mye enklere enn den ser ut til å være:&lt;br /&gt;&lt;/p&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;public void &lt;/span&gt;DrawIndexedPrimitives (
                       PrimitiveType primitiveType,
                       &lt;span style="COLOR:blue;"&gt;int &lt;/span&gt;baseVertex,
                       &lt;span style="COLOR:blue;"&gt;int &lt;/span&gt;minVertexIndex,
                       &lt;span style="COLOR:blue;"&gt;int &lt;/span&gt;numVertices,
                       &lt;span style="COLOR:blue;"&gt;int &lt;/span&gt;startIndex,
                       &lt;span style="COLOR:blue;"&gt;int &lt;/span&gt;primitiveCount)&lt;/pre&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p align="left"&gt;Parameterene til denne funksjonen kan du lese mer om her:&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/microsoft.xna.framework.graphics.graphicsdevice.drawindexedprimitives.aspx"&gt;http://msdn2.microsoft.com/en-us/library/microsoft.xna.framework.graphics.graphicsdevice.drawindexedprimitives.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p align="left"&gt;Vi spesifiserer at vi skal skrive ut en index buffer, ved å bruke TriangleList. 
&lt;p align="left"&gt;Da skal funksjonene være ferdig programmert! Du må huske å sette inn et 3D objekt som skal tegnes ved bruk av shaderen. Hele koden for tutorial 1 kan lastes ned her, ta gjerne en titt om det skulle være noen problemer J. 
&lt;p align="left"&gt;Phew, det var mye på en gang! Jeg håper du nå har begynt å forstå hva shadere egentlig er, og hvordan du kan implementere enkle shadere ved hjelp av XNA! Lek deg gjerne med shaderen, prøv å gi den forskjellige farger og varier Ai for å vise hvilken innvirking Ai har på Ambient Lighting algoritmen, og gjør oppgavene gitt under! 
&lt;p align="left"&gt;Nå som du har fått en god forståelse på hvordan du kan implementere og bruke shadere i XNA vil jeg i neste tutorial gå dypere inn på shader programmering. Tutorial 2 skal være om Diffuse Lighting algoritmen, slik at objektet vårt faktisk kan få en illusjon av 3D :P 
&lt;h3&gt;Oppgaver&lt;/h3&gt;
&lt;p align="left"&gt;Her er et par enkle oppgaver du kan prøve deg på:&lt;/p&gt;
&lt;p align="left"&gt;1: Endre fargen på ambient lyset slik at den er helt blå. 
&lt;p align="left"&gt;2: Prøv å set fargen på Ac til å være gitt av en global parameter i shaderen.&lt;br /&gt;(Tips: effect.Parameters[&amp;quot;AmbientColor&amp;quot;].SetValue( color );)&lt;/p&gt;
&lt;p align="left"&gt;3: Lag en ny teknikk i samme shader file, som skal bruke samme Vertex Shader, men en ny Pixel shader. Den nye pixel shaderen skal gi en helt grønn farge til objektet.&lt;br /&gt;(Tips: Lag en ny teknikk ”AmbientLight2” og bruk effect.Techniques[&amp;quot;AmbientLight2&amp;quot;];)&lt;/p&gt;
&lt;p align="left"&gt;4: Bruk Xbox kontrollen din, eller tastaturet, til å rotere objektet og/eller kameraet! 
&lt;p align="left"&gt;Har du noen spørsmål, så ta gjerne kontakt via &lt;a href="mailto:petriw@gmail.com"&gt;petriw@gmail.com&lt;/a&gt; eller via &lt;a href="http://www.gamecamp.no/"&gt;www.gamecamp.no&lt;/a&gt;. 
&lt;p align="left"&gt;Takk for meg!&lt;/p&gt;&lt;img src="http://gamecamp.no/aggbug.aspx?PostID=183" width="1" height="1"&gt;</description></item><item><title>XNA Game Components Tutorial</title><link>http://gamecamp.no/blogs/tutorials/archive/2007/09/30/XNA-game-components-tutorial.aspx</link><pubDate>Sun, 30 Sep 2007 21:41:00 GMT</pubDate><guid isPermaLink="false">7ca9b034-3ad4-4aeb-9f95-4c8e81e4d749:81</guid><dc:creator>raymond</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://gamecamp.no/blogs/tutorials/rsscomments.aspx?PostID=81</wfw:commentRss><comments>http://gamecamp.no/blogs/tutorials/archive/2007/09/30/XNA-game-components-tutorial.aspx#comments</comments><description>&lt;p class="MsoNormal"&gt;Her skal jeg prøve å forklare hva &amp;quot;Game Components&amp;quot; i XNA er.&lt;/p&gt; &lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal"&gt;La oss tenke oss at vi lager et rollespill. Hva er det vi trenger?&lt;/p&gt; &lt;p class="MsoNormal"&gt;Vi trenger bl.a en verden, en helt og våpenet til helten vår&lt;/p&gt; &lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal"&gt;Alle disse er kandidater til en &amp;quot;DrawableGameComponent&amp;quot;. Dette er en komponent som kan oppdatere seg selv og tegne seg selv på skjermen.&lt;/p&gt; &lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&amp;quot;GameComponent&amp;quot; kan bare oppdatere seg. Eksempler på det kan være kamera og bruker interaksjon (keyboard, joystick). DrawableGameComponent er en utvidelse av GameComponent objektet.&lt;/p&gt; &lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Hvordan lager man en Game Component?&lt;/b&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal"&gt;Aller først må man ha et XNA prosjekt. Så kan du høyreklikke på prosjektnavnet i Solution Explorer og velge &amp;quot;Add Item&amp;quot;. Her kan du velge &amp;quot;GameComponent&amp;quot;. &lt;/p&gt; &lt;p class="MsoNormal"&gt;Da vil du få en ferdig klasse med overrides på Initialize og Update, samt en konstruktør som gir deg &amp;quot;game&amp;quot; objektet vårt. &lt;/p&gt; &lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal"&gt;Det er ikke mulig å velge en DrawableGameComponent så skal vi ha en det må vi bare bytte navnet på klassen vi arver fra (GameComponent) til DrawableGameComponent og så legge til nye overrides.&lt;/p&gt; &lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;public&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Camera&lt;/span&gt; : Microsoft.Xna.Framework.&lt;span style="color:#2b91af;"&gt;GameComponent&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; Camera(&lt;span style="color:#2b91af;"&gt;Game&lt;/span&gt; game)&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;: &lt;span style="color:blue;"&gt;base&lt;/span&gt;(game)&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;{&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-indent:35.4pt;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-indent:35.4pt;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Initialize()&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;base&lt;/span&gt;.Initialize();&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Update(&lt;span style="color:#2b91af;"&gt;GameTime&lt;/span&gt; gameTime)&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;{&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;base&lt;/span&gt;.Update(gameTime);&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-indent:35.4pt;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof:yes;"&gt;Her har vi laget en game component som heter Camera.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof:yes;"&gt;En DrawableGameComponent vil se sånn ut:&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Initialize()&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;base&lt;/span&gt;.Initialize();&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; LoadGraphicsContent(&lt;span style="color:blue;"&gt;bool&lt;/span&gt; loadAllContent)&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;base&lt;/span&gt;.LoadGraphicsContent(loadAllContent);&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; UnloadGraphicsContent(&lt;span style="color:blue;"&gt;bool&lt;/span&gt; unloadAllContent)&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;base&lt;/span&gt;.UnloadGraphicsContent(unloadAllContent);&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Update(&lt;span style="color:#2b91af;"&gt;GameTime&lt;/span&gt; gameTime)&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;base&lt;/span&gt;.Update(gameTime);&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Draw(&lt;span style="color:#2b91af;"&gt;GameTime&lt;/span&gt; gameTime)&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;{&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;base&lt;/span&gt;.Draw(gameTime);&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="mso-no-proof:yes;"&gt;Hva/Hvor med kode?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof:yes;"&gt;I konstruktøren lager vi som regel objektene vi skal bruke I komponenten.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof:yes;"&gt;La oss si at vi skal legge til en &amp;quot;Avatar&amp;quot; komponent.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof:yes;"&gt;Så vil vi legge til et Interface vi har laget til kameraet vårt, da kan vi skrive: &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;camera = (&lt;span style="color:#2b91af;"&gt;ICamera&lt;/span&gt;)Game.Services.GetService(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;ICamera&lt;/span&gt;));&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof:yes;"&gt;Hvor &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;camera &lt;/span&gt;&lt;span style="mso-no-proof:yes;"&gt;er en klassevariabel av typen ICamera.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof:yes;"&gt;Legg merke til at jeg har lagt til camera objektet i Services til Game. Her kan du legge interfacene dine som du vil at alle komponentene dine skal få tilgang til.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="mso-no-proof:yes;"&gt;Så har vi forskjellige overrides som:&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="color:black;mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;ul style="margin-top:0cm;"&gt; &lt;li class="MsoNormal" style="mso-list:l0 level1 lfo1;tab-stops:list 36.0pt;"&gt;&lt;span style="font-size:10pt;color:blue;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;public&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Initialize()&lt;/span&gt;&lt;span style="mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p class="MsoNormal" style="margin-left:35.4pt;"&gt;&lt;span style="color:black;mso-no-proof:yes;"&gt;Her kan vi sette properties på child på objektene, som &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;camera&lt;/span&gt;&lt;span style="color:black;mso-no-proof:yes;"&gt;.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin-left:35.4pt;"&gt;&lt;span style="color:black;mso-no-proof:yes;"&gt;La oss si at vi skal fortelle kameraet vårt at den skal begynne på posisjonen 0,0,0:&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin-left:35.4pt;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;camera.Position = &lt;span style="color:#2b91af;"&gt;Vector3&lt;/span&gt;.Zero;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin-left:35.4pt;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;ul style="margin-top:0cm;"&gt; &lt;li class="MsoNormal" style="mso-list:l0 level1 lfo1;tab-stops:list 36.0pt;"&gt;&lt;span style="font-size:10pt;color:blue;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;protected&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; LoadGraphicsContent(&lt;span style="color:blue;"&gt;bool&lt;/span&gt; loadAllContent)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p class="MsoNormal" style="margin-left:35.4pt;"&gt;&lt;span style="color:black;mso-no-proof:yes;"&gt;Dette er et perfekt sted å laste inn modellen(e) våre&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;:&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; avatar = &lt;span style="color:#2b91af;"&gt;Game1&lt;/span&gt;.content.Load&amp;lt;&lt;span style="color:#2b91af;"&gt;Model&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Content\\Models\\warlock&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin-left:35.4pt;"&gt;&lt;span style="mso-no-proof:yes;"&gt;Hvor content er et statisk objekt av en ContentManager i Game1 klassen.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin-left:35.4pt;"&gt;&lt;span style="mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;ul style="margin-top:0cm;"&gt; &lt;li class="MsoNormal" style="mso-list:l0 level1 lfo1;tab-stops:list 36.0pt;"&gt;&lt;span style="font-size:10pt;color:blue;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;protected&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; UnloadGraphicsContent(&lt;span style="color:blue;"&gt;bool&lt;/span&gt; unloadAllContent)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p class="MsoNormal" style="margin-left:35.4pt;mso-layout-grid-align:none;"&gt;Close() og Dispose() objektene dine her. &lt;span style="mso-no-proof:yes;"&gt;Dette er spesielt viktig på Xbox der du har en &amp;quot;undeterministic&amp;quot; garbage collection, nemlig en veldig lat en. Xbox bruker en spesialtilpasset versjon av .NET Compact Framework.&lt;/span&gt; Se her: &lt;a href="http://blogs.msdn.com/shawnhar/archive/2007/06/29/how-to-tell-if-your-xbox-garbage-collection-is-too-slow.aspx"&gt;http://blogs.msdn.com/shawnhar/archive/2007/06/29/how-to-tell-if-your-xbox-garbage-collection-is-too-slow.aspx&lt;/a&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin-left:35.4pt;mso-layout-grid-align:none;"&gt;&amp;nbsp;&lt;/p&gt; &lt;ul style="margin-top:0cm;"&gt; &lt;li class="MsoNormal" style="mso-list:l0 level1 lfo1;tab-stops:list 36.0pt;"&gt;&lt;span style="font-size:10pt;color:blue;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;override&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Update(&lt;span style="color:#2b91af;"&gt;GameTime&lt;/span&gt; gameTime)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p class="MsoNormal" style="margin-left:35.4pt;"&gt;&lt;span style="color:black;mso-no-proof:yes;"&gt;Hvis kameraet vårt skal følge avateren kan vi oppdatere posisjonen til kameraet her.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin-left:35.4pt;"&gt;&lt;span style="mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;ul style="margin-top:0cm;"&gt; &lt;li class="MsoNormal" style="mso-list:l0 level1 lfo1;tab-stops:list 36.0pt;"&gt;&lt;span style="font-size:10pt;color:blue;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;public&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Draw(&lt;span style="color:#2b91af;"&gt;GameTime&lt;/span&gt; gameTime)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p class="MsoNormal" style="margin-left:35.4pt;"&gt;&lt;span style="mso-no-proof:yes;"&gt;Her tegner vi avataren vår på skjermen:&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin-left:35.4pt;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-indent:35.4pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;color:blue;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;if&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt; (avatar != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Matrix&lt;/span&gt;[] transforms = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Matrix&lt;/span&gt;[avatar.Bones.Count];&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;avatar.CopyAbsoluteBoneTransformsTo(transforms);&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;ModelMesh&lt;/span&gt; mesh &lt;span style="color:blue;"&gt;in&lt;/span&gt; avatar.Meshes)&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;{&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;BasicEffect&lt;/span&gt; effect &lt;span style="color:blue;"&gt;in&lt;/span&gt; mesh.Effects)&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;effect.TextureEnabled = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;effect.Texture = warlockTexture;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;effect.EnableDefaultLighting();&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (camera != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;effect.View = camera.View;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;effect.Projection = camera.Projection;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;}&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;effect.World = transforms[mesh.ParentBone.Index] * &lt;span style="color:#2b91af;"&gt;Matrix&lt;/span&gt;.CreateTranslation(position);&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;}&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;mesh.Draw();&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin-left:35.4pt;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;}&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Hvordan snakker XNA med mine game components?&lt;/b&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal"&gt;For at XNA skal kalle opp funksjonene våre som Draw() og Update(), må vi legge dem til &amp;quot;Components&amp;quot; listen i &amp;quot;Game&amp;quot; objektet, som her:&lt;/p&gt; &lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;public&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Game1&lt;/span&gt; : Microsoft.Xna.Framework.&lt;span style="color:#2b91af;"&gt;Game&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Initialize()&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;span style="mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.Components.Add(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Camera&lt;/span&gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt;));&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-ansi-language:en-gb;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;base&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;.Initialize(); &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.....&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal"&gt;Game objektet er det bare et av. &lt;/p&gt; &lt;p class="MsoNormal"&gt;&amp;quot;Game&amp;quot; inneholder bl.a. &amp;quot;Game components&amp;quot; og &amp;quot;Services&amp;quot;.&lt;/p&gt; &lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;Her lager vi objektet med det samme, så konstruktøren til &amp;quot;Camera&amp;quot; blir kalt opp først, sammen med klassens lokale variabler. &lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;Etter &lt;span style="font-size:10pt;color:blue;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;base&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;.Initialize();&lt;/span&gt; vil XNA gå gjennom alle initialize funksjonene i komponentene vi har lagt til.&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;I en DrawableGameComponent vil LoadGraphicsContent() kalles opp med det samme vi kaller opp &lt;span style="font-size:10pt;color:blue;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;base&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;.Initialize(); .&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;Det kan noen ganger være uklart i hvilken rekkefølge dette skjer og hvilke game components som blir Initiert/Oppdatert eller Tegnet først. Det beste er da å debugge og gå gjennom programmet linje for linje. Det er viktig å vite så du ikke gjør tings som å bruke et uinitialisert objekt. Derfor er det lurt å sjekke om Texture objekter o.l som brukes i &lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;protected&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Draw(&lt;span style="color:#2b91af;"&gt;GameTime&lt;/span&gt; gameTime) &lt;/span&gt;er &lt;span style="font-size:10pt;color:blue;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;null.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="font-size:10pt;color:blue;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="color:black;mso-no-proof:yes;"&gt;Du kan bruke &lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;this&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;.UpdateOrder &lt;/span&gt;&lt;span style="color:black;mso-no-proof:yes;"&gt;i komponentene for å bestemme hvem som skal oppdateres først. Komponenten med laveste verdi oppdateres først.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-no-proof:yes;"&gt;Så da er det bare å sette i gang og bygge game components! &lt;/span&gt;&lt;span style="font-family:wingdings;mso-no-proof:yes;mso-ascii-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-char-type:symbol;mso-symbol-font-family:wingdings;"&gt;&lt;span style="mso-char-type:symbol;mso-symbol-font-family:wingdings;"&gt;J&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-no-proof:yes;"&gt;Lykke til.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-no-proof:yes;"&gt;NB! Her er noen linker (på engelsk) som også forteller om XNA Game Components:&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-no-proof:yes;"&gt;&lt;a href="http://www.xnaresources.com/pages.asp?pageid=20"&gt;http://www.xnaresources.com/pages.asp?pageid=20&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-no-proof:yes;"&gt;&lt;a href="http://www.nuclex.org/articles/xna-gamecomponents-and-gameservices"&gt;http://www.nuclex.org/articles/xna-gamecomponents-and-gameservices&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align:none;"&gt;&lt;span style="mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://gamecamp.no/aggbug.aspx?PostID=81" width="1" height="1"&gt;</description></item><item><title>DirectX På Windows Mobile 5 med Visual Basic</title><link>http://gamecamp.no/blogs/tutorials/archive/2007/08/25/directx-p-229-windows-mobile-5-med-visual-basic.aspx</link><pubDate>Sat, 25 Aug 2007 19:22:00 GMT</pubDate><guid isPermaLink="false">7ca9b034-3ad4-4aeb-9f95-4c8e81e4d749:67</guid><dc:creator>raymond</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://gamecamp.no/blogs/tutorials/rsscomments.aspx?PostID=67</wfw:commentRss><comments>http://gamecamp.no/blogs/tutorials/archive/2007/08/25/directx-p-229-windows-mobile-5-med-visual-basic.aspx#comments</comments><description>&lt;span style="FONT-SIZE:10.5pt;FONT-FAMILY:&amp;#39;Trebuchet MS&amp;#39;;"&gt;&amp;nbsp; &lt;/span&gt;
&lt;p class="MsoNormal"&gt;Vi skal i denne tutorial lære hvordan du kan få fram en spinnende kube på skjermen ved bruk av DirectX på en Windows Mobile 5.0 enhet. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Siden den er myntet på nybegynneren, forventes det lite av forkunnskaper i DirectX, Visual Basic og .NET Compact Framework som vi skal programmere i. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Du trenger: &lt;/p&gt;&amp;nbsp; 
&lt;p class="MsoNormal"&gt;- Visual Studio 2005. Dette kan være standard, professional eller team system, men ikke express. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;- Windows Mobile 5 SDK for Pocket PC &lt;/p&gt;
&lt;p class="MsoNormal"&gt;- Active Sync/Mobile Device Center &lt;/p&gt;
&lt;p class="MsoNormal"&gt;- .NET Compact Framework 2.0 &lt;/p&gt;
&lt;p class="MsoNormal"&gt;- En Windows Mobile 5 enhet. &lt;/p&gt;&amp;nbsp; 
&lt;p class="MsoNormal"&gt;Du kan laste ned trial versjon av Visual Studio, .NET CF 2.0, WM 5.0 SDK og Active Sync fra: &lt;a href="http://www.msdn.com/downloads"&gt;www.msdn.com/downloads&lt;/a&gt; &lt;/p&gt;&amp;nbsp; 
&lt;p class="MsoNormal"&gt;Start Visual Studio og velg Create Project. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="FONT-SIZE:10.5pt;FONT-FAMILY:&amp;#39;Trebuchet MS&amp;#39;;"&gt;&lt;a&gt;&lt;span style="COLOR:#669966;TEXT-DECORATION:none;text-underline:none;"&gt;&lt;span style="mso-ignore:vglayout;"&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/DirectXPWindowsMobile5medVisualBasic_1494F/clip_image001_3.jpg"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="48" alt="clip_image001" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/DirectXPWindowsMobile5medVisualBasic_1494F/clip_image001_thumb.jpg" width="228" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Velg så &amp;quot;Visual Basic&amp;quot; -&amp;gt; &amp;quot;Smart Device&amp;quot; -&amp;gt; &amp;quot;Windows Mobile 5.0 Pocket PC&amp;quot; -&amp;gt; &amp;quot;Device Application&amp;quot;. Vi kan gi den navnet &amp;quot;MD3DMTutorial&amp;quot;. Trykk på &amp;quot;OK&amp;quot;. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="FONT-SIZE:10.5pt;FONT-FAMILY:&amp;#39;Trebuchet MS&amp;#39;;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="FONT-SIZE:10.5pt;FONT-FAMILY:&amp;#39;Trebuchet MS&amp;#39;;"&gt;&lt;a&gt;&lt;span style="COLOR:#669966;TEXT-DECORATION:none;text-underline:none;"&gt;&lt;span style="mso-ignore:vglayout;"&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/DirectXPWindowsMobile5medVisualBasic_1494F/clip_image003_3.jpg"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;WIDTH:323px;HEIGHT:184px;BORDER-RIGHT-WIDTH:0px;" height="141" alt="clip_image003" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/DirectXPWindowsMobile5medVisualBasic_1494F/clip_image003_thumb.jpg" width="240" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10.5pt;FONT-FAMILY:&amp;#39;Trebuchet MS&amp;#39;;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="FONT-SIZE:10.5pt;FONT-FAMILY:&amp;#39;Trebuchet MS&amp;#39;;"&gt;&lt;/span&gt;&amp;nbsp; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Merk &amp;quot;Form1.vb&amp;quot; i Solution Explorer og trykk &amp;quot;View code&amp;quot; knappen eller trykk&amp;quot;F7&amp;quot;. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Det er her vi skal skrive all koden vår. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;For at Visual Studio skal snakke med DirectX må vi legge til en &amp;quot;referanse&amp;quot; til DirectX.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Høyreklikk på &amp;quot;MD3DMTutorial&amp;quot; i Solution Explorer og velg &amp;quot;Add Reference&amp;quot;. Bla nedover i listen til du finner &amp;quot;Microsoft.WindowsMobile.DirectX&amp;quot; og trykk &amp;quot;OK&amp;quot;.&lt;/p&gt;&amp;nbsp; 
&lt;p class="MsoNormal"&gt;Så må vi velge vår utviklingsplatform, nemlig &amp;quot;Windows Mobile 5.0 Pocket PC Device&amp;quot; fra nedtrekksmenyen øverst til venstre i skjermbildet. NB! Menyen kan ligge andre steder på din kopi av Visual Studio. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="FONT-SIZE:10.5pt;FONT-FAMILY:&amp;#39;Trebuchet MS&amp;#39;;"&gt;&lt;a&gt;&lt;span style="COLOR:#669966;TEXT-DECORATION:none;text-underline:none;"&gt;&lt;span style="mso-ignore:vglayout;"&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/DirectXPWindowsMobile5medVisualBasic_1494F/clip_image004_3.jpg"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="50" alt="clip_image004" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/DirectXPWindowsMobile5medVisualBasic_1494F/clip_image004_thumb.jpg" width="240" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Tilbake til koden vår... Vi har nå en klasse som heter Form1. Skriv &amp;quot;Imports&amp;quot; setninger til DirectX så vi slipper å skrive det fulle namespacet hver gang vi skal skrive en DirectX funksjon. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Det første vi nå trenger er en Direct3D device. Koden ser nå sånn ut: &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;Imports Microsoft.WindowsMobile.DirectX&lt;/span&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;Imports&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;Microsoft.WindowsMobile.DirectX.Direct3D&lt;/span&gt;&lt;/span&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;br /&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;Public Class Form1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&lt;/span&gt;Dim _device As Direct3D.Device&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;End Class&lt;/span&gt;&lt;/span&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;/span&gt; 
&lt;p class="MsoNormal"&gt;Nå skal vi lage et D3D vindu som vi kan se på skjermen. Da må vi først lage device objektet og så fortelle vår device om hva slags vindu dette er. Vi gjør dette med å mate den med parametere i form av &amp;quot;Presentation Parameters&amp;quot;. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;La oss lage vår device: &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;Sub LagDevice()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim pp As New Direct3D.PresentParameters()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pp.Windowed = True&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pp.SwapEffect = Direct3D.SwapEffect.Discard&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _device = New Device(0, DeviceType.Default, Me, CreateFlags.None, pp)&lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _device.RenderState.Lighting = False&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;End Sub&lt;/span&gt;&lt;font face="Arial" color="#000000"&gt; &lt;/font&gt;&lt;/span&gt;
&lt;p&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;font face="Arial" color="#000000"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Her har vi valgt at vi skal ha et vanlig vindu og ikke full skjerm. Vi har også valgt å slå av DirectX sin håndtering av Lighting. Neste setning sier at når et nytt bilde blir vist på skjermen så blir det gamle fjernet. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Merk et sted i klassen og skriv &amp;quot;sub new&amp;quot; og trykk enter. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Da vil konstruktøren bli laget for deg. Etter InitializeComponent() kaller du opp metoden vår med å skrive &amp;quot;LagDevice()&amp;quot; &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Rett før &amp;quot;End Class&amp;quot; skriver du: &amp;quot;Protected Overrides OnPaint&amp;quot; og trykk &amp;quot;TAB&amp;quot;. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Da vil OnPaint metoden bli laget for deg, og skriv følgende inn i metoden så den ser sånn ut: &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _device.Clear(ClearFlags.Target, Color.Blue, 1.0F, 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _device.BeginScene()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _device.EndScene()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _device.Present()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.Invalidate()&lt;br /&gt;End Sub&lt;/span&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;I OnPaint nuller vi ut skjermbildet vårt med en blå farge, deklarerer en BeginScene() og EndScene(), og så til sist en Present() kommando. En ting å være klar over er at vi hele tiden jobber mot et &amp;quot;buffer&amp;quot; som vi ikke kan se. Det er først når vi forteller vår direct3D device at den kan presentere innholdet, at vi kan se det. Dette gjøres med _device.Present() &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Det som skal stå mellom _device.BeginScene() og&amp;nbsp;_device.EndScene() skal være koden vi bruker til å tegne kuben. Dette kommer vi tilbake til. &lt;/p&gt;&amp;nbsp; 
&lt;p class="MsoNormal"&gt;Til slutt står det Me.Invalidate(). Dette oppdaterer vinduet vårt, som betyr at vi kaller kontinuerlig opp Paint eventen vår. Da har vi vår &amp;quot;rendering loop&amp;quot; oppe og går. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Gjør det samme med &amp;quot;Protected Overrides OnPaintBackground&amp;quot;. Sett en &amp;#39; (kommentar tegn) foran MyBase.OnPaintBackground(e). Dette forhindrer programmet i å oppdatere bakgrunnen til formen. Da unngår vi flimring på skjermen. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Nå skal vi lage vår kube, som vi etterpå skal få litt fart på. Rett før &amp;quot;Sub New()&amp;quot; skriver du: &lt;/p&gt;&lt;pre&gt;&lt;span style="FONT-SIZE:12pt;COLOR:#3366ff;"&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;Dim _box As Mesh&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="FONT-SIZE:10.5pt;FONT-FAMILY:&amp;#39;Trebuchet MS&amp;#39;;"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;Etter at vi har kalt opp &amp;quot;LagDevice()&amp;quot; i konstruktøren, lager vi kube objektet vårt med: &lt;/p&gt;&lt;pre&gt;&lt;span style="FONT-SIZE:12pt;COLOR:#3366ff;"&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;_box = Mesh.Box(_device, 1, 1, 1)&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="FONT-SIZE:10.5pt;FONT-FAMILY:&amp;#39;Trebuchet MS&amp;#39;;"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;Det var det, nå har vi en kube med &amp;quot;1&amp;quot; i lengde, bredde og høyde. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;For at vi skal kunne se den, må vi instruere DirectX om hvordan vi skal se vår 3d verden. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Dette gjøres ved å sette såkalte &amp;quot;Transforms&amp;quot;, og hver av dem er en matrise. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Så hva er en matrise? &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Dette er en mengde med tall, normalt en 4x4 array. Denne skal ganges med en annen matrise for at vi skal få det resultat vi ønsker. I DirectX vil det si at hvis vi f. eks vil snu oss rundt, så ganger vi world matrix med riktig rotation matrix, for å få den nye posisjonen. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Så det fins tre Transforms som vi må sette: &lt;/p&gt;
&lt;ol&gt;
&lt;li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l2 level1 lfo1;tab-stops:list 36.0pt;"&gt;&lt;span style="FONT-SIZE:10.5pt;FONT-FAMILY:&amp;#39;Trebuchet MS&amp;#39;;"&gt;&lt;strong&gt;World Transform - Beskriver hvor kuben vår er.&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre&gt;&lt;span style="FONT-SIZE:12pt;COLOR:#3366ff;"&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;_device.Transform.World = Matrix.Identity&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="FONT-SIZE:10.5pt;FONT-FAMILY:&amp;#39;Trebuchet MS&amp;#39;;"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;Matrix.Identity betyr en matrise som ikke forandrer noe. Akkurat som 2 * 1 = 2, så er world transform matrix * Identity matrix = world transform matrix. &lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo2;tab-stops:list 36.0pt;"&gt;&lt;span style="FONT-SIZE:10.5pt;FONT-FAMILY:&amp;#39;Trebuchet MS&amp;#39;;"&gt;&lt;strong&gt;View Transform - Beskriver hvor kameraet er&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p class="MsoNormal"&gt;Heldigvis gjør DirectX dette lett for oss. Nå skal vi lage en matrise som skal beskrive hvor i verden kameraet vårt er. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;_device.Transform.View = Matrix.LookAtLH( _&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; New Vector3(0.0F, 0.0F, -3.0F), _&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; New Vector3(0.0F, 0.0F, 0.0F), _&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; New Vector3(0.0F, 1.0F, 0.0F))&lt;br /&gt;End Sub&lt;/span&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Det er en funksjon I Matrix klassen som heter LookAtLH som lager den matrisen vi trenger. Den har tre parametere, og alle er av typen Vector3. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Før vi går videre må vi forklare hva en vektor er. En Vector3 er en type som inneholder 3 floats. I 3d grafikk bruker vi hovedsakelig disse 3 verdiene til å beskrive en av to ting: &lt;/p&gt;
&lt;p class="MsoNormal"&gt;1. Vektoren har en lengde og retning, men vi vet ikke hvor i verden den er. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;2. Vektoren beskriver et spesifikt punkt i 3d universet vårt. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Vektoren er som regel i formatet (x, y, z). &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Tilbake til vår Matrix.LookAtLH funksjon, den første vektoren i parameter listen er en vektor som sier hvor kameraet befinner seg. Her har vi plassert kameraet 3 units tilbake i Z retning. Kameraet har da plassert seg lenger vekk fra kuben vår som ligger i 0,0,0. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Den neste vektoren sier hvilket punkt kameraet skal se på. Her skal kameraet se på kuben vår i 0,0,0. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Siste vektoren skal beskrive hva som er opp til kameraet vårt, og vi sier at opp er en positiv y nemlig (0,1,0). &lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo3;tab-stops:list 36.0pt;"&gt;&lt;span style="FONT-SIZE:10.5pt;FONT-FAMILY:&amp;#39;Trebuchet MS&amp;#39;;"&gt;&lt;strong&gt;Projection Transform - Hvordan vi ser verden.&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p class="MsoNormal"&gt;Denne trenger vi ikke legge så mye vekt på, bare at den gjør oss å i stand til å se vår 3d verden på skjermen, som er 2D. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;_device.Transform.Projection = _&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Matrix.PerspectiveFovLH(Math.PI / 4.0, _&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;1.0F, 1.0F, 100.0F)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Vi setter disse inn I en funksjon som vi kaller for SettMatriser:&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;Sub SettMatriser()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _device.Transform.World = Matrix.Identity&lt;/span&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _device.Transform.View = Matrix.LookAtLH( _&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;New Vector3(0.0F, 0.0F, -3.0F), _&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; New Vector3(0.0F, 0.0F, 0.0F), _&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; New Vector3(0.0F, 1.0F, 0.0F))&lt;/span&gt;&lt;/p&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _device.Transform.Projection = _&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Matrix.PerspectiveFovLH(Math.PI / 4.0, _&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;1.0F, 1.0F, 100.0F)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;End Sub&lt;/span&gt;&lt;font face="Arial" color="#000000"&gt; &lt;/font&gt;&lt;/span&gt;
&lt;p&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;font face="Arial" color="#000000"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Denne kan vi kalle opp etter LagDevice() i konstruktøren. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Nå som vi har satt matrisene våre kan vi tegne boksen vår. Mellom &lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;font color="#3366ff"&gt;_device.BeginScene()&lt;/font&gt;&lt;/span&gt; og &lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;font color="#3366ff"&gt;_device.EndScene()&lt;/font&gt;&lt;/span&gt; i OnPaint, skriver vi: &lt;/p&gt;&lt;pre&gt;&lt;span style="FONT-SIZE:12pt;COLOR:#3366ff;"&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;_box.DrawSubset(0)&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="FONT-SIZE:10.5pt;FONT-FAMILY:&amp;#39;Trebuchet MS&amp;#39;;"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;Parameteren 0 betyr bare at vi skal tegne det første &amp;quot;subset&amp;quot; i meshen. Vi har bare ett subset i vår mesh. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;For å rotere boksen, ganger vi vår world matrise med en rotasjons matrise sånn: &lt;/p&gt;&lt;span style="COLOR:#3366ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;_device.Transform.World *= Matrix.RotationY(0.02F)&lt;/span&gt;&lt;br /&gt;Dette skriver du rett før&lt;span style="FONT-SIZE:10.5pt;FONT-FAMILY:&amp;#39;Trebuchet MS&amp;#39;;"&gt; &lt;/span&gt;&lt;span style="FONT-SIZE:10.5pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="FONT-SIZE:12pt;COLOR:#3366ff;"&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;_box.DrawSubset(0)&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10.5pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="FONT-SIZE:12pt;COLOR:#3366ff;"&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;p class="MsoNormal"&gt;Nå kan du kjøre programmet med &amp;quot;F5&amp;quot; eller trykke på den grønne pilen. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;På enheten vil du nå se en spinnende hvit kube på en blå bakgrunn: &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="FONT-SIZE:10.5pt;FONT-FAMILY:&amp;#39;Trebuchet MS&amp;#39;;"&gt;&lt;a&gt;&lt;span style="COLOR:#669966;TEXT-DECORATION:none;text-underline:none;"&gt;&lt;span style="mso-ignore:vglayout;"&gt;&lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/DirectXPWindowsMobile5medVisualBasic_1494F/clip_image005_3.jpg"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="240" alt="clip_image005" src="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/DirectXPWindowsMobile5medVisualBasic_1494F/clip_image005_thumb.jpg" width="185" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;For de av dere som har erfaring med DirectX på PC&amp;#39;en vil nok si at det ikke er mye som er forskjellig her. Det er det heller ikke, og DirectX på Windows Mobile ligner mye på DirectX 8 når det gjelder funksjonalitet. Noen av den mest avanserte funksjonaliteten mangler, og det fins enda ikke støtte for pixel og vertex shaders. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;En annen forskjell er at det lønner seg å bruke &amp;quot;fixed&amp;quot; tall istedenfor floats/doubles. Dette fordi ARM prosessoren, som de fleste håndholdte kjører på, har ikke FPU (Floating Point Unit). &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Da kan du bruke Vector3Fixed og MatrixFixed i stedet for Vector3 og Matrix. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;F.eks: &lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;_device.Transform.ViewFixed = New MatrixFixed(Matrix.LookAtLH( _&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; New Vector3(0.0F, 0.0F, -3.0F), _&lt;/span&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; New Vector3(0.0F, 0.0F, 0.0F), _&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:#3366ff;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-ansi-language:en-gb;"&gt;New Vector3(0.0F, 1.0F, 0.0F)))&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Gratulerer med overstått tutorial! &lt;/p&gt;
&lt;p class="MsoNormal"&gt;Jeg har prøvd å gjøre denne tutorial så enkel som mulig med så lite kode som mulig, så&amp;nbsp;det er bl.a ikke tatt hensyn til hva som&amp;nbsp;skjer ved en&amp;nbsp;device reset og generell error handling. &lt;/p&gt;
&lt;p&gt;Prosjektet kan lastes ned her: &lt;a href="http://gamecamp.no/blogs/tutorials/WindowsLiveWriter/DirectXPWindowsMobile5medVisualBasic_1494F/MD3DMTutorial.zip"&gt;MD3DMTutorial.zip&lt;/a&gt; &lt;/p&gt;&amp;nbsp;&lt;img src="http://gamecamp.no/aggbug.aspx?PostID=67" width="1" height="1"&gt;</description></item><item><title>Roterende 3D kube for Silverlight 1.1 med bruk av C#</title><link>http://gamecamp.no/blogs/tutorials/archive/2007/07/24/roterende-3d-kube-for-silverlight-1-1-med-bruk-av-c.aspx</link><pubDate>Tue, 24 Jul 2007 21:06:00 GMT</pubDate><guid isPermaLink="false">7ca9b034-3ad4-4aeb-9f95-4c8e81e4d749:45</guid><dc:creator>Einar Ingebrigtsen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://gamecamp.no/blogs/tutorials/rsscomments.aspx?PostID=45</wfw:commentRss><comments>http://gamecamp.no/blogs/tutorials/archive/2007/07/24/roterende-3d-kube-for-silverlight-1-1-med-bruk-av-c.aspx#comments</comments><description>&lt;p&gt;Silverlight representerer en mindre del av det som er WPF, en av de tingene som ikke er inkludert i Silverlight sin definisjon av XAML er 3D. Med slippet av Silverlight 1.1 alpha og bruk av managed code som f.eks. C# kunne jeg ikke vente med å få hendene mine skitne og se på muligheten for å allikevel støtte 3D i Silverlight. Jeg ble veldig glad når jeg så at de hadde inkludert et tegneobjekt som heter Polygon, det betyr at det finnes en optimalisert måte å tegne trekanter. Hensikten med denne&amp;nbsp;tutorial er å vise hvor lite kode som skal til for å lage en veldig enkel roterende kube.&lt;/p&gt;
&lt;p&gt;Eksempelet viser en veldig enkel fremgangsmåte og involverer ikke tung geometri matte. Hvis du ser etter en løsning som er mer avansert og benytter Matrise matematikk og annen geometry matte, ta turen til Balder prosjektet som blant annet undertegnede jobber på : &lt;a href="http://www.codeplex.com/Balder"&gt;http://www.codeplex.com/Balder&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hovedloopen &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Det aller første vi har behov for er en måte å få en jevn loop i form av en event eller lignende. Ved å benytte animasjons-systemet i Silverlight kan vi gjøre dette. Vi lager oss et storyboard og hekter opp Completed eventet. I Page.xaml filen lager vi oss et Canvas og legger vårt Storyboard i dette : &lt;/p&gt;
&lt;p&gt;&amp;nbsp; 
&lt;table class="" style="BORDER-RIGHT:#e5e5e5 1px solid;BORDER-TOP:#e5e5e5 1px solid;BORDER-LEFT:#e5e5e5 1px solid;BORDER-BOTTOM:#e5e5e5 1px solid;BACKGROUND-COLOR:#f2f2f2;" cellspacing="0" cellpadding="0"&gt;

&lt;tr style="VERTICAL-ALIGN:top;LINE-HEIGHT:normal;"&gt;
&lt;td class="" style="WIDTH:40px;TEXT-ALIGN:right;"&gt;&lt;pre style="BORDER-RIGHT:#e7e7e7 1px solid;PADDING-RIGHT:2px;PADDING-LEFT:2px;FONT-SIZE:11px;PADDING-BOTTOM:2px;MARGIN:0px;COLOR:gray;PADDING-TOP:2px;FONT-FAMILY:courier new;"&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt; &lt;/pre&gt;&lt;/td&gt;
&lt;td class=""&gt;&lt;pre style="PADDING-RIGHT:2px;PADDING-LEFT:8px;PADDING-BOTTOM:2px;MARGIN:0px;PADDING-TOP:2px;"&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;  &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:maroon;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;Canvas&lt;/span&gt; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;x:Name&lt;/span&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&amp;quot;spinningCubeCanvas&amp;quot;&lt;/span&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &amp;lt;Canvas.Resources&amp;gt;&lt;br /&gt;      &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:maroon;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;Storyboard&lt;/span&gt; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;x:Name&lt;/span&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&amp;quot;spinningCubeStorybard&amp;quot;&lt;/span&gt; &lt;br /&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;Completed&lt;/span&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&amp;quot;spinningCubeCanvas_Render&amp;quot;&lt;/span&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &amp;lt;/Canvas.Resources&amp;gt;&lt;br /&gt;  &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:maroon;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;Canvas&lt;/span&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Faktisk, så er dette all XAMLen vi trenger for vårt formål; en roterende kube. Nå kommer moroa i C#.&lt;/p&gt;
&lt;p&gt;I Page_Loaded eventet må vi legge til en linje kode for å starte vårt storyboard.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;this&lt;/span&gt;.spinningCubeStorybard.Begin();&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;font face="Tahoma" size="2"&gt;Deretter trenger vi å implementere Completed eventet som vi hektet opp i XAMLen : &lt;/font&gt;&lt;font face="Tahoma" size="2"&gt; &lt;/font&gt;&lt;/pre&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;table class="" style="BORDER-RIGHT:#e5e5e5 1px solid;BORDER-TOP:#e5e5e5 1px solid;BORDER-LEFT:#e5e5e5 1px solid;BORDER-BOTTOM:#e5e5e5 1px solid;BACKGROUND-COLOR:#f2f2f2;" cellspacing="0" cellpadding="0"&gt;&lt;tr style="VERTICAL-ALIGN:top;LINE-HEIGHT:normal;"&gt;&lt;td class="" style="WIDTH:40px;TEXT-ALIGN:right;"&gt;&lt;pre style="BORDER-RIGHT:#e7e7e7 1px solid;PADDING-RIGHT:2px;PADDING-LEFT:2px;FONT-SIZE:11px;PADDING-BOTTOM:2px;MARGIN:0px;COLOR:gray;PADDING-TOP:2px;FONT-FAMILY:courier new;"&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt; &lt;/pre&gt;&lt;/td&gt;&lt;td class=""&gt;&lt;pre style="PADDING-RIGHT:2px;PADDING-LEFT:8px;PADDING-BOTTOM:2px;MARGIN:0px;PADDING-TOP:2px;"&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;public&lt;/span&gt; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;void&lt;/span&gt; spinningCubeCanvas_Render(&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;   &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;this&lt;/span&gt;.spinningCubeStorybard.Begin();&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kuben vår&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For å definere kuben, trenger vi punkter i en 3D&amp;nbsp;verden, disse kaller vi Vertices (flertallsform for Vertex). En enkel klasse kan representere dette. Klassen&amp;nbsp;nedenfor representerer den originale punktet før vi har gjort noen kalkulasjoner, den inneholder også den ferdig kalkularte utgaven som passer på en 2D skjerm.&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;table class="" style="BORDER-RIGHT:#e5e5e5 1px solid;BORDER-TOP:#e5e5e5 1px solid;BORDER-LEFT:#e5e5e5 1px solid;BORDER-BOTTOM:#e5e5e5 1px solid;BACKGROUND-COLOR:#f2f2f2;" cellspacing="0" cellpadding="0"&gt;&lt;tr style="VERTICAL-ALIGN:top;LINE-HEIGHT:normal;"&gt;&lt;td class="" style="WIDTH:40px;TEXT-ALIGN:right;"&gt;&lt;pre style="BORDER-RIGHT:#e7e7e7 1px solid;PADDING-RIGHT:2px;PADDING-LEFT:2px;FONT-SIZE:11px;PADDING-BOTTOM:2px;MARGIN:0px;COLOR:gray;PADDING-TOP:2px;FONT-FAMILY:courier new;"&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt; &lt;/pre&gt;&lt;/td&gt;&lt;td class=""&gt;&lt;pre style="PADDING-RIGHT:2px;PADDING-LEFT:8px;PADDING-BOTTOM:2px;MARGIN:0px;PADDING-TOP:2px;"&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;private&lt;/span&gt; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;class&lt;/span&gt; Vertex&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;public&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;double&lt;/span&gt; X, Y, Z;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;public&lt;/span&gt; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;double&lt;/span&gt; RotatedX, RotatedY, RotatedZ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;public&lt;/span&gt; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;int&lt;/span&gt; TranslatedX, TranslatedY;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;font face="Tahoma" size="2"&gt;Som du kan se så inneholder vertexen X,Y og Z som er koordinatet i 3D rommet, i tillegg til dette har vi den roterte utgaven etter at vi har gjort våre rotasjonen også&lt;br /&gt;inneholder den den translaterte (2D) versjonen. Når vi nå har vertex definisjonen, trenger vi noe som definerer trianglene som skal henge på koordinatene, vi kaller &lt;br /&gt;disse Faces. En Face inneholder 3 integer verdier som representerer indeksen inn i en array av vertices for objektet vi roterer.&lt;/font&gt; &lt;/pre&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;table class="" style="BORDER-RIGHT:#e5e5e5 1px solid;BORDER-TOP:#e5e5e5 1px solid;BORDER-LEFT:#e5e5e5 1px solid;BORDER-BOTTOM:#e5e5e5 1px solid;BACKGROUND-COLOR:#f2f2f2;" cellspacing="0" cellpadding="0"&gt;&lt;tr style="VERTICAL-ALIGN:top;LINE-HEIGHT:normal;"&gt;&lt;td class="" style="WIDTH:40px;TEXT-ALIGN:right;"&gt;&lt;pre style="BORDER-RIGHT:#e7e7e7 1px solid;PADDING-RIGHT:2px;PADDING-LEFT:2px;FONT-SIZE:11px;PADDING-BOTTOM:2px;MARGIN:0px;COLOR:gray;PADDING-TOP:2px;FONT-FAMILY:courier new;"&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt; &lt;/pre&gt;&lt;/td&gt;&lt;td class=""&gt;&lt;pre style="PADDING-RIGHT:2px;PADDING-LEFT:8px;PADDING-BOTTOM:2px;MARGIN:0px;PADDING-TOP:2px;"&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;private&lt;/span&gt; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;class&lt;/span&gt; Face&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;public&lt;/span&gt; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;int&lt;/span&gt; VertexA, VertexB, VertexC;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Så trenger vi en array av vertices for objectet :&amp;nbsp; &lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;table class="" style="BORDER-RIGHT:#e5e5e5 1px solid;BORDER-TOP:#e5e5e5 1px solid;BORDER-LEFT:#e5e5e5 1px solid;BORDER-BOTTOM:#e5e5e5 1px solid;BACKGROUND-COLOR:#f2f2f2;" cellspacing="0" cellpadding="0"&gt;&lt;tr style="VERTICAL-ALIGN:top;LINE-HEIGHT:normal;"&gt;&lt;td class="" style="WIDTH:40px;TEXT-ALIGN:right;"&gt;&lt;pre style="BORDER-RIGHT:#e7e7e7 1px solid;PADDING-RIGHT:2px;PADDING-LEFT:2px;FONT-SIZE:11px;PADDING-BOTTOM:2px;MARGIN:0px;COLOR:gray;PADDING-TOP:2px;FONT-FAMILY:courier new;"&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt; &lt;/pre&gt;&lt;/td&gt;&lt;td class=""&gt;&lt;pre style="PADDING-RIGHT:2px;PADDING-LEFT:8px;PADDING-BOTTOM:2px;MARGIN:0px;PADDING-TOP:2px;"&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;private&lt;/span&gt; Vertex[] _vertices &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Vertex[] {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Vertex() { X=-150, Y=-150, Z=-150},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Vertex() { X=150, Y=-150, Z=-150},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Vertex() { X=-150, Y=150, Z=-150},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Vertex() { X=150, Y=150, Z=-150},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Vertex() { X=-150, Y=-150, Z=150},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Vertex() { X=150, Y=-150, Z=150},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Vertex() { X=-150, Y=150, Z=150},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Vertex() { X=150, Y=150, Z=150},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Også trenger vi en array av faces som koples opp mot vertices : &lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;table class="" style="BORDER-RIGHT:#e5e5e5 1px solid;BORDER-TOP:#e5e5e5 1px solid;BORDER-LEFT:#e5e5e5 1px solid;BORDER-BOTTOM:#e5e5e5 1px solid;BACKGROUND-COLOR:#f2f2f2;" cellspacing="0" cellpadding="0"&gt;&lt;tr style="VERTICAL-ALIGN:top;LINE-HEIGHT:normal;"&gt;&lt;td class="" style="WIDTH:40px;TEXT-ALIGN:right;"&gt;&lt;pre style="BORDER-RIGHT:#e7e7e7 1px solid;PADDING-RIGHT:2px;PADDING-LEFT:2px;FONT-SIZE:11px;PADDING-BOTTOM:2px;MARGIN:0px;COLOR:gray;PADDING-TOP:2px;FONT-FAMILY:courier new;"&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt; &lt;/pre&gt;&lt;/td&gt;&lt;td class=""&gt;&lt;pre style="PADDING-RIGHT:2px;PADDING-LEFT:8px;PADDING-BOTTOM:2px;MARGIN:0px;PADDING-TOP:2px;"&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;private&lt;/span&gt; Face[] _faces &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Face[] {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Face() { VertexA=2, VertexB=1, VertexC=0},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Face() { VertexA=1, VertexB=2, VertexC=3},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Face() { VertexA=4, VertexB=5, VertexC=6},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Face() { VertexA=7, VertexB=6, VertexC=5},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Face() { VertexA=0, VertexB=4, VertexC=6},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Face() { VertexA=0, VertexB=6, VertexC=2},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Face() { VertexA=7, VertexB=5, VertexC=1},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Face() { VertexA=3, VertexB=7, VertexC=1},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Face() { VertexA=5, VertexB=4, VertexC=0},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Face() { VertexA=1, VertexB=5, VertexC=0},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Face() { VertexA=2, VertexB=6, VertexC=7},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Face() { VertexA=2, VertexB=7, VertexC=3},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;strong&gt;&lt;font face="Tahoma" size="3"&gt;Magien&lt;/font&gt;&lt;/strong&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font face="Tahoma"&gt;Da er vi klare til å implementere selve rotasjonen og visningen av en roterende kube. Først trenger vi å rotere alle vertices rundt X,Y og Z aksene. &lt;br /&gt;Det gjør vi veldig enkelt uten noen matrise matematikk.&lt;/font&gt;&lt;/pre&gt;
&lt;div class="csharpcode"&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;span class="lnum"&gt; &lt;table class="" style="BORDER-RIGHT:#e5e5e5 1px solid;BORDER-TOP:#e5e5e5 1px solid;BORDER-LEFT:#e5e5e5 1px solid;BORDER-BOTTOM:#e5e5e5 1px solid;BACKGROUND-COLOR:#f2f2f2;" cellspacing="0" cellpadding="0"&gt;&lt;tr style="VERTICAL-ALIGN:top;LINE-HEIGHT:normal;"&gt;&lt;td class="" style="WIDTH:40px;TEXT-ALIGN:right;"&gt;&lt;pre style="BORDER-RIGHT:#e7e7e7 1px solid;PADDING-RIGHT:2px;PADDING-LEFT:2px;FONT-SIZE:11px;PADDING-BOTTOM:2px;MARGIN:0px;COLOR:gray;PADDING-TOP:2px;FONT-FAMILY:courier new;"&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;18&lt;br /&gt;19&lt;br /&gt; &lt;/pre&gt;&lt;/td&gt;&lt;td class=""&gt;&lt;pre style="PADDING-RIGHT:2px;PADDING-LEFT:8px;PADDING-BOTTOM:2px;MARGIN:0px;PADDING-TOP:2px;"&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;// Calculate all the vertices&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;foreach&lt;/span&gt; (Vertex vertex &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;in&lt;/span&gt; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;this&lt;/span&gt;._vertices)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;// Rotate the vertex around the Z axis&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tempY1 &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; (vertex.X &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;*&lt;/span&gt; Math.Sin(&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;this&lt;/span&gt;._zRotation)) &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;+&lt;/span&gt; &lt;br /&gt;                 (vertex.Y &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;*&lt;/span&gt; Math.Cos(&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;this&lt;/span&gt;._zRotation));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tempX1 &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; (vertex.X &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;*&lt;/span&gt; Math.Cos(&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;this&lt;/span&gt;._zRotation)) &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;-&lt;/span&gt; &lt;br /&gt;                 (vertex.Y &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;*&lt;/span&gt; Math.Sin(&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;this&lt;/span&gt;._zRotation));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;// Rotate the vertex around the Y axis&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vertex.RotatedX &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; (vertex.Z &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;*&lt;/span&gt; Math.Sin(&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;this&lt;/span&gt;._yRotation)) &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;+&lt;/span&gt; &lt;br /&gt;                          (tempX1 &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;*&lt;/span&gt; Math.Cos(&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;this&lt;/span&gt;._yRotation));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tempZ1 &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; (vertex.Z &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;*&lt;/span&gt; Math.Cos(&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;this&lt;/span&gt;._yRotation)) &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;-&lt;/span&gt; &lt;br /&gt;                 (tempX1 &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;*&lt;/span&gt; Math.Sin(&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;this&lt;/span&gt;._yRotation));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;// Rotate the vertex around the X axis&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vertex.RotatedZ &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; (tempY1 &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;*&lt;/span&gt; Math.Sin(&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;this&lt;/span&gt;._xRotation)) &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;+&lt;/span&gt; &lt;br /&gt;                          (tempZ1 &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;*&lt;/span&gt; Math.Cos(&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;this&lt;/span&gt;._xRotation));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vertex.RotatedY &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; (tempY1 &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;*&lt;/span&gt; Math.Cos(&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;this&lt;/span&gt;._xRotation)) &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;-&lt;/span&gt; &lt;br /&gt;                          (tempZ1 &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;*&lt;/span&gt; Math.Sin(&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;this&lt;/span&gt;._xRotation));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;// Translate the vertex into a 2D coordinate&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vertex.TranslatedX &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; ((&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;int&lt;/span&gt;) ((vertex.RotatedX &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;*&lt;/span&gt; focalLength) &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;/&lt;/span&gt; &lt;br /&gt;                                    (vertex.RotatedZ &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;+&lt;/span&gt; zoom)))+xoffset;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vertex.TranslatedY &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; ((&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;int&lt;/span&gt;) ((vertex.RotatedY &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;*&lt;/span&gt; focalLength) &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;/&lt;/span&gt; &lt;br /&gt;                                    (vertex.RotatedZ &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;+&lt;/span&gt; zoom)))+yoffset;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;font face="Tahoma"&gt;Nå har vi våre punkter ferdig roterte og translaterte. Supert, da er vi klare til å få selve kuben tegnet. Den neste delen bruker punktene til å bygge opp triangler ved&lt;br /&gt;å basere seg på hva som er i hvert Face sin index til Vertices, deretter lager vi et Polygon for hvert face og legger til som en Visual for Silverlight å tegne. I vårt&lt;br /&gt;tilfelle legger vi til Polygons til vårt Canvas som vi definerte tidligere for vår roterende kube. Før vi legger noe til den trenger vi å fjerne det som eventuelt ligger&lt;br /&gt;ved å kalle Clear på Childrens propertien. I tillegg til dette finner vi ut hva slags triangler som ikke er synlige og sørger for å ikke legge disse til &lt;br /&gt;&lt;/font&gt;&lt;font face="Tahoma"&gt;(hidden surface removal), det gjør vi ved å gjøre et mikset produkt av de tre punktene som er involvert.&lt;/font&gt;&lt;font face="Tahoma"&gt; &lt;/font&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;font face="Tahoma"&gt;Resultatet av det miksede produktet kan også brukes i vårt tilfelle for å gi hvert polygon en farge, derav fargemagien som skjer i loopen. :)&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;table class="" style="BORDER-RIGHT:#e5e5e5 1px solid;BORDER-TOP:#e5e5e5 1px solid;BORDER-LEFT:#e5e5e5 1px solid;BORDER-BOTTOM:#e5e5e5 1px solid;BACKGROUND-COLOR:#f2f2f2;" cellspacing="0" cellpadding="0"&gt;&lt;tr style="VERTICAL-ALIGN:top;LINE-HEIGHT:normal;"&gt;&lt;td class="" style="WIDTH:40px;TEXT-ALIGN:right;"&gt;&lt;pre style="BORDER-RIGHT:#e7e7e7 1px solid;PADDING-RIGHT:2px;PADDING-LEFT:2px;FONT-SIZE:11px;PADDING-BOTTOM:2px;MARGIN:0px;COLOR:gray;PADDING-TOP:2px;FONT-FAMILY:courier new;"&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;18&lt;br /&gt;19&lt;br /&gt;20&lt;br /&gt;21&lt;br /&gt;22&lt;br /&gt;23&lt;br /&gt;24&lt;br /&gt;25&lt;br /&gt;26&lt;br /&gt;27&lt;br /&gt;28&lt;br /&gt;29&lt;br /&gt;30&lt;br /&gt;31&lt;br /&gt;32&lt;br /&gt;33&lt;br /&gt;34&lt;br /&gt;35&lt;br /&gt;36&lt;br /&gt;37&lt;br /&gt;38&lt;br /&gt;39&lt;br /&gt;40&lt;br /&gt;41&lt;br /&gt;42&lt;br /&gt;43&lt;br /&gt;44&lt;br /&gt;45&lt;br /&gt;46&lt;br /&gt;47&lt;br /&gt;48&lt;br /&gt;49&lt;br /&gt;50&lt;br /&gt;51&lt;br /&gt;52&lt;br /&gt;53&lt;br /&gt; &lt;/pre&gt;&lt;/td&gt;&lt;td class=""&gt;&lt;pre style="PADDING-RIGHT:2px;PADDING-LEFT:8px;PADDING-BOTTOM:2px;MARGIN:0px;PADDING-TOP:2px;"&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;// Create polygons for Silverlight to work with from the newly &lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;// calculated vertices&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;this&lt;/span&gt;.spinningCubeCanvas.Children.Clear();&lt;br /&gt;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;foreach&lt;/span&gt; (Face face &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;in&lt;/span&gt; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;this&lt;/span&gt;._faces)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;Vertex vertexA &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;this&lt;/span&gt;._vertices[face.VertexA];&lt;br /&gt;&amp;nbsp;&amp;nbsp;Vertex vertexB &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;this&lt;/span&gt;._vertices[face.VertexB];&lt;br /&gt;&amp;nbsp;&amp;nbsp;Vertex vertexC &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;this&lt;/span&gt;._vertices[face.VertexC];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;// Do a mixedproduct of all vertices for hidden surface removal&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;double&lt;/span&gt; mixedProduct &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; (vertexB.TranslatedX &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;-&lt;/span&gt; vertexA.TranslatedX) &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;*&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   (vertexC.TranslatedY &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;-&lt;/span&gt; vertexA.TranslatedY) &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;-&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   (vertexC.TranslatedX &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;-&lt;/span&gt; vertexA.TranslatedX) &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;*&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   (vertexB.TranslatedY &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;-&lt;/span&gt; vertexA.TranslatedY);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;bool&lt;/span&gt; visible &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; mixedProduct &amp;lt; 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;if&lt;/span&gt; (!visible)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;continue&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;// Use the mixed product for &amp;quot;shading&amp;quot;. &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;// The larger the face, the brighter it is.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;double&lt;/span&gt; shade &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; -mixedProduct; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;// *512;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;shade /= 1024;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;int&lt;/span&gt; color &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; (&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;int&lt;/span&gt;)shade;&lt;br /&gt;&amp;nbsp;&amp;nbsp;color += 128;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;if&lt;/span&gt; (color &amp;gt;= 250)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;color &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; 250;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;if&lt;/span&gt; (color &amp;lt; 30)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;color &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; 30;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;byte&lt;/span&gt; red &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; (&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;byte&lt;/span&gt;)(color &amp;gt;&amp;gt; 3);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;byte&lt;/span&gt; green &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; (&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;byte&lt;/span&gt;)(color &amp;gt;&amp;gt; 1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;byte&lt;/span&gt; blue &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; (&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;byte&lt;/span&gt;)(color);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;// Create the polygon and initialize the point and the color&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Polygon polygon &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Polygon();&lt;br /&gt;&amp;nbsp;&amp;nbsp;polygon.Points &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Point[] {&lt;br /&gt;       &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Point(vertexA.TranslatedX,vertexA.TranslatedY),&lt;br /&gt;       &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Point(vertexB.TranslatedX,vertexB.TranslatedY),&lt;br /&gt;       &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; Point(vertexC.TranslatedX,vertexC.TranslatedY)&lt;br /&gt;     };&lt;br /&gt;&amp;nbsp;&amp;nbsp;polygon.Fill &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;=&lt;/span&gt; &lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;new&lt;/span&gt; SolidColorBrush(Color.FromRgb(red, green, blue));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:courier new;BACKGROUND-COLOR:transparent;"&gt;this&lt;/span&gt;.spinningCubeCanvas.Children.Add(polygon);&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;font face="Tahoma"&gt;Det er stort sett det man trenger, nå trenger man bare å rotere den. :)&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;a href="http://www.gamecamp.no/blogs/tutorials/WindowsLiveWriter/Roterende3DkubeforSilverligh.1medbrukavC_14014/image_thumb3.png"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="222" alt="image_thumb3" src="http://www.gamecamp.no/blogs/tutorials/WindowsLiveWriter/Roterende3DkubeforSilverligh.1medbrukavC_14014/image_thumb3_thumb.png" width="240" border="0" /&gt;&lt;/a&gt; &lt;/pre&gt;&lt;/div&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;font face="Tahoma"&gt;Last ned kildekoden som er lagt til denne tutorialen for å få en fullstendig versjon.&lt;/font&gt;&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://gamecamp.no/aggbug.aspx?PostID=45" width="1" height="1"&gt;</description><enclosure url="http://gamecamp.no/blogs/tutorials/attachment/45.ashx" length="25591" type="application/x-zip-compressed" /></item></channel></rss>
