Step by Step Skeletal Animation in C++ and OpenGL, Using COLLADA PART 1

Level: Beginner to Intermediate

Introduction: Hi I am waZim and welcome to my first tutorial(s) on Skeletal Animation. This series of tutorials consists of two parts.

1)     Reading and Understanding COLLADA. (high level overview of COLLADA documents)

2)     Actual Implementations in C++ using OpenGL, of what we learn in Part 1.

These two parts are further broken down into sub categories or parts which will be explained as we progress through the tutorials.

Who should read these tutorials?

This tutorial is written for those programmers (Not artists) who want to implement Skeletal Animations in General and Skeletal Animations using COLLADA in Specific, Using C++ and OpenGL, in their (Game) Engines. It is also helpful to programmers who want to learn how to load static 3D COLLADA models in their engines;

What we will and will not cover?

In this set of tutorials I will try to explain step by step how to read Geometry, Skeleton and Animation Data from COLLADA documents and how to implement and animate your characters using skeletal animations, in C++ and OpenGL. We will not be covering EVERY aspect of COLLADA; rather we will take some assumptions which will help us to understand the COLLADA document format easily.

We will also not discuss things like shaders and FX using COLLADA.

What you need to know, to get the Most out of these tutorials?

Any-one who wants to get the most benefit out of these tutorials should have solid knowledge of programming in general and C++ programming in particular. Advanced OpenGL programming is not required although it is a plus. You should know what a vector is and what a texture coordinate is, how geometry and animation is represented, what an XML format is and so on. For the rest, I hope you will learn everything you need here.

What you need to have, to learn and read through these tutorials?

You need a C++ compiler with OpenGL Support and working drivers for OpenGL.

Some COLLADA example documents. Which you can find on www.COLLADA.org , find model bank, or in downloads section of this website (www.wazim.com).

A good Text Editor like Notepad++

Background and Motivation:

Over the years when I first started graphics programming, I was already tired of writing geometry by hand and drawing everything vertex by vertex :). Then the time came when I saw some simple demos over the internet, reading Geometry data from ASCII files in OpenGL, like .OBJ file format etc.. After some time, I wanted to animate the models so I found MD2 Demos. When I started creating my own MD2 files, it was really hard to find a robust importer for MD2 files for my own engine. In the end, I decided to forget about all those formats and read Autodesk Maya (.ma) or Autodesk Studio Max (.max) files. But reading Geometry and animation data from those two files are not recommended by the authors of those two Authoring softwares. I don’t know much about Maya .mb or .ma files but I love Studio Max and .max files and yet they are unfortunately poorly documented. And even if you start to write an exporter for any of these files it’s really hard to port your models from Maya to Max or vice versa. There is always something missing when you import those files into other software.

The solution that I found was COLLADA. COLLADA documents are cross platform because they are stored in UTF-8 format using XML schema. I think you already know something about COLLADA that is why you are here! So let’s not waste any time and jump straight to the implementation. If you want to read more about COLLADA documents then go visit (www.COLLADA.org) and keep reading the COLLADA wiki and COLLADA forums.

So after I have found COLLADA the solution to my problems I have been working with COLLADA. There are many implementations of COLLADA which are too generic, for example the first thing I saw was the COLLADA DOM which is available on COLLADA.org. And you can write your own code on top of DOM to extract all the information from COLLADA document which is loaded in DOM and export it to your Custom Format. This is the easy way to go but still you need to understand the COLLADA format and then DOM has its own problems. You might find it very hard to get what you really need and what you don’t need. What I found annoying with DOM was that it can read Texture Coordinates with (s,t) two components while can’t read (s,t,p) type of Texture coordinates which are default to Studio Max COLLADA Exporter. So at the end I decided to write my own exporter and it’s really not that hard as it seems.

When I started reading about COLLADA I was unable to find a step by step tutorial, so the purpose of this tutorial is to give you the COLLADA document format in easy to learn chunks and C++ code to implement, with step by step explanation.

Part 1:

Reading and Understanding COLLADA documents

As we have discussed in the introduction part, this tutorial is split in to two parts, first one general introduction to COLLADA documents which is irrespective of any programming language. So if you want to skip this part and directly jump to the implementation part, it is quite possible that you will find it hard to understand what is going on. So it’s highly recommended, for those who know nothing or very little about COLLADA documents, to read this part before moving to the next part.

Enough Ranting :), let’s start working.

COLLADA documents

Before we dig into COLLADA documents I would like you to download the example file which we will be using through out the tutorial. It’s available in the COLLADA Model Bank and is also shipped with COLLADA DOM. It’s called “astroBoy_walk.dae” if you can’t find this file anywhere then its available in downloads section of this tutorial’s website, and you can find it there.

Like we discussed earlier (in case you read the intro part) COLLADA documents are stored in XML format. If you open astroBoy_walk.dae, which I will call example file from now on, in your favorite text editor, you can see a root node called “COLLADA” and if your text editor supports expanding or collapsing XML nodes (if you are using Notepad++ you can set the language type to XML from the “language” menu to get XML Editing enabled) then you can click on the (-) sign in front of <COLLADA> tag to Collapse it to one line, there you will see that the whole file is Collapsed to one line and that’s all the COLLADA document is about.

Figure 1: COLLADA document in short

Within this <COLLADA> node which is the root of this .dae or .xml file, you will find many other libraries which are used for storing different types of information like <library_geometries> is used to store geometry data and <library_lights> is used to store Lights in the scene. Refer to figure 1. See it’s not rocket science 🙂 and then within those libraries you will find the actual data. For example a geometry library will have <geometry> nodes and a lights library can have <light> nodes, which means those libraries are used to store more then one lights or geometries in your scene. Now let’s analyze all of those libraries one by one by increasing importance to the tutorial and our COLLADA exporter, in their corresponding sections.

First of all let’s make things easier for us. Just like I said in the beginning we will not be discussing COLLADA documents from all aspects; rather we will be taking some assumptions, to remove complexities.

List of Assumptions:

1)     Although COLLADA documents exported from Max or Maya Should be the same but in some cases they are different. We will only talk about COLLADA document exported from Studio Max, which of course does not mean that this tutorial might not help those who work in Maya. Because I am still positive that COLLADA documents exported from Maya should be the same, if we export them with backed matrices and triangulate options checked, from the COLLADA Exporter Options dialog. But I have never worked with Maya and don’t know where my exporter might fail.

2)     The COLLADA document must have at least and at most a mesh, which means, anything in the asset’s Max file, should be attached. So we must not have more then one <mesh> in the <library_geometries> in the COLLADA document. If we are able to read one <mesh> then we can read a 10000 too.

3)     Geometry in COLLADA should be triangulated, since that’s the better (If not best) option, we can provide OpenGL, so we let the triangulation work done by Max.

4)     Later in the implementations part we will assume our Model which was exported to COLLADA document has only One Texture file.

5)     Animations in COLLADA must have at least or at most one Skeleton, with only one Root Bone (Typical). And I think that’s why we are here, to implement skeletal animation.

6)     Animation exported to COLLADA must be baked in matrices, which essentially in some cases makes 1 channel of animation and in others 16 channels of animation (Now what is channel? It should be explained later).

7)     Animations can only be valid if the channel targets the “Transform” of the targeted entity, just to keep things clear and easy. When you will bake matrices, then you will have this automatically, so don’t need to worry about that.

8)     Animations can’t have nested animations.

9)     Only Skeletal Animation is supported (No baked animation yet).

10)  Every bone in the hierarchy must be attached as effecter on the skin. In other words, it must be added to the skin.

Keeping those assumptions in mind all the times, let’s start explaining different libraries in their related sections. You might also find it easy and handy to switch to Implementation part for each section immediately, when you read that section, before you finish reading the first part completely. The link to the implementation of each section is given at the end of that section.

Reading Geometry Data from COLLADA document

<library_geometries>

This is by far the most important library of all of the COLLADA libraries; if you have a character to animate we need its geometric data, which is provided in <library_geometries>.

This library contains <geometry> type nodes which contain separate geometries in the scene, keep in mind COLLADA is not just an asset file format rather you can put a complete scene and many scenes in them. Like we assumed we are only concerned with one <geometry> node which will have one <mesh> node. So if so far you have found that node lets analyze it.

<mesh>

Mesh is the node where we will find our geometry data. If you try to analyze the node you will see further at least 1 or 2 <source> nodes, which, depending on its type, gives information about Vertices, Normals and Texture Coordinates etc. In the example file (if you have downloaded from COLLADA.org, it will not have backed animation in it, so you have to import it in Max and then export it back with Backed Matrices and “triangulate” checkbox checked as shown in figure 2), you will find 3 <source> nodes and we are lucky that each source node is defined in the same way in COLLADA.

Figure 2: Export Options from COLLADAMax

<souce>

Remember all these XML nodes discussed so far have an ID associated with them which is used for locating the Node in COLLADA document when referred from any place. And Source Nodes are not any exception to that. Now <source> can have many children nodes but the most important ones are <float_array> or <NAME_array> and <technique_common>.

As the names suggests <float_array> contains floats which can be used for different purposes which are described by <technique_common> of that source and the difference between <float_array> and <NAME_array> is that, the former contains floats and the later contains strings.

Now we use the <technique_common>’s <accessor> child node to specify what kind of data is in those arrays <float_array>, <NAME_array> or any other type of many types of arrays. <accessor> node has a “source” attribute which says “What kind of “array” are we talking about?”. And a “count” attribute says how many elements we have in the “array”. The “stride” attribute says after how many values the next element starts.

I hope I am not talking Chinese but let’s explain it with a figure and example COLLADA source.

<source id="vertices_source" name="Vertices">

<float_array id="values" count="6"> 0.3 0.5 0.7 0.2 0.4 0.6 </float_array>

<technique_common>

<accessor source="#values" count="2" stride="3">

<param name="X" type="float"/>

<param name="Y" type="float"/>

<param name="Z" type="float"/>

</accessor>

</technique_common>

</source>
Figure 3: Structure of a source

As you can see in figure 3, there are float array’s (count=”6″) values which are 3 (x, y, z) float components of <accessor>’s (count=”2″) number of vertices. And when we have 3 <param> child nodes in <accessor> then we have 3 (x, y, z) components in each Vertex (3D vertex) (it can also be 3 Components of Normal, or 3 Components of Texture Coordinates). This information is very important since I can’t find it in COLLADA Specifications and it took me a lot of time to understand this concept (may be I am dumb) 🙁 So if you don’t understand, please read again.

In short, this source says, “I have 2 vertices with 3 components each, which are saved in <floats_array> as 6 float values”. Components are called “X”, “Y” and “Z”. And they are float type values. If we had a <source> which saves texture coordinates, then those components would be “S”, “T” and “P”.

So that’s all a source is about. Now as we discussed before there are 3 <source> nodes in the example COLLADA document. And as you might have guessed already, the other two sources are for Normals and Texture Coordinates, if you have exported your Model with other attributes then you will have more <source> nodes, like bitangents and tangets etc.

Now when we are able to decode <source>s, we still can’t just decide on the order of those sources which one is Vertices and which one is Normals etc. we have to read one other child of <mesh> which is called <vertices> to find the vertices source, although I really don’t understand the reason why they do this in COLLADA but for the sake of completeness you have to read this Node it has at least one Child node called <input> with a semantic attribute of “POSITIONS” value, which references the vertices <source> with another source name/id. And then you refer to this ID when ever you need the vertices source. If you don’t understand these sections then skip to the next section and you hopefully will understand.

<triangles>

Now as we have assumed we are only considering COLLADA documents triangulated so you will only see <triangles> types nodes as children of <mesh> otherwise you might see <polylist> etc nodes, which we are least concerned with.

This <triangles> node tells all the information we need to make a triangle out of those 3 sources (in this case) which we read earlier. A <triangles> node says how many triangles we have in this <triangles> node with a “count” attribute and also lists “material” attribute which is used to find the material from the <library_material> and that material is used to render the list of triangles from this <triangles> node. So you might see many triangle groups in one Mesh, which are separated by Materials. So we have to read all the <triangles> nodes.

To decode <triangles> nodes we have to read its children in which <input> and <p> are the most important. The number of <input> nodes says the number of attributes per vertex. And <p> has the indices of those attributes in their corresponding <source> nodes. Let’s see an example.

<mesh>

<source id="position"/>

<source id="normal"/>

<source id="textureCoords"/>

 

<vertices id="verts">

<input semantic="POSITION" source="#position"/>

</vertices>

<triangles count="2" material="Bricks">

<input semantic="VERTEX" source="#verts" offset="0"/>

<input semantic="NORMAL" source="#normal" offset="1"/>

<input semantic="TEXCOORD" source="#textureCoords" offset="2" set="1" />

<p>

0 0 1 3 2 1

0 0 2 1 3 2

</p>

</triangles>

</mesh>

Figure 4: Structure of a Triangle

As you can see from the above example <vertices> node is renaming the “position” source with “verts” and then defining the triangles vertices source with “verts” name. So this is why we need to read <vertices> node to find the real position <source> from the <source>s.

If you read the Children of <triangles> node you can see that it has 3 <input> nodes with values of “VERTEX” “NORMAL” and “TEXCOORD” for its semantic attribute. This essentially means that our triangles have 3 attributes per vertex, first Vertex Position, second Vertex Normal and third Vertex Texture Coordinate.

And how we know which one is first in the list of indices in <p>? We can see that

<input> node with semantic = “VERTEX” has offset = “0”,

<input> node with semantic = “NORMAL” has offset = “1” and

<input> node with semantic = “TEXCOORD” has offset = “2”.

So when ever we will read values from <p> for each triangle’s each vertex,

The first one will be the Index of “VERTEX” Position from the “positions” <source>,

The second one will be the index of the “NORMAL” from the “normal” <source> and

The third one is the index of “TEXCOORD” from the “textureCoords” <source>.

Now one thing I would like to make clear here is, that all these values we read from <p> are “indices” not actual values. And all the data for all the triangles are saved as indexed data to save space in case of repetitions of attributes data. To find the real data we have to refer to the corresponding <source>s and pick the corresponding data at that particular index.

Making Triangles is very easy now. All you have to do is keep on reading 3 * (Number of Input Nodes in <triangles>) values from <p> and read the corresponding attribute values from the corresponding <source>s. If we have only one attribute per vertex for any number of triangles then we will have the following <triangles> Node, with only one <input> child. In this case all you have to do to read the triangle is to keep on reading 3 values from <p> and read the corresponding vertex values from the corresponding “verts” source.

<triangles count="2" material="Bricks">

<input semantic="VERTEX" source="#verts" offset="0"/>

<p>

0 3 2

0 2 1

</p>

</triangles>

One thing we still need to know is the “material” attribute of a <triangles> node. This attribute references the material used from the “library_materials> which will we discuss later in the tutorial.

That’s all for the geometry data. If you understand this part correctly I hope you will have no problems going on from here onwards. Other wise go back and read again until you understand completely. Now if you directly want to jump to the implementation part (part 2) of the tutorial, you should be able to read and display static 3D objects in your engine. And if you want to render them with Materials and texture maps as well as animate them, you will have to keep on reading this part of the tutorial completely.

Click here to go to: Implementation section in Part 2 for this section of Part 1
Reading Texture filename from COLLADA document

As you know we took some assumptions in the beginning, one of which was only one texture file can be used in the COLLADA document. This will make finding the file name very easy.

All we have to do is to read the <library_images> and read the “id” attribute of the “Only” <image> node in it. Usually that will be the file name of the texture file used in COLLADA. But it might not be correct file name, and COLLADA might create that ID different then the file name. So, to correctly read the file name we must read the <init_from> child node of <image> node, which gives the whole path, with file name. For our export purposes I am only interested in the file name, not the whole path, so I will tokenize the full path and save the file name only.

Click here to go to: Implementation section in Part 2 for this section of Part 1
Reading Materials from COLLADA document

We discussed in the section “Reading Geometry Data from COLLADA document” that each triangle group is separated by a “material” and the Material ID is the value of the “material” attribute in <triangles> node. Now to find those materials with those IDs we have to read <library_materials>. In <library_materials> you will find <material> nodes with those IDs which were referenced from <triangles> nodes. But unfortunately those <material> nodes have only one type of child named <instance_effect> which has one attributes called “url”. All what its saying is that this specific <material> node is referring to an effect from the <library_effects>, which in turn defines the material completely.

So we take the value of this “url” attribute for this specific <material> and find it in <library_effects>, now unfortunately this library <library_effects> is the most complicated library of COLLADA as much as I know. It can get very complicated when shaders and what not is included in the COLLADA document. But since I promised to keep things clear and easy, we will only read the data that we desperately need for defining a material.

Once we have found the <effect> node with id of the value of the “url” attribute for any material, we have to find either <phong> or <blin> node in <profile_COMMON> child node of the <effects> node. <phong> or <blin> are usually inside <technique> child node of <profile_COMMON>. Once we have found either <phong> or <blin> keep looking for all the parameters of the Material we are looking for, like “ambient” “diffuse” “specular” “emission” “shininess” and “transparency” etc. what ever you need for the material to look good. Usually “diffuse” “shininess” and “transparency” is enough to create a good looking material.

How can we read the data from those nodes is very easy? Usually ambient, emission, diffuse and specular nodes has 4 float values, inside a <color> child node, which corresponds to “RGBA” components of that particular material’s property, while reflectivity and transparency etc have 1 float value.

<ambient>

<color>1.0 1.0 1.0 1.0</color>

</ambient>

 

<transparency>

<float>0.5</float>

</transparency>

If we have placed a texture map on the diffuse color of the material then <diffuse> will not have a <color> child, rather that texture image. But for the sake of ease we will not worry about this and assume the texture map is always applied on the <diffuse> component of the material, which means we will not be reading <diffuse> values from COLLADA. But we will be using a default value for diffuse inside our OpenGL implementation.

That’s all what we need for any static geometry. So if you are only interested in reading Static geometry from COLLADA you can stop reading this part and jump to the implementation. Other wise keep on reading for extracting animation data from COLLADA documents.

Click here to go to: Implementation section in Part 2 for this section of Part 1
Reading Skeleton from COLLADA document

We assumed that we will only read COLLADA documents with skeletal animations, and not those with backed animations, so we have to read the skeleton from the COLLADA document. By skeleton, I mean reading the Joints (Bones) information. We also have to read the hierarchy of the Joints. This will tell us, who are the child of whom! And who is the parent of a joint etc. In the following figure all these terminologies are explained. Remember that Bones and Joints are One and the same thing, they are just convenience names, and the data that we read from COLLADA is actually a Joint, a Bone is an imaginary line connecting two Joints.

Figure 5: Skeleton Terminologies

In the following figure you can see the skeleton of our example file and the Skin attached to it.

Figure 6: Complete Character in one pose of animation

The red circles on the left in figure 5 are the joints we read from COLLADA and the lines connecting those circles are the imaginary bones, which are used to animate the skin. On the right you can see the skin attached to the skeleton in another frame.

You might remember we took some assumptions, one of which was that, all the joints are added to the skin, which will make your <library_visual_scenes> very simple to read. All you have to do is find the root Joint (bone) <node> of the skeleton in the visual scene and then read the whole tree of joints. One of the disadvantages with this is that you will have a lot of joints considered affecting the skin, but in real they will not have any effect on the skin. And if you don’t add all the bones to the skin, then you will see <node>s of type = “JOINT” and type =”NODE” mixed in the hierarchy. But if you add every bone to skin you will have full tree of type=”JOINT”s only. This is also the default behavior for many engine exporters. When you have <node>s with type=”JOINT” and type=”NODE” mixed in the hierarchy then you have to read <instance_controller> from <library_visual_scenes> and then read <skeleton> each time you have to read a joint. Those <node>s which are not of type=”JOINT” are still Joints but they are not effectors, which means they are not effecting the skin. And that’s why we assumed everything must be attached to the skin, to keep things easy and simple.

To read the hierarchy of the bones, you need to have a data structure which can hold a number of children and a parent of its own kind. (This will get clear in the implementation part). You might also need to save the “SID” attribute of <node>s. Once we have the data structure setup, we will find the root and start reading its children and then their children and so on (recursively) and keep saving them in the data structure. At the end of the whole read process your whole data structure should be able to answer questions like, which joint is the child of whom? And who is the parent of a joint.

Now how can we find the root joint of the skeleton? Since we know we only have one model in the COLLADA document so we don’t have to read the <scene> node to find where the scene is instanced from. We directly go to <library_visual_scenes> and for all the direct (immediate) children of the only <visual_scene> we have to find the <node> who has a children of type <instance_controller>, read the <skeleton> child of this <instance_controller> and that will give you the ID of the root node. Since we have added all the bones to the skin, we will only have one <skeleton> child of <instance_controller>. Now this node is our root of the skeleton and everything connected to this <node> is part of the skeleton.

If you see the structure of this <node> in COLLADA document you will see most of the nodes have <matrix> as the first child. And this <matrix> contains 16 float values, which makes the Joint Matrix of the bone. This is also called the local bone transformation matrix. When we connect all the joints we have to multiply the World Matrix of the parent to the child’s Joint Matrix and save it as world bone transformation matrix for the child. For the root Joint, who doesn’t have a parent, the Joint Matrix becomes the World transformation matrix.

By now you should be able to read the skeleton and derive the bind pose of the skeleton from the Joint matrices you read for each <node>. In the next section we read the skinning information which connects this skeleton with the skin.

Click here to go to: Implementation section in Part 2 for this section of Part 1
Reading Skinning information from COLLADA document

So far we have read the geometry (vertices attributes information, materials, texture filename) as well as skeleton of the model. What we need to know now is how this skeleton is connected to the skin (Geometry). We have read many Joints in the skeleton. But we still don’t know which Joint influence which vertex. Some of the joints might not even influence any vertex at all. But if you remember we took an assumption that all the Joints must be added to the skin. In that case every joint must be influencing the skin theoretically.

To properly connect the skin (geometry) to the skeleton we need skinning information, and this section will try to help you understand, where we can find skinning information in COLLADA?

There is one other thing I would like to explain before we go further. If we have a character who’s each vertex is connected to only one Joint. When ever that Joint moves the vertex connected to it must also move. And you will see very rigid animation. But this is not how things work. Almost every vertex is connected to more then one Joint. And we specify the influence of each joint on that vertex with the help of vertex weights. Each joint influences that particular vertex some percentage of the total influence which totals to 1. So vertex weights are very important part of the skinning information.

<library_controllers>

<library_controllers> contains all the influences (joints) and their connectivity through vertex weights for the whole model. According to our assumptions we only have one mesh and one skeleton. So we will have only one <controller> node in the list of children of <library_controllers>. Once we have found the one and only <controller> node, we have to find its child node <skin>. In the <skin> node, find the <source> whose attribute’s “name”s value is “JOINT” in the <param> child node of the <accessor> child of the <technique_common>, (I will not explain all this again since we have already decoded <source> nodes when we were reading Geometry data) and the <NAME_array> will give you the Names of all the joints in the skeleton. Now you know that you can find the number of bones used from the “count” attribute of the <NAME_array> node in this source. An example <source> is given as follows.

<source id="boyShape-skin-skin-joints">

<NAME_array id="skin-joints-array" count="5">Bone1 Bone2 Bone3 Bone4 Bone5<NAME_array />

<technique_common>

<acessor source="#skin-joints-array" count="5" stride="1">

                        <param name="JOINT" type="Name" />

</acessor>

</technique_common>

</source>

And if you go back and see your skeleton <node>s from <library_visual_scene>, you will see that all these names of Joints you read from <NAME_array> are actually the SID’s of these <node>s.

To properly read the skinning data, we first need to read the Bind shape matrix of the skin to the skeleton, which is usually the first child of <skin> node, if it’s not the first child we will iterate through all the children and find and save it. And then we start reading from the node called <vertex_weights> who’s “count” attribute’s value gives the number of weights, as far as I know this count must be equal to number of vertices in the model which we read earlier when we were reading Geometry data because we have to define the vertex weights for each and every vertex at least and at most once.

If you see the structure of the <vertex_weights> node you will see at least 2 <input> nodes, one with attribute semantic=”JOINT” and second with semantic=”WEIGHT”, One <vcount> node and one <v> node.

When we have to read the weights for each vertex we iterate <vertex_weight>’s attribute “count” number of times into the <vcount> node values. And each value from the <vcount> is the number of Joints affecting that particular vertex, on which we are currently iterating. So we iterate nested for that specific value in the <vcount> (number of joints time) and read pairs of indices from <v> (Here I assume we have only two <input> nodes in <vertex_weight>).

The first one index the “JOINT” name in the “JOINT” <source>’s <NAME_array> (Here I assume that the value of “offset” attribute of the <input> who’s semantic=”JOINT” is “0”), we mentioned how to find this source earlier as well, but here you can get the ID of this source from the “source” attribute of the <input> child of the <vertex_weight> node with semantic=”JOINT”.

And the second one index the weight value from the <source> who’s ID you can get from the “source” attribute of the <input> child of the <vertex_weight> node with semantic=”WEIGHT” (Here I assume that the value of “offset” attribute of the <input> who’s semantic=”WEIGHT” is “1”).

<vertex_weights count="4">

<input semantic="JOINT" source="#joints" offset="0"/>

<input semantic="WEIGHT" source="#weights" offset="1"/>

<vcount>3 2 2 3</vcount>

<v>

1 0 0 1 1 2

1 3 1 4

1 3 2 4

1 0 3 1 2 2

</v>

</vertex_weights>

In this example you can see that this <vertex_weight> node is defining weights (influences) for 4 vertices, first vertex has 3 influences, First vertex’s first influence’s joint index is 1 which is the index from the JOINTS <source>s <NAME_array> values. And its weight index in the <float_array> of the <source> of weights is 0.

There is one other very important child of <skin> node which is called <joints> and it usually have two <input> nodes, the first one with attribute semantic=”JOINT” references the <source> node with Joint names, through the “source” attribute. And the second <input> with semantic=”INV_BIND_MATRIX” references the source with inverse bind matrices for each Joint through the attribute “source”. The source with inverse bind matrices contains (Joints_count * 16) values which makes Joints_count inverse bind matrices. These inverse bind matrices are needed for skinning. And will be clear when we read the implementation part.

Once we have completely read the <controller> node we should have one Bind shape matrix, a number of Joints and their Inverse bind matrices, and we have read their Joint matrices from the <visual_scene> earlier. Each vertex must be influenced by one or more then one bone (Remember this is contrary to Each Joint must be influencing at least one or more Vertex, which is not true, since their might be Joints, influencing no vertices). And we must have their weights accordingly.

Now if you have come this far, you should be able to read the geometry data, as well as the skeleton and skinning data from COLLADA documents. And you should be able to draw the model in raw triangles, as well as draw the skeleton. Although I haven’t discussed how you can accumulate the world matrices for each joint and then draw in world coordinates for debugging purposes but I think I gave a hint that we have to multiply parent joint’s world matrix with current joint’s Joint matrix and save the result in current joint’s world matrix. We have to start this process from the root bone. So that we don’t have dirty world matrices from parents, and the root Joint’s world matrix becomes the Joint matrix, since root don’t have any parent. If you are also reading the COLLADA specification version 1.5 you can find the skinning equation so you should also be able to put the model in bind shape. How can we animate this model is still not covered and will be covered in the following sections.

Click here to go to: Implementation section in Part 2 for this section of Part 1
Reading Animation data from COLLADA document

So far we are able to read every thing related to the static pose of the character, the only thing we still have to understand and read is the animation data part. Animation is not very strong in COLLADA and is still in its infancy, as time passes and COLLADA gets mature this will get better. But for our purposes we have a lot to worry about :).

<library_animations>

In this library we have all the animations data saved. For each joint animated you will see an <animation> node which further have the animation data for that specific Joint. Remember that an <animation> channel replaces the transform of the target on which it applies, which in this case will be joints.

You will see three types of children nodes in <animation>, first one as usual will be <source>s of data, second one is called <sampler> and the third one is <channel>. You need <sampler> and <channel> nodes to define the target on which the animation data is applied.

From <channel> node you pick the target which gives you the ID of the Object on which the Animation data will be applied. And you also get the Sampler ID from where you will pick the sources from which you will pick the animation Data.

Remember the example I am presenting here is a case which will never occur in our example COLLADA documents, because of our assumption of backing matrices. But this is an easy example to understand.

Example:

<source id="astroBoy-input">

<float_array id="astroBoy-input-array" count="2">0 1.16667</float_array>

< technique_common>

<accessor source="#astroBoy-input-array" count="2" stride="1">

<param name="TIME" type="float"/>

</accessor>

</technique_common >

</source>

<source id="astroBoy-output">

<float_array id="astroBoy-output-array" count="2">2.2 3.5</float_array>

<technique_common>

<accessor source="#astroBoy-output-array" count="2" stride="1">

<param name="TRANSFORM" type="float"/>

</accessor>

</technique_common>

</source>

<source id="astroBoy-interpolations">

<NAME_array id="astroBoy-interpolations-array" count="2">LINEAR LINEAR</NAME_array>

<technique_common>

< accessor source="#astroBoy-interpolations-array" count="2" stride="1">

<param name="INTERPOLATION" type="float"/>

</accessor >

</technique_common>

</source>

<sampler id="astroBoy_Skeleton-sampler">

<input semantic="INPUT" source="#astroBoy-input"/>

<input semantic="OUTPUT" source="#astroBoy-output"/>

<input semantic="INTERPOLATION" source="#astroBoy-interpolations"/>

</sampler>

<channel source="#astroSkeleton-sampler" target="astroBoy_Skeleton/trans.X"/
 

Now Lets read from the Bottom <channel> node.

This says that there is one Entity (in our case will be Joint) called “astroBoy_Skeleton” in the scene who’s “X translation values” is being animated by the sampler “astroSkeleton-sampler”.

So we need to know how “astroSkeleton-sampler” animated that “X translation value”, we read <sampler> which says.

There are three types of inputs you must read to read the animation data.

First <intput> node is: INPUT

Second <intput> node is: OUTPUT

Third <intput> node is: INTERPOLATION

When we start reading the <input>s from the <sampler>,

The “input” with attribute semantic = “INPUT” gives you the input <source> for the animation

The “input” with attribute semantic = “OUTPUT” gives you the output <source> for the animation

The “input” with attribute semantic = “INTERPOLATON” gives you the interpolation <source> for the animation

Now when we go and read those <source>s, we see that the source who was referred to semantic = “INPUT” by the sampler has name=”TIME” in <param> child of <accessor> child of the <technique_common> child of that <source>, in short it says this sources has time values of the animation in floats.

The source who was referred to semantic = “OUTPUT” by the sampler has name=”TRANSFORM” in <param> child of <accessor> child of the <technique_common> child of that <source>, which says this sources has “X translation” values in floats for those times which we read from the previous source.

The source who was referred to semantic = “INTERPOLATION” by the sampler has name=”INTERPOLATION” in <param> child of <accessor> child of the <technique_common> child of that <source>, which says this sources has the interpolation values in Strings for those OUTPUTS which we read from the previous source. (In studio max those interpolation values are usually “LINEAR” so we will not read this source and assume they are all “LINEAR”)

What this last source means is that, if you see the <source>s, you are given OUTPUT values for two values of time. What happens if we want to run the animation on a time which falls in between those two time values? Then we apply interpolation to find the middle OUTPUT value for the in-between time value. And in this case it’s LINEAR interpolated.

Now if you see the TIME Source, that’s actually your key frames. And the OUTPUT one is the key frames data for the “X translation” of the Entity (joint).

So you pick the corresponding OUTPUT value for any time and apply that to the “X translation factor” of that entity in your code and the entity will be animated. To calculate the in-between values for more smooth animation you use the LINEAR interpolation.

Click here to go to: Implementation section in Part 2 for this section of Part 1

What interpolation means?

Interpolation means calculating any in-between value between (among) two (or more) values.

Let’s say we have “X” and “Y” values, to calculate the “Middle” value in between those two values we can use an interpolation factor of “0.5” which we call “T”. And to find the 3-Quater value in-between “X” and “Y” we use “T = 0.75” and so on.

You can run a loop on “T” from lets say 0.0 to 1.0 have any increment i.e 0.001, 0.01, 0.05 etc and you can get “Loop” many in-between values.

Now Linear Interpolation is a simple form of Interpolations. And the formula is as follows

float Interpolate( float a_Value1, float a_Value2, float a_T)

{

return ((a_Value2 * a_T) + ((1 - a_T) * a_Value1));

}          

If you see the code it says that if “a_T” is “Zero” then give me a_Value1, and if it’s “One” then give me a_Value2. And if it’s in-between “Zero and One” then it will give you value in-between a_Value1 and a_Value2.

Now there are other forms of Interpolations as well. Like Bezier, cubic etc. They have further complicated formulas. And they also consider more then two values to interpolate in-between. But we will only be using linear interpolations for the sake of simplicity.

Now as we discussed before. This is not the case which we will ever have in our example COLLADA documents. So let’s see what we will have?

Keeping our assumptions in mind, we will only have two types of <animation> nodes. We will either have 16 * 3 = 48 <source>s, 16 <sampler>s and 16 <channel> nodes or we will have 3 <source>s, 1 <sampler> and 1 <channel> node. In the first case the “target” attribute will have “transform (X) (Y)” after the last “/” in its value and in the second case the “target” attribute will have “transform” after the last “/” in its value.

Either             <channel source="#astroSkeleton-sampler" target="astroBoy_Skeleton/transform (0) (0)"/>

Or                    <channel source="#astroSkeleton-sampler" target="astroBoy_Skeleton/transform"/>

In the second form the values of the matrix which we backed in, are given in one <source> out of those 3 <source>s, just like the one <source> we read in reading inverse bind matrices from controller. While in the first form values of each component of the 4 x 4 matrix are given in different <source>s. And we have to combine them in one matrix when we read the data.

Now if you remember we read the Joint matrices for each joint from the <visual_scene> node. These values (which will be matrices, since we backed matrices) which we read from <animation> nodes for those joints, which are targeted through the “target” attribute of the <channel> of that <animation> will replace the Joint matrices, we read earlier from <visual_scene> for each key frame defined in the animation. And to calculate the world transformation matrix for each joint we will have to take this new Joint Matrix and multiply it with the parent Joint’s world transformation matrix.

And that’s all pretty much it. If you have read the whole tutorial from start to end, I guess you should be able to write your own exporter for COLLADA documents now. And you are ready to start reading the next part if you haven’t read in between the implementation sections.

3,925 thoughts on “Collada Tutorial

  1. istanbul antalya ambarı

    Şirketimiz şehirler arası lojistik hizmetlerinde değerli müşterilerine ambar ve komple ürün ve yük gönderimlerini
    en kolay hale getirmek için istanbul antalya ambarı hizmetini açarak yeni teknolojik araçlarımız
    ile İstanbul Antalya ve bölgesine şehirler
    arası taşıma parsiyel ve komple gönderimler yapmaktadır.
    Firmamız ile iletişime geçerek adresten yüklerinizi & ürünlerinizi aldırabilir
    ve yeni adresine en kısa sürede sevk ettirebilirmisiniz

    Reply
  2. 파라오카지노

    Hey there would you mind stating which blog platform you’re using?
    I’m going to start my own blog in the near future but I’m having a difficult time making a
    decision between BlogEngine/Wordpress/B2evolution and Drupal.
    The reason I ask is because your layout seems different then most
    blogs and I’m looking for something unique. P.S Apologies for getting off-topic but I had to ask!

    Reply
  3. 더킹카지노

    After I originally left a comment I seem to have clicked the -Notify me when new comments are added- checkbox and now whenever a comment is added I receive
    four emails with the same comment. There has to be a means you can remove me from that service?

    Thanks!

    Reply
  4. 예스카지노

    Hi, I do believe this is a great site. I stumbledupon it
    😉 I’m going to come back once again since I bookmarked it.
    Money and freedom is the greatest way to change, may
    you be rich and continue to help others.

    Reply
  5. phillips953.kinder-ausmalbildervorlagen.com

    An impressive share! I’ve just forwarded this onto
    a friend who has been conducting a little research on this.
    And he actually bought me lunch simply because I found it for
    him… lol. So allow me to reword this…. Thank YOU for
    the meal!! But yeah, thanks for spending time to discuss this topic here on your blog.

    Reply
  6. online betting

    I am not sure where you’re getting your info, but great topic.
    I needs to spend some time learning more or understanding more.

    Thanks for wonderful info I was looking for this information for my mission.

    Reply
  7. james825.radin-entertainments.com

    Good day! I know this is kind of off topic but I was wondering which blog platform are
    you using for this website? I’m getting fed up of WordPress
    because I’ve had issues with hackers and I’m looking at alternatives for
    another platform. I would be fantastic if you could point me in the
    direction of a good platform.

    Reply
  8. 카지노사이트

    Hi there! I could have sworn I’ve been to this website before but after reading through some of
    the post I realized it’s new to me. Nonetheless, I’m definitely glad I
    found it and I’ll be bookmarking and checking back often!

    Reply
  9. hughes745.technota9adom.com

    Great items from you, man. I have consider your stuff previous to and you’re just too wonderful.
    I actually like what you’ve bought here, certainly like what you are saying and the best
    way in which you are saying it. You’re making it entertaining and you still care for to keep it sensible.
    I can not wait to learn far more from you. That is actually a great
    site.

    Reply
  10. wilso279.khabarside.com

    Hi there! Quick question that’s completely off topic. Do you know
    how to make your site mobile friendly? My blog looks weird when viewing from my
    iphone. I’m trying to find a theme or plugin that might be
    able to fix this problem. If you have any suggestions, please share.
    Cheers!

    Reply
  11. https://martin882.agcico.com/1.html

    Have you ever thought about adding a little bit more
    than just your articles? I mean, what you say is important and all.
    Nevertheless just imagine if you added some great
    visuals or video clips to give your posts
    more, “pop”! Your content is excellent but with images and videos, this blog could definitely
    be one of the best in its field. Terrific blog!

    Reply
  12. 바카라사이트

    I like the valuable information you provide on your articles.
    I will bookmark your blog and check once more right here regularly.

    I am slightly sure I’ll be told a lot of new stuff right right here!
    Good luck for the following!

    Reply
  13. mitchell395.darpanexpress.com

    I was curious if you ever thought of changing the structure of your website?
    Its very well written; I love what youve got to say. But maybe you could a little more
    in the way of content so people could connect with it better.

    Youve got an awful lot of text for only having 1 or two
    pictures. Maybe you could space it out better?

    Reply
  14. 더킹카지노

    This is really interesting, You’re a very skilled blogger.
    I have joined your rss feed and look forward to seeking more of
    your excellent post. Also, I’ve shared your site in my social
    networks!

    Reply
  15. clarke300.xinishila.com

    I’m impressed, I must say. Seldom do I come across a blog that’s both educative and amusing, and let me tell you, you have hit the nail on the head.
    The problem is something that too few men and women are speaking intelligently about.

    I’m very happy that I found this in my search for something regarding this.

    Reply
  16. 예스카지노

    First off I want to say superb blog! I had a quick question in which I’d like to ask
    if you don’t mind. I was interested to know how you center yourself and clear your mind prior to writing.
    I’ve had trouble clearing my thoughts in getting my ideas out there.
    I do enjoy writing but it just seems like the first 10 to 15
    minutes are generally wasted just trying to figure out how to begin. Any suggestions or hints?
    Thanks!

    Reply
  17. 더킹카지노

    Greetings from Ohio! I’m bored to tears at work so I decided to check out your
    website on my iphone during lunch break. I enjoy the info you provide here and can’t wait to take a look when I get home.
    I’m amazed at how quick your blog loaded on my phone ..
    I’m not even using WIFI, just 3G .. Anyways, awesome site!

    Reply
  18. 파라오카지노

    Its like you learn my thoughts! You appear to grasp
    a lot about this, such as you wrote the book in it or something.
    I feel that you could do with a few p.c. to drive the message house a bit, however instead of that, this is great blog.
    An excellent read. I’ll definitely be back.

    Reply
  19. 우리카지노

    Aw, this was a really nice post. Spending some time and actual
    effort to generate a top notch article… but what can I
    say… I hesitate a whole lot and never manage to get nearly anything done.

    Reply
  20. write my essay online

    An outstanding share! I’ve just forwarded this onto a friend who was dking a little himework onn this.
    And he actually bought me dinner becausxe I stumbled upon itt for him…
    lol. So let me reword this…. Thank YOU for the meal!!

    But yeah, thanks for spending some time to talk about this topic here on your blog.

    https://buyanessayonlinecheap.com
    write my essay online
    write my essay online
    https://buyanessayonlinecheap.com https://buyanessayonlinecheap.com

    Reply
  21. 예스카지노

    Wonderful blog you have here but I was curious if you knew of any message boards that cover the same topics
    talked about in this article? I’d really like to
    be a part of community where I can get comments from other knowledgeable individuals that share the same interest.
    If you have any suggestions, please let me know. Thank you!

    Reply
  22. 파라오카지노

    I loved as much as you’ll receive carried out right here.
    The sketch is attractive, your authored material stylish.
    nonetheless, you command get got an edginess over that
    you wish be delivering the following. unwell
    unquestionably come more formerly again since exactly the same nearly a lot often inside case you shield this increase.

    Reply
  23. 파라오카지노

    naturally like your website but you need to check the spelling on several of your posts.

    Several of them are rife with spelling problems and I in finding it very bothersome to tell the
    truth however I will surely come back again.

    Reply
  24. 파라오카지노

    I blog quite often and I truly appreciate your content.
    This article has truly peaked my interest. I will book mark
    your website and keep checking for new details
    about once per week. I subscribed to your RSS feed as
    well.

    Reply
  25. 파라오카지노

    Wonderful goods from you, man. I have understand your stuff previous to
    and you are just extremely wonderful. I actually like what you have
    acquired here, really like what you are stating and the way in which you say it.
    You make it enjoyable and you still care for
    to keep it wise. I can’t wait to read much more from you.

    This is actually a great web site.

    Reply
  26. 카지노사이트

    Nice blog! Is your theme custom made or did you download it from somewhere?
    A theme like yours with a few simple adjustements would really make
    my blog shine. Please let me know where you got your theme.
    Thank you

    Reply
  27. 예스카지노

    I was suggested this web site by my cousin. I am not sure whether this post is written by him as
    no one else know such detailed about my difficulty.
    You are incredible! Thanks!

    Reply
  28. https://turner1035.basabrinvoyages.com/p/1

    I loved as much as you’ll receive carried out
    right here. The sketch is tasteful, your authored subject matter
    stylish. nonetheless, you command get bought an shakiness over
    that you wish be delivering the following.
    unwell unquestionably come further formerly again as exactly
    the same nearly very often inside case you shield this
    increase.

    Reply
  29. brown790.kientrucdha.com

    Hello I am so grateful I found your site, I really
    found you by mistake, while I was browsing on Bing for something
    else, Anyhow I am here now and would just like to say thanks a
    lot for a fantastic post and a all round thrilling blog (I also love the theme/design), I don’t have time to
    go through it all at the minute but I have saved it and also added your RSS feeds, so when I have
    time I will be back to read a great deal more, Please do keep up
    the awesome work.

    Reply
  30. clark259.tinrahan.com

    What i don’t understood is in fact how you’re not really a lot more
    smartly-preferred than you might be now. You are very intelligent.

    You understand thus considerably relating to this matter, produced me in my opinion imagine it from so many varied angles.
    Its like women and men are not involved unless it is something to
    do with Woman gaga! Your own stuffs nice. All the time take care of it up!

    Reply
  31. https://lee499.radin-entertainments.com/archives/1

    I was wondering if you ever considered changing the structure of your blog?
    Its very well written; I love what youve got to say.

    But maybe you could a little more in the way of
    content so people could connect with it better. Youve
    got an awful lot of text for only having 1 or two
    images. Maybe you could space it out better?

    Reply
  32. https://harris1012.our-tips.com/archives/1

    Undeniably imagine that which you said. Your
    favourite justification seemed to be at the net the simplest
    factor to understand of. I say to you, I certainly get irked while other folks think about worries that they plainly don’t know about.
    You controlled to hit the nail upon the highest as neatly
    as outlined out the whole thing with no need
    side effect , folks can take a signal. Will likely be
    back to get more. Thank you

    Reply
  33. essay writing service reviews

    Hey thhere tertific blog! Does running a blog similar to
    this reqhire a lot of work? Ihave very little expertise in programming however I
    had bsen hoping to start my own blog soon. Anyway, if you have any
    ideas or tips for new blog owners please share. I know thbis is off subject but I just hadd tto ask.

    Kudos!
    https://ordertermpaperonline.com
    essay writing service reviews
    essay writing service reviews
    https://ordertermpaperonline.com

    Reply
  34. cook420.cbdisolateherms.com

    Hey, I think your blog might be having browser compatibility issues.
    When I look at your website in Safari, it looks fine but when opening in Internet Explorer, it has
    some overlapping. I just wanted to give you a quick
    heads up! Other then that, awesome blog!

    Reply
  35. college admission essay writing service

    It’s a shame you don’t have a donate button! I’d without a doubt donate to this brilliant blog!
    I guess for now i’ll settle for bookmarking and adding your RSS feed
    to my Google account. I look forward to new updaates and wipl share this
    blog with my Facebook group. Tallk soon!
    https://essaygood.com
    college admission essay writing service
    college admission essay writingg service [Gwendolyn]
    https://essaygood.com https://essaygood.com

    Reply
  36. best essay writing service in usa

    Do you mind if I quote a couple of your articles as long as
    I provide credit and sources back to your website? My blog is in the exact same area of interest as yours and my
    users would definitely benefit from some oof the information you proviee here.
    Please let me know if this okay with you. Cheers!
    https://writeargumentativeessay.com
    best essay writing servoce in usa
    best eessay writing service in usa https://writeargumentativeessay.com

    Reply
  37. adams782.birdsdot.com

    Hey there, I think your site might be having browser compatibility issues.
    When I look at your website in Safari, it looks fine but when opening in Internet Explorer, it has some overlapping.
    I just wanted to give you a quick heads up! Other then that, terrific blog!

    Reply
  38. green484.estenisa.com

    Greetings! I know this is somewhat off topic but I was wondering which blog platform are you using for
    this site? I’m getting sick and tired of WordPress because I’ve had problems with hackers and I’m
    looking at options for another platform. I
    would be great if you could point me in the direction of
    a good platform.

    Reply
  39. robinson970.ujjawalbharatindia.com

    Howdy, I do think your website may be having browser compatibility issues.
    When I take a look at your blog in Safari, it looks fine however, if opening in I.E.,
    it has some overlapping issues. I simply wanted to give you a quick
    heads up! Besides that, wonderful blog!

    Reply
  40. https://williams867.talatakbas.com/2020/11/14/the-birth-of-baccarat/

    Hey I know this is off topic but I was wondering if you knew of any widgets I could
    add to my blog that automatically tweet my newest twitter updates.

    I’ve been looking for a plug-in like this for
    quite some time and was hoping maybe you would have some
    experience with something like this. Please let me know if
    you run into anything. I truly enjoy reading your blog and
    I look forward to your new updates.

    Reply
  41. art

    Hey there! I simply wish to offer you a big thumbs up for your
    excellent information you have got right here on this post.
    I am coming back to your site for more soon.

    Reply
  42. https://jones955.tinrahan.com/2020/11/why-i-love-hate-sports/

    Good day I am so delighted I found your blog,
    I really found you by mistake, while I was researching on Yahoo
    for something else, Anyways I am here now and would
    just like to say kudos for a incredible post and a all round
    thrilling blog (I also love the theme/design), I don’t have time to look over it all at the moment but I have bookmarked it and also added your RSS feeds,
    so when I have time I will be back to read much more, Please do keep up the awesome
    jo.

    Reply
  43. backlink paketleri

    backlink paketleri backlink paketleri backlink
    paketleri backlink paketleri
    backlink paketleri backlink paketleri backlink paketleri backlink paketleri
    backlink paketleri backlink paketleri backlink paketleri
    backlink paketleri

    Reply
  44. https://harrison1064.sweetsimplyjenny.com/2020/11/14/installing-blackjack.html

    Definitely imagine that that you said. Your favourite justification appeared to be
    on the web the easiest factor to remember of. I say to you, I definitely get irked
    even as other folks think about concerns that they plainly don’t know about.
    You managed to hit the nail upon the top as neatly as
    outlined out the whole thing with no need side-effects , folks
    can take a signal. Will probably be back to get more.
    Thanks

    Reply
  45. https://watson444.shabbirahsan.com/2020/11/before-you-are-left-behind-what-you-must-do-to-learn-about-baccarat/

    Unquestionably believe that which you said. Your favorite justification appeared to
    be on the web the easiest thing to be aware of.
    I say to you, I definitely get irked while people think about worries that they just
    do not know about. You managed to hit the nail upon the top as well as defined
    out the whole thing without having side-effects ,
    people could take a signal. Will probably be back to get more.
    Thanks

    Reply
  46. johnson597.4nigerians.com

    Thanks on your marvelous posting! I certainly enjoyed reading it, you happen to be a great author.
    I will ensure that I bookmark your blog and will come back someday.
    I want to encourage continue your great posts,
    have a nice afternoon!

    Reply
  47. martin971.marketingtodaymagazine.com

    I have been browsing online greater than three hours nowadays, yet I never found any interesting article like yours.
    It is lovely worth sufficient for me. In my view, if
    all site owners and bloggers made excellent content as you probably did, the net will likely be
    a lot more useful than ever before.

    Reply
  48. thompson844.bestofhomedecorstuff.com

    Hey there just wanted to give you a quick heads up.
    The text in your article seem to be running off the screen in Chrome.
    I’m not sure if this is a formatting issue or something to do
    with browser compatibility but I thought I’d post to let you know.

    The design and style look great though! Hope you get the problem solved soon. Kudos

    Reply
  49. microsoft

    Please let me know if you’re looking for a author for your weblog.
    You have some really great articles and I feel I would be a good asset.
    If you ever want to take some of the load off, I’d absolutely love to write some content
    for your blog in exchange for a link back to mine.
    Please send me an e-mail if interested. Cheers!

    Reply
  50. internetten para kazanma yolları

    İnsanların internetten para kazanma yolları hakkında daha fazla bilgiye ulaşmaları adına sürekli olarak araştırmalar yapan iguanabey sitesi ile sizler de artık boş zamanlarınızı değerlendirebilirsiniz.
    Bu sayede evinizde bilgisayarınızdan oturduğunuz yerden belirli
    masraflarınızı karşılayacak kadar gelir elde etmeniz mümkün olacaktır.

    Reply
  51. ketoosi

    I love your blog.. very nice colors & theme. Did you make this website yourself or did
    you hire someone to do it for you? Plz respond as I’m looking to
    design my own blog and would like to know where u got this from.

    many thanks

    Reply
  52. o1zMxUi7CI63Tw

    896366 862262A really informationrmative post and lots of actually honest and forthright comments produced! This undoubtedly got me thinking a whole lot about this concern so cheers a whole lot for dropping! 208700

    Reply
  53. places to buy kratom near me

    I like the helpful information yoou supply to your articles.
    I will bookmark your weblog and take a look att once more here regularly.

    I’m reasonaboy sure I will be told manyy new stuff proper here!
    Best of luck for the next!
    https://www.google.fr/url?q=https://cbdwwwkratom.com/
    places to buy kratom near me
    places to buy kratom near me
    http://www.google.nu/url?q=https://cbdwwwkratom.com/ http://www.google.is/url?q=https://cbdwwwkratom.com/

    Reply
  54. thai visa

    I’m impressed, I must say. Rarely do I encounter a blog that’s equally
    educative and engaging, and let me tell you, you have hit the nail on the head.
    The problem is something which not enough people are speaking intelligently about.
    I’m very happy I found this in my search for something relating to this.

    Reply
  55. smith621.antenmarkets.com

    I think that what you published was very reasonable. But, what about this?

    suppose you added a little information? I am not suggesting your information isn’t good, however suppose you added a title that makes people want more?
    I mean Collada Tutorial – waZim is kinda boring. You ought to look
    at Yahoo’s front page and watch how they create article headlines to grab people to open the
    links. You might add a related video or a picture or two to grab people interested about everything’ve got to say.
    Just my opinion, it would make your posts a little bit more interesting.

    Reply
  56. https://moore665.hikinstitute.com/archives/1

    Hey I am so grateful I found your blog page, I really found you
    by error, while I was browsing on Bing for something else,
    Nonetheless I am here now and would just like to say many thanks for
    a incredible post and a all round exciting blog (I also
    love the theme/design), I don’t have time
    to browse it all at the moment but I have bookmarked it and also added your RSS feeds, so when I
    have time I will be back to read more, Please do keep up
    the fantastic jo.

    Reply
  57. backlink paketleri

    Bir çok firma ve kişi backlink paketleri satıyor lakin müşteri memnuniyetini ve planlı bir çalışma yapmadan sadece bas geç mantığını uyguluyor.
    Biz sizler için web sitenize özel link ağları ve sadece size özel ve
    web sitenizin kategorisine uygun bir backlink ağı sağlıyoruz.

    SEO ve Backlink alımlarında web sitenize uygun ve doğru bir link
    inşaatı yapılmasına dikkat etmelisiniz. Yapılan bu özenli çalışmalarda istenilen anahtar kelimenin ilk sayfalara geleceğini unutmayınız.

    Reply
  58. watson966.livingbeyondstyle.com

    Hello! This is kind of off topic but I need some guidance from an established blog.
    Is it hard to set up your own blog? I’m not very techincal but I can figure things out pretty
    fast. I’m thinking about making my own but I’m not
    sure where to begin. Do you have any points or suggestions?
    Thanks

    Reply
  59. KoSembol

    KoSembol olarak sizler için bir çok clan sembollerini ücretsiz şekilde sunuyoruz.
    Bir çok şeffaf clan sembolleri, knight online clan symbol ve daha binlerce içerik
    sizler için paylaşıldı ve paylaşılmaya devam edicek.

    Ücret karşılığında bir çok web site bu hizmeti sağlarken biz tamemen ücretsiz ve en yeni en kalileti 2021 clan simgeleri yapıyoruz.
    El emeği göz nuru bu symboller siz değerli oyuncular için bir marka olucaktır.
    Sizlerle bir ömür boyu aile ortamında olacağımızdan hiç şüphemiz yok.

    Reply
  60. allen237.wonodds35.com

    Hello, i read your blog from time to time and i own a similar one and i was just curious if you get
    a lot of spam remarks? If so how do you prevent it, any plugin or anything you can recommend?
    I get so much lately it’s driving me mad so any
    support is very much appreciated.

    Reply
  61. morgan517.nangalkottimes.com

    Have you ever thought about publishing an e-book or guest authoring on other blogs?

    I have a blog based on the same subjects you discuss and would
    love to have you share some stories/information. I know
    my subscribers would enjoy your work. If you’re even remotely interested, feel free to shoot me an e-mail.

    Reply
  62. https://mitchell510.webyazilimdestek.com/2020/11/15/how-exactly-to-restoration-slot-machines.html

    Unquestionably believe that that you stated. Your favourite
    justification appeared to be at the net the simplest factor to bear in mind of.
    I say to you, I definitely get annoyed even as other people consider concerns that they
    just don’t recognize about. You managed to hit the nail upon the highest as smartly
    as defined out the entire thing without having side effect , folks can take a signal.
    Will likely be back to get more. Thank you

    Reply
  63. https://adams1088.bemamor.com/2020/11/14/brief-report-teaches-you-the-ins-and-outs-of-slot-machines-and-what-you-have-to-do-today/

    Please let me know if you’re looking for a article writer
    for your blog. You have some really great articles and I feel I would be a good
    asset. If you ever want to take some of the load off, I’d absolutely love to write some content
    for your blog in exchange for a link back to mine. Please blast me
    an email if interested. Thank you!

    Reply
  64. williams831.simoorghshop.com

    Hello! I know this is somewhat off topic but I was wondering if
    you knew where I could get a captcha plugin for my comment form?

    I’m using the same blog platform as yours and I’m having
    difficulty finding one? Thanks a lot!

    Reply
  65. buy cheap essay papers

    Fantastic goods from you, man. I’ve conside your stuff prior too and you are just extremely wonderful.

    I actually like what you have obtained rioght here, certainly lik what you’re stating and the
    best way wherein you say it. You make it entertaining andd you still
    take care of to keep itt smart. I can not wait tto learn much more from you.
    This is actually a terrific web site.
    http://5fb234484b031.site123.me/blog/what-to-write-college-essay-about-reserch-papers
    buy chheap essay papers
    buy cheap essay papers https://ryan53.mypixieset.com/gmo-argumentative-essay/

    Reply
  66. loans

    Hi, I do think this is a great site. I stumbledupon it
    😉 I will come back yet again since i have book-marked it.
    Money and freedom is the best way to change,
    may you be rich and continue to help others.

    Reply
  67. robinson914.niksfudo.com

    Hi, Neat post. There’s a problem together with your web site
    in web explorer, would test this? IE nonetheless is the marketplace chief and a good part of other people will
    miss your wonderful writing due to this problem.

    Reply
  68. johnson627.aspirasipekanbaru.com

    Howdy! I know this is kinda off topic but I was wondering which blog platform are you using for this website?
    I’m getting fed up of WordPress because I’ve had issues with hackers and I’m looking at alternatives for another platform.
    I would be great if you could point me in the direction of a
    good platform.

    Reply
  69. thomas584.valknuttattoo.com

    Howdy! This is my first comment here so I just
    wanted to give a quick shout out and tell you I genuinely enjoy reading
    through your blog posts. Can you recommend any other blogs/websites/forums that go over the same topics?
    Thanks a ton!

    Reply
  70. campbell1021.vanlamphotos.com

    Its like you read my mind! You seem to know so much about this, like you wrote the book in it
    or something. I think that you could do with some pics to drive the message home a bit, but other than that, this is wonderful blog.
    An excellent read. I’ll certainly be back.

    Reply
  71. jones932.gaziantepyazici.com

    Hello there! This blog post could not be written any better!

    Reading through this post reminds me of my previous roommate!
    He continually kept talking about this. I most certainly
    will send this information to him. Fairly certain he’ll have a great read.
    Thank you for sharing!

    Reply
  72. ankara kanal açma

    Ankara ilinde sizlere en iyi hizmeti vermek için çabalıyoruz.
    Güvenilir ve en iyi işçiliğimizle sizlere, sayısız
    referanslarımızı sunarak ankara kanal açma hizmeti vermeye devam ediyoruz.

    Ankara tıkalı kanal açma, ankara tıkanıklık açma, ankara tıkalı tuvalet açma ve ankara kanal temizleme alanlarında ustalıkla
    sizlere en iyi kanal açma işçiliğini sunuyoruz.

    Evinizdeki giderlerde oluşan tıkanıklık sorunları, uzman kanal açma ekibimizle, kaliteli işçilik ve en iyi kanal açma ekipmanları ile
    çözülmektedir. tuvalet, banyo, mutfak
    gibi yerlerde oluşan tıkanıklık sorunları kanal açma hizmeti ile açılmaktadır.

    Mekanlarınızda oluşan bu gibi sorunları ankara içinde en profesyonel kanal açma ekibi ile kısa sürede çözülmektedir.

    Reply
  73. thomas628.direct2pay.com

    Hey there! This is my first visit to your blog!
    We are a team of volunteers and starting a new project in a community in the same niche.

    Your blog provided us beneficial information to work on. You have done a marvellous job!

    Reply
  74. college essay writing service reviews

    I’m impressed, I must say. Rarely do I colme aross a blog that’s both educative and amusing, and without a doubt, you’ve hit the nail on the head.
    The issue is something too few folks are speaking intelligently about.
    Now i’m very happy I found this during my hunt for something concerning
    this.
    https://www.wideopenspaces.com/
    college essay writing service reviews
    college essay writing service reviews (Rudolph)
    http://mickopedia.org/mickify?topic=PTRS-41 https://zims-en.kiwix.campusafrica.gos.orange.com/wikipedia_en_all_nopic/A/PTRS-41

    Reply
  75. mikko korhonen

    Thanks , I’ve just been searching for info about this topic for a
    while and yours is the greatest I’ve discovered till now.
    However, what concerning the bottom line? Are you positive concerning the supply?

    Reply
  76. ankara kanal açma

    Ankara ilinde sizlere en iyi hizmeti vermek için çabalıyoruz.
    Güvenilir ve en iyi işçiliğimizle sizlere, sayısız
    referanslarımızı sunarak ankara kanal açma hizmeti vermeye devam ediyoruz.
    Ankara tıkalı kanal açma, ankara tıkanıklık açma, ankara tıkalı tuvalet açma ve ankara kanal
    temizleme alanlarında ustalıkla sizlere en iyi kanal açma işçiliğini sunuyoruz.

    Evinizdeki giderlerde oluşan tıkanıklık sorunları, uzman kanal açma
    ekibimizle, kaliteli işçilik ve en iyi kanal
    açma ekipmanları ile çözülmektedir. tuvalet, banyo, mutfak gibi yerlerde oluşan tıkanıklık sorunları kanal açma
    hizmeti ile açılmaktadır. Mekanlarınızda oluşan bu gibi sorunları ankara içinde en profesyonel kanal açma ekibi ile kısa sürede çözülmektedir.

    Reply
  77. istanbul ankara nakliyat

    Firmamız müşterilerine İstanbul ankara nakliyat hizmetini en profesyonel şekilde ekonomik fiyatlar ile sunmaktadır.
    Firmamızın profilini inceleyip uzman ekibimizin hizmetlerinden en kolay şekilde yararlanabilirsiniz.

    Reply
  78. green281.gymnasticnow.com

    Hey there! I could have sworn I’ve been to this website before but
    after checking through some of the post I realized
    it’s new to me. Anyways, I’m definitely glad I found it and I’ll be
    book-marking and checking back often!

    Reply
  79. Leon Dynes

    Thanks a lot for giving everyone an extremely terrific opportunity to read from this blog. It is usually very enjoyable plus packed with amusement for me personally and my office mates to search the blog at minimum three times per week to read the latest secrets you will have. And indeed, I am actually fulfilled with all the beautiful thoughts you serve. Certain two ideas in this posting are undoubtedly the most beneficial we’ve ever had.

    Reply
  80. https://carter942.apu-morshed.com/2020/11/neutral-report-reveals-the-unanswered-questions-on-slot-machines/

    Hey I know this is off topic but I was wondering if you knew
    of any widgets I could add to my blog that automatically tweet my newest twitter
    updates. I’ve been looking for a plug-in like this for quite some time and was
    hoping maybe you would have some experience with something like this.
    Please let me know if you run into anything. I truly enjoy reading your blog and I look forward to your new updates.

    Reply
  81. Mersin web tasarım

    Mersin Web tasarım, web sitenizin google arama motorlarında
    erişilebilirliğini sağlayan,güncelleyen ve ana hatları ile kişi veya kurumları, ürün,marka ve hizmetleri tanıtan grafik,yazılımsal kodlar ve metinlerin bir araya getirilerek güncelleştirilen kaliteli başarılı ve
    google tarafından sevilen profesyonel web tasarımlar geliştiriyoruz.

    Mersin web tasarım ve dijital reklamcılık
    sektörünün halen farkında olmayan kesimler var malesef bizlerde
    mersin web tasarım firması olarak insanları web tasarım ve web
    sitesi konusunda daha çok bilinçlendirmeye çalışıyoruz.

    Web tasarım nedir ? denildiğinde kısaca kişi ve kurumların dijital ortamda görünen yüzü veya sanal dükkan veya sanal eviniz diye
    biliriz mersin web tasarım sizi veya firmanızı
    yansıtan size özel alandır ne kadar profesyonel,etkileyici,mobil uyumlu ve etkileyişi kolay anlaşıla bilir olunursa o kadar dikkat çeker ve
    ilgi görürsünüz.

    Mersin web sitesi, İnternet tarayıcılarında tüm
    arama motorlarında özelliklede google’de ilk sıraya gelmek ziyaretçilerin görüntüleyebileceği özel olarak tasarlanan,hazırlanan bir tasarım olan dijital web tasarımı,
    HTML dilinde olup yazılım web designer uzmanları tarafından yapılır.
    Web Sitesi Tasarım Firması Olarak Geliştirdiğimiz.

    En İyi Web Tasarım Projelerimiz Güçlü Seo Alt Yapısı İle Googlede Hızla Yükselir.
    Web Tasarım Firması Arıyor İseniz Doğru Adrestesiniz.
    En İyilerini Biz Yaparız.

    Reply
  82. Web tasarım

    BİZLERİ DAHA YAKINDAN TANIYINIZ
    Web tasarım Bizler 15 yıllık tecrübemiz ile siz müşterilerimizin hayal
    ettiği hedeflediği olması gerektiği yere googlede ilk sıralara yükselttik.

    Bizler gücümüzü sizlerden alıyoruz.

    MİSYONUMUZ
    Mersin web tasarım Kısa zaman içerisinde çok büyük gelişmeler gösteren internet
    teknolojisinde siz müşterilerimizle beraber çözüm odaklı çalışarak iş hacminize yönelik en uygun projeleri öneriyoruz.

    TESLİMAT
    Projenin teslimat süresi projenin zorluk derecesine bağlıdır.
    Belirlenen tasarım grafikerler tarafından tasarlanır size sunulur beğendiğiniz takdirde web tasarımcılarımız kodlamaya başlarlar proje bittiminde sizleri ofisinizde ziyaret ederek sunumumuzu gerçekleştirip teslimatımızı yaparız.

    Reply
  83. beylikdüzü pedagog

    Bahçeşehir psikoloji olarak İstanbulun bir çok ilçesinde hizmet vermekteyiz.
    Başta beylikdüzü pedagog, avcılar psikolog, küçükçekmece psikolog olmak üzere hizmet vermeyi sürdürüyoruz.
    Psikolojik danışmanlık hizmeti almak için hemen bizimle iletişime
    geçebilirsiniz.

    Reply
  84. ShanteIOsmun

    Excellent blog here! Also your website loads
    up fast! What hosting company are you currently using? May I obtain your
    affiliate connect to your host? If only my website loaded up as quickly as yours lol

    Here is my web blog: ShanteIOsmun

    Reply
  85. zenwriting.net

    My spouse and I stumbled over here different web address and thought I might check things out.
    I like what I see so i am just following you. Look forward
    to going over your web page yet again.

    Reply
  86. www.openlearning.com

    Excellent post. I was checking constantly this blog and I’m inspired!

    Extremely helpful info specifically the last part 🙂 I maintain such information a lot.

    I was seeking this certain information for a long time.
    Thanks and good luck.

    Reply
  87. avcılar psikolog

    Bahçeşehir psikoloji olarak İstanbulun bir çok ilçesinde
    hizmet vermekteyiz. Başta beylikdüzü pedagog, avcılar psikolog, küçükçekmece psikolog olmak üzere hizmet vermeyi sürdürüyoruz.
    Psikolojik danışmanlık hizmeti almak için hemen bizimle iletişime geçebilirsiniz.

    Reply
  88. thaimaalainen hieronta Vaasa

    Hey there would you mind stating which blog platform
    you’re using? I’m looking to start my own blog soon but I’m having a difficult time making a decision between BlogEngine/Wordpress/B2evolution and Drupal.
    The reason I ask is because your layout seems
    different then most blogs and I’m looking for something unique.
    P.S Apologies for getting off-topic but I had to ask!

    Reply
  89. hotel

    Spot on with this write-up, I honestly think this web site needs a lot more attention. I’ll probably be returning to read through more, thanks
    for the advice!

    Reply
  90. küçükçekmece psikolog

    Bahçeşehir psikoloji olarak İstanbulun bir çok ilçesinde hizmet vermekteyiz.
    Başta beylikdüzü pedagog, avcılar psikolog, küçükçekmece psikolog olmak üzere hizmet vermeyi sürdürüyoruz.
    Psikolojik danışmanlık hizmeti almak için hemen bizimle iletişime geçebilirsiniz.

    Reply
  91. ericknanm.bloggersdelight.dk

    I was curious if you ever considered changing the page layout of your website?

    Its very well written; I love what youve got to say.
    But maybe you could a little more in the way of content so people could connect with it better.
    Youve got an awful lot of text for only having one or
    2 images. Maybe you could space it out better?

    Reply
  92. knoxvplp128.trexgame.net

    Hey there fantastic blog! Does running a blog like this require a great deal of work?
    I’ve very little understanding of programming but I
    had been hoping to start my own blog soon. Anyhow,
    should you have any suggestions or techniques for new
    blog owners please share. I know this is off topic however I just needed to ask.

    Appreciate it!

    Reply
  93. postheaven.net

    Hi there I am so grateful I found your site, I really found you by error,
    while I was searching on Aol for something else, Nonetheless
    I am here now and would just like to say thank you for
    a remarkable post and a all round thrilling blog (I also love
    the theme/design), I don’t have time to read it all at the moment but I have book-marked
    it and also included your RSS feeds, so when I have time
    I will be back to read a great deal more, Please
    do keep up the great work.

    Reply
  94. we just did 46 hat

    I’m amazed, I must say. Rarely do I come across a blog that’s both educative and amusing,
    and let me tell you, you’ve hit the nail on the head. The problem is something which too few folks are speaking intelligently
    about. I am very happy I stumbled across this during my hunt
    for something concerning this.

    Reply
  95. 솔레어카지노

    wonderful put up, very informative. I’m wondering why the opposite specialists of this sector don’t understand this.

    You must continue your writing. I’m confident,
    you have a great readers’ base already!

    Reply
  96. galenacvfc.nation2.com

    With havin so much content do you ever run into any problems of plagorism or copyright infringement?
    My site has a lot of unique content I’ve either created myself or outsourced
    but it seems a lot of it is popping it up all over the web without my permission. Do
    you know any techniques to help protect against content from being ripped off?
    I’d really appreciate it.

    Reply
  97. 더킹카지노

    We’re a group of volunteers and opening a new scheme in our community.
    Your site provided us with valuable information to work on. You have done an impressive
    job and our whole community will be thankful to you.

    Reply
  98. 바카라

    Greetings from Carolina! I’m bored at work so I decided to check out
    your site on my iphone during lunch break. I love the information you provide here and can’t wait to take a look when I get home.
    I’m surprised at how fast your blog loaded on my cell phone ..

    I’m not even using WIFI, just 3G .. Anyhow, good blog!

    Reply
  99. reidcldu955.lucialpiazzale.com

    Hello there, I discovered your website via Google even as
    searching for a similar subject, your site came up, it seems
    good. I have bookmarked it in my google bookmarks.

    Hi there, simply become alert to your weblog thru Google, and
    located that it’s really informative. I’m going
    to watch out for brussels. I’ll be grateful in the event you proceed this in future.
    Lots of other folks will be benefited out of your writing.
    Cheers!

    Reply
  100. dallaszxqv395.creatorlink.net

    I am extremely impressed with your writing
    skills as well as with the layout on your blog. Is this a paid theme or
    did you customize it yourself? Either way keep up the nice quality writing, it’s rare to see
    a nice blog like this one these days.

    Reply
  101. escort

    Cinsel ilişkilerimde terlemeni, biraz zorlanmanı bekliyorum.
    Karşısında escort bayan görünce iki dakika içerisinde çözülen erkekler ile birlikte olmayı
    genelde tercih etmiyorum.

    Görüşme esnasında aceleye getirip sizi hemen göndermenin çabasında olmayıp, sizinle sevgiliniz gibi görüşüyorum.
    Ve haklı olarak 2 dakika işini halledip bırakıp gidecek erkekler
    ile de görüşmek istemiyorum.
    Ne kadar bu işi para için yapıyor olsak da
    tüm bayanlar gibi bizimde hislerimiz var. Benim önceliğim yatakta doyumsuz şekilde
    sevişebileceğim erkekler ile düzenli olarak görüşmek.

    Reply
  102. dallaszxqv395.creatorlink.net

    Hi just wanted to give you a quick heads up and let you know a few of the images aren’t
    loading properly. I’m not sure why but I think its a linking issue.
    I’ve tried it in two different internet browsers and both show the same results.

    Reply
  103. http://jeffreyterj678.wpsuo.com/why-nobody-cares-about-kajino

    Hey! I understand this is sort of off-topic however
    I needed to ask. Does managing a well-established blog
    such as yours take a massive amount work? I’m completely new to operating
    a blog but I do write in my diary on a daily basis.
    I’d like to start a blog so I can share my personal experience
    and feelings online. Please let me know if you have any
    suggestions or tips for brand new aspiring blog owners. Thankyou!

    Reply
  104. tullydanzer45.wixsite.com

    Fantastic goods from you, man. I’ve be aware your stuff
    previous to and you are simply extremely excellent.

    I really like what you have got here, certainly like what you
    are stating and the way in which wherein you say it. You make it enjoyable and
    you still take care of to stay it wise. I cant wait to learn far more
    from you. That is really a terrific web site.

    Reply
  105. keeganbfvu511.hatenablog.com

    Hi! I know this is sort of off-topic but I had to ask. Does
    managing a well-established blog such as yours require a lot of work?
    I am completely new to blogging but I do write in my diary every day.
    I’d like to start a blog so I can share my experience and feelings
    online. Please let me know if you have any kind of recommendations or tips for brand new aspiring blog owners.
    Thankyou!

    Reply
  106. escort bayan

    Parasını aldıktan sonrası önemli değil diyen dünya umurlarında olmayan tiplerden hiç
    olmadım. Benim için bu kesin bir şekilde her zaman önemli oldu.
    Profesyonel ilişki diye kendi arzularımı, arka plana mı
    atacağım? Tabii ki hayır! Mutlaka dikkat edilmesi gereken ilk şey, gecemizin hakkını vermektir.

    Arzularımız tabii ki ilk hedefimiz. Güvenilir, tiziz
    ve sağlıklı escort bayanlarız. Bu nedenle görüşme yapacak olduğumuz erkeklere dikkat ederiz.

    Reply
  107. juliusgpjw808.tearosediner.net

    Greetings! Quick question that’s completely off topic.
    Do you know how to make your site mobile friendly? My website looks weird when viewing
    from my apple iphone. I’m trying to find a template or plugin that might be able to
    correct this problem. If you have any suggestions, please share.
    Appreciate it!

    Reply
  108. israeluaqe544.cavandoragh.org

    Thanks for ones marvelous posting! I definitely enjoyed
    reading it, you might be a great author. I will always bookmark your blog and will come back later on. I want to encourage
    you to continue your great job, have a nice morning!

    Reply
  109. devinnygh189.yousher.com

    I don’t even know the way I ended up right here, however I believed this post used to be good.
    I do not know who you’re however definitely you
    are going to a well-known blogger for those who are not already.
    Cheers!

    Reply
  110. bit.ly

    whoah this weblog is wonderful i really like reading your posts.
    Keep up the great work! You already know, lots of individuals are searching around for
    this information, you can help them greatly.

    Reply
  111. pbase.com

    Very good site you have here but I was curious if you knew of any community forums that cover the same topics discussed in this article?
    I’d really love to be a part of online community where I can get advice
    from other knowledgeable individuals that share the same interest.
    If you have any recommendations, please let me know. Appreciate
    it!

    Reply
  112. pbase.com

    I was extremely pleased to uncover this website.
    I want to to thank you for ones time due to this fantastic read!!
    I definitely really liked every little bit of it and I have you book-marked to look at new information on your site.

    Reply
  113. blogfreely.net

    Have you ever thought about writing an ebook or guest authoring on other sites?
    I have a blog based on the same ideas you discuss and would love to
    have you share some stories/information. I know my visitors would value
    your work. If you are even remotely interested, feel free
    to send me an e mail.

    Reply
  114. josueuoot762.bravesites.com

    Just wish to say your article is as amazing. The clarity in your
    post is simply spectacular and i could assume
    you’re an expert on this subject. Fine with your permission let me to grab your RSS feed to keep updated with forthcoming post.
    Thanks a million and please keep up the enjoyable work.

    Reply
  115. www.openlearning.com

    I’m not sure the place you are getting your info,
    but good topic. I needs to spend some time finding out more or working out more.
    Thanks for excellent information I used to be looking for this info for my mission.

    Reply
  116. kyleryuzj439.bravesites.com

    I know this if off topic but I’m looking into starting my own weblog and was
    wondering what all is required to get setup? I’m assuming
    having a blog like yours would cost a pretty penny?
    I’m not very web smart so I’m not 100% sure. Any recommendations or advice would be greatly
    appreciated. Thanks

    Reply
  117. israeluaqe544.cavandoragh.org

    Hello would you mind sharing which blog platform you’re using?

    I’m going to start my own blog soon but I’m having a hard time making a decision between BlogEngine/Wordpress/B2evolution and Drupal.
    The reason I ask is because your design and style seems different
    then most blogs and I’m looking for something unique.
    P.S Sorry for getting off-topic but I had to ask!

    Reply
  118. https://diigo.com/0iwnm8

    Today, I went to the beachfront with my kids. I found a sea shell and gave it to my 4 year old daughter and said “You can hear the ocean if you put this to your ear.” She put the shell to her ear and screamed.
    There was a hermit crab inside and it pinched her ear.
    She never wants to go back! LoL I know this is
    entirely off topic but I had to tell someone!

    Reply
  119. www.liveinternet.ru

    I do not even understand how I stopped up here, however
    I thought this publish was once good. I do not realize who you are but certainly you’re
    going to a well-known blogger if you happen to aren’t already.

    Cheers!

    Reply
  120. galenacvfc.nation2.com

    Hello there! This is my first visit to your blog!
    We are a team of volunteers and starting a new initiative in a community in the same niche.

    Your blog provided us valuable information to work on. You have done a wonderful
    job!

    Reply
  121. kameronksih693.wordpress.com

    Have you ever considered creating an ebook or guest authoring on other sites?
    I have a blog based on the same ideas you discuss
    and would love to have you share some stories/information. I know my visitors would appreciate your work.
    If you’re even remotely interested, feel free to send me an e mail.

    Reply
  122. pbase.com

    Hi! I simply want to give you a big thumbs up for the
    excellent information you have got right here on this post.
    I’ll be returning to your blog for more soon.

    Reply
  123. www.liveinternet.ru

    Hello there! This blog post could not be written any better!

    Looking at this article reminds me of my previous roommate!
    He continually kept talking about this. I am going to send this article to him.
    Pretty sure he will have a great read. Thanks for sharing!

    Reply
  124. penzu.com

    Have you ever thought about writing an ebook or guest authoring
    on other websites? I have a blog centered on the same ideas you discuss and would really like to have you share some stories/information. I know
    my visitors would value your work. If you are even remotely interested, feel free to send me an e mail.

    Reply
  125. remingtonajtf114.shutterfly.com

    I do consider all the concepts you have offered in your post.
    They’re really convincing and can certainly work.
    Nonetheless, the posts are very short for
    novices. May just you please prolong them a
    bit from subsequent time? Thank you for the post.

    Reply
  126. www.openlearning.com

    I have to thank you for the efforts you’ve put in penning this
    blog. I really hope to see the same high-grade blog posts by you later on as well.
    In fact, your creative writing abilities has motivated me to get my very own website
    now 😉

    Reply
  127. http://keegannmux868.theglensecret.com/10-principles-of-psychology-you-can-use-to-improve-your-ulikajino

    May I just say what a relief to discover an individual who really understands what they’re talking about on the
    internet. You actually realize how to bring a problem to light and make it important.

    More and more people should check this out and understand this side of your story.
    It’s surprising you aren’t more popular because you surely
    possess the gift.

    Reply
  128. www.evernote.com

    Howdy! I know this is kinda off topic but I
    was wondering which blog platform are you using for this website?
    I’m getting sick and tired of WordPress because I’ve had issues with hackers and I’m
    looking at options for another platform. I would be fantastic if you could point me in the direction of a good platform.

    Reply
  129. postheaven.net

    It is perfect time to make some plans for the future and it is time to
    be happy. I’ve learn this put up and if I may just I desire to suggest you
    few attention-grabbing things or suggestions. Perhaps you can write
    next articles regarding this article. I desire
    to read more things approximately it!

    Reply
  130. section-5fa859522ca33

    Greetings! Quick question that’s completely off topic.

    Do you know how to make your site mobile friendly? My site
    looks weird when browsing from my apple iphone.
    I’m trying to find a theme or plugin that might
    be able to correct this issue. If you have any recommendations,
    please share. Cheers!

    Reply
  131. donovanyuyk856.hatenablog.com

    Very good website you have here but I was wondering if you knew of
    any discussion boards that cover the same topics talked about in this article?
    I’d really love to be a part of community where I can get suggestions
    from other knowledgeable people that share the same interest.
    If you have any suggestions, please let me know.
    Thank you!

    Reply
  132. penzu.com

    At this time it sounds like BlogEngine is the preferred blogging
    platform available right now. (from what I’ve read) Is that what
    you’re using on your blog?

    Reply
  133. andreslbnv697.tearosediner.net

    Hi there! This post could not be written much better!
    Looking at this post reminds me of my previous roommate! He continually kept preaching about this.
    I am going to forward this post to him.
    Fairly certain he’ll have a great read. Many thanks for sharing!

    Reply
  134. kameronksih693.wordpress.com

    Hi there! I could have sworn I’ve been to this blog before but after browsing through some of the post
    I realized it’s new to me. Anyhow, I’m definitely happy I
    found it and I’ll be book-marking and checking back frequently!

    Reply
  135. www.liveinternet.ru

    Wonderful work! That is the type of information that are meant to be shared
    around the net. Shame on the seek engines for no longer positioning this submit higher!
    Come on over and seek advice from my site . Thank you =)

    Reply
  136. builders glasgow southside

    I am extremely inspired along with your writing talents and also with the format for your blog. Is that this a paid topic or did you customize it yourself? Anyway keep up the excellent quality writing, its uncommon to see a nice weblog like this one nowadays..

    Reply
  137. telegra.ph

    I was curious if you ever thought of changing the page layout of your
    site? Its very well written; I love what youve
    got to say. But maybe you could a little more in the way of content so people
    could connect with it better. Youve got an awful lot of text for only having one
    or 2 pictures. Maybe you could space it out better?

    Reply
  138. penzu.com

    Heya i’m for the first time here. I came across
    this board and I to find It really helpful & it helped me out much.
    I’m hoping to offer something back and help others such as you aided me.

    Reply
  139. cashuqhs865.wordpress.com

    Have you ever considered creating an ebook or guest authoring
    on other blogs? I have a blog based upon on the same subjects you discuss and would really like to have you share
    some stories/information. I know my viewers would value your work.
    If you are even remotely interested, feel free to shoot me an e-mail.

    Reply
  140. section-5fa846a181585

    hey there and thank you for your info – I have definitely picked up anything new from right here.

    I did however expertise some technical issues using this site,
    as I experienced to reload the web site lots of times previous to I could get it to
    load correctly. I had been wondering if your web hosting is OK?
    Not that I am complaining, but sluggish loading instances times will often affect your placement in google and could damage your quality
    score if ads and marketing with Adwords. Well I am adding this RSS to my email and could look
    out for much more of your respective exciting content.
    Make sure you update this again soon.

    Reply
  141. mylesuaqr927.creatorlink.net

    Write more, thats all I have to say. Literally, it seems as though you relied on the video to make your point.
    You definitely know what youre talking about, why waste your intelligence on just posting
    videos to your site when you could be giving us something
    informative to read?

    Reply
  142. gunnergftu374.lowescouponn.com

    Does your blog have a contact page? I’m having trouble locating it
    but, I’d like to shoot you an e-mail. I’ve
    got some ideas for your blog you might be interested
    in hearing. Either way, great blog and I look forward to seeing it
    grow over time.

    Reply
  143. erickgezr688.bravesites.com

    Hello! Do you know if they make any plugins to
    assist with Search Engine Optimization? I’m trying to get my
    blog to rank for some targeted keywords but I’m not seeing very
    good success. If you know of any please share.
    Many thanks!

    Reply
  144. penzu.com

    I like the helpful information you provide in your articles.
    I will bookmark your weblog and check again here
    regularly. I’m quite sure I will learn a lot of new stuff right here!

    Good luck for the next!

    Reply
  145. https://diigo.com/0iwotr

    Hi! Someone in my Facebook group shared this website with us so I
    came to look it over. I’m definitely loving the information. I’m book-marking and will be tweeting this to my followers!
    Fantastic blog and fantastic design and style.

    Reply
  146. Robt Reaves

    I blog often and I truly thank you for your information. This article has really peaked my interest. I will book mark your site and keep checking for new details about once per week. I subscribed to your Feed as well.

    Reply
  147. donovanttuj082.image-perth.org

    After going over a few of the articles on your website, I honestly
    appreciate your way of writing a blog. I book marked it to my bookmark site list
    and will be checking back soon. Take a look at my web site as well and
    tell me what you think.

    Reply
  148. writeablog.net

    I think this is among the most vital info for me. And i am glad reading your article.
    But wanna remark on some general things, The web site style is ideal,
    the articles is really excellent : D. Good job, cheers

    Reply
  149. hang tra am tu sa

    Wow! This can be one particular of the most beneficial blogs We have ever arrive across on this subject. Basically Great. I am also a specialist in this topic so I can understand your hard work.

    Reply
  150. b3.zcubes.com

    hello!,I like your writing very much! proportion we communicate extra about your article on AOL?

    I require an expert on this space to unravel my problem. May be that’s you!
    Having a look forward to see you.

    Reply
  151. b3.zcubes.com

    Pretty great post. I just stumbled upon your blog and
    wanted to say that I have really loved browsing your weblog posts.
    In any case I’ll be subscribing on your feed and I’m hoping you write once
    more very soon!

    Reply
  152. https://penzu.com/p/3414bc47

    Please let me know if you’re looking for a author for your weblog.
    You have some really good articles and I feel I would be a
    good asset. If you ever want to take some of the load off,
    I’d absolutely love to write some content for your blog in exchange for a link back to mine.
    Please blast me an e-mail if interested.
    Regards!

    Reply
  153. b3.zcubes.com

    We’re a bunch of volunteers and opening a brand new scheme in our community.
    Your website offered us with helpful information to work on. You’ve done a
    formidable process and our entire group will probably be thankful
    to you.

    Reply
  154. lukasbkxo423.almoheet-travel.com

    The other day, while I was at work, my cousin stole my iPad
    and tested to see if it can survive a 25 foot drop, just so she can be a youtube sensation.
    My iPad is now destroyed and she has 83 views. I know this is entirely off topic but I had to share it with someone!

    Reply
  155. hangtra

    Today, I went to the beachfront with my children. I found a sea shell and gave it to my 4 year old daughter and said “You can hear the ocean if you put this to your ear.” She put the shell to her ear and screamed. There was a hermit crab inside and it pinched her ear. She never wants to go back! LoL I know this is totally off topic but I had to tell someone!

    Reply
  156. titusreic094.almoheet-travel.com

    Good day! This post couldn’t be written any
    better! Reading through this post reminds me of
    my previous room mate! He always kept talking about this.
    I will forward this page to him. Fairly certain he will
    have a good read. Thanks for sharing!

    Reply
  157. vingle.net

    Have you ever thought about including a little bit more than just your articles? I mean, what you say is valuable and all. However think of if you added some great graphics or video clips to give your posts more, “pop”! Your content is excellent but with pics and video clips, this website could certainly be one of the greatest in its niche. Superb blog!

    Reply
  158. blogfreely.net

    I like the helpful info you provide in your articles.
    I’ll bookmark your weblog and check again here regularly.
    I am quite certain I will learn many new stuff right here! Good luck for the next!

    Reply
  159. www vingle net

    Good day! I know this is kind of off topic but I was wondering which blog platform are you using for this website? I’m getting tired of WordPress because I’ve had issues with hackers and I’m looking at options for another platform. I would be awesome if you could point me in the direction of a good platform.

    Reply
  160. click here.

    I have been browsing on-line more than three hours as of late, but I by no means discovered any fascinating article like yours. It is beautiful worth sufficient for me. In my opinion, if all website owners and bloggers made excellent content as you probably did, the web will likely be much more useful than ever before.

    Reply
  161. deskdesirespa

    I happen to be commenting to let you know of the terrific discovery my wife’s girl found reading through yuor web blog. She came to understand a good number of details, not to mention how it is like to have a marvelous coaching mindset to make the others very easily learn about specified complicated subject matter. You actually surpassed visitors’ expectations. Thanks for imparting such necessary, safe, explanatory and even fun tips about your topic to Tanya.

    Reply
  162. www vingle net

    Hi there! This post couldn’t be written any better! Reading this post reminds me of my good old room mate! He always kept chatting about this. I will forward this post to him. Fairly certain he will have a good read. Thanks for sharing!

    Reply
  163. vingle

    Hey there! I know this is kind of off topic but I was wondering if you knew where I could find a captcha plugin for my comment form? I’m using the same blog platform as yours and I’m having trouble finding one? Thanks a lot!

    Reply
  164. www vingle net

    Neat blog! Is your theme custom made or did you download it from somewhere? A design like yours with a few simple tweeks would really make my blog stand out. Please let me know where you got your theme. Thanks

    Reply
  165. our site

    hello!,I like your writing very a lot! percentage we keep in touch more about your article on AOL? I need an expert on this area to resolve my problem. May be that’s you! Having a look ahead to peer you.

    Reply
  166. writeablog.net

    It’s actually a cool and helpful piece of information. I am happy that you just shared this helpful
    information with us. Please keep us up to date like this.
    Thank you for sharing.

    Reply
  167. hangtraamtusa

    Nice blog! Is your theme custom made or did you download it from somewhere? A design like yours with a few simple tweeks would really make my blog shine. Please let me know where you got your theme. Thanks

    Reply
  168. hangtra

    Terrific work! This is the type of info that should be shared around the internet. Shame on Google for not positioning this post higher! Come on over and visit my website . Thanks =)

    Reply