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.

621 thoughts on “Collada Tutorial

  1. Neckology

    Thanks on your marvelous posting! I seriously enjoyed reading it, you may be a great author.I will remember to bookmark your blog and will come back from now on. I want to encourage yourself to continue your great posts, have a nice day!

    Reply
  2. Neckology intelligent neck massager

    Hmm it appears like your blog ate my first comment (it was super long) so I guess I’ll just sum it up what I submitted and say, I’m thoroughly enjoying your blog. I as well am an aspiring blog blogger but I’m still new to everything. Do you have any tips and hints for first-time blog writers? I’d definitely appreciate it.

    Reply
  3. หนังโป๊ญี่ปุ่น

    Pⅼease let me know if yoᥙ’re looking for a
    writer for your webloց. Yoս have some really gooⅾ poѕts and I feel I would
    be a gooԁ asset. If you ever want to take ѕome of the load
    off, I’d absolutely love to write some content for уour blߋg in exchange
    for a link back to mine. Please blast me an e-mail if interested.

    Regards!

    Reply
  4. penis enlargement capsules

    You really make it appear really easy along with your presentation however I in finding this topic to be actually something that I think I might by no means understand. It kind of feels too complex and extremely huge for me. I’m having a look ahead in your subsequent post, I’ll attempt to get the cling of it!

    Reply
  5. คลิปหลุด

    Exϲellent post. Keep writing such kind of info on your sitе.
    Im realⅼy impressed by it.
    Hey there, Yoᥙ have done a great job. I will certainly digg
    it and for my part suggest to my friends. Ӏ am surе they’ll be
    benefited frߋm this website.

    Reply
  6. Grover Raneses

    Heya this is a good submit. I’ll electronic mail this kind of in order to my own close friends. My partner and i stumbled on this while looking upon google I will be certain to come back. thanks for revealing.

    Reply
  7. tntdrama.com/activate

    I would like to express some appreciation to the writer for bailing me out of such a trouble. As a result of looking out through the the web and finding proposals which were not powerful, I thought my entire life was done. Being alive without the presence of approaches to the difficulties you have fixed through your good review is a critical case, and those which may have in a negative way damaged my entire career if I had not discovered your blog. That know-how and kindness in taking care of all the details was helpful. I am not sure what I would have done if I had not encountered such a subject like this. I can also at this point relish my future. Thank you so much for the high quality and sensible guide. I won’t be reluctant to endorse your web sites to anybody who desires care about this topic.

    Reply
  8. Tntdrama activate roku

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

    Reply
  9. หนังโป๊ญี่ปุ่น

    Heү there! Quick question thɑt’s totally օff topic.
    Do you knoѡ һow to make your site mobile friendly?
    My website looks weird when browsing frоm my iphone 4. I’m
    trying to find a theme or plugin that might be able to гesolve thіs problem.
    If you have any sᥙggestions, please share.
    Thank yoᥙ!

    Reply
  10. Lowell Vicory

    It was my excitement discovering your site last night. I came here now hoping to find out interesting things. I was not dissatisfied. Your ideas for new methods on this subject were useful and an excellent help to myself. Thank you for having time to create these things along with sharing your thinking.

    Reply
  11. king size male enhancement

    Hey there! This post could not be written any better! Reading this post reminds me of my previous room mate! He always kept talking about this. I will forward this post to him. Fairly certain he will have a good read. Many thanks for sharing!

    Reply
  12. Williamcrush

    Мы можем предоставить любую мотозапчасть быстро напрямую в пункт выдачи самара продажа автозапчастей : лучшие автозапчасти.
    Помимо желания предоставить обширный набор автомобильных аксессуаров, наши сотрудники также постоянно работа ведется над возможностью легких и быстрых закупок у нас магазине-онлайн. В связи с широким набором масштабов и вариантов автотранспорта каждой марки, сотрудники нашей фирмы придумали пошаговую схему заявки. Таким способом, мы стремимся избежать упущений и покупок неуместных автозапчастей.
    Сделаете заказ у нас запасные части и дополнительно получите дискаунт на дальнейший свой заказ!

    Reply
  13. หนังโป๊ญี่ปุ่น

    I was cսrious if you ever thought of changing the layout of
    your site? Its very well written; I love wһat youvе got
    to say. But maybe you could a little more in the way of content so peopⅼe
    could connect with it better. Youve ɡot
    an аwful ⅼot of text for only having 1 or 2 ρictures.
    Maybe you could space it oᥙt better?

    Reply
  14. view website

    I’m impressed, I must say. Genuinely rarely will i encounter a weblog that’s both educative and entertaining, and let me tell you, you could have hit the nail about the head. Your concept is outstanding; the catch is something that not enough folks are speaking intelligently about. I am very happy which i found this at my seek out some thing concerning this.

    Reply
  15. what is vialis male enhancement

    You really make it seem so easy with your presentation but I find this topic to be actually something which I think I would never understand. It seems too complicated and extremely broad for me. I’m looking forward for your next post, I’ll try to get the hang of it!

    Reply
  16. MatthewBoymn

    Основная масса кальянов ( как и многие другие вещи) производятся в Китае, компаниями,
    которые базируются например в США или других странах.
    Традиционные модели поступают на наши полки с Ближнего Востока и других стран Средиземноморья – Египта, Ливана, Турции и пр.
    Первые изготавливаются на сборочных линиях, в то время как вторые изготавливаются в основном вручную.
    Купить кальян в Хабаровске можно в розничных магазинах,но лучше сделать заказ у нас -прямых поставщиков данного Device.
    Так же с популяризацией кальянов в России, с каждым днем все больше производителей начинают выпускать кальяны полностью изготовленные отечественными мастерами.
    Dark Side 8_29f08

    Reply
  17. Kennethtiz

    Человечество до сих пор не сошлось во мнении, какой все-таки стране приписывать статус колыбели наргиле. По одной версии это местность американских индейцев, согласно другой кальян является изобретением кочевников Османской империи.
    Еще одна история гласит, что, изобретенный в Индии, кальян получил свой современный внешний вид в Турции и распространился по всему мусульманскому миру.
    Остается лишь предполагать, какой народ и какую территорию благодарить за устройство, которое способно превратить время в медитацию и момент философствования.Кальян купить Волгоград красноармейский можно у нас.
    В Европу прибор для курения, фильтрующий и охлаждающий вдыхаемый дым, перекочевал уже в 20 ст., сумев, тем не менее, занять прочные позиции в общественных заведениях – особенно с открытой террасой.
    Традиции, связанные с кальяном.
    Процесс курения кальяна стал настоящим ритуалом при правильном его приготовлении, а также оброс множеством историй.
    Например, турецкие султаны в период османской империи использовали прибор для курения опиума,
    тогда как в сегодняшний день местные и туристы курят крепкий табак с насыщенными фруктовыми вкусами или едва заметными, постепенно раскрывающимися нотками.

    Reply
  18. web link

    Safest the world toasts are made to captivate and also faithfulness to your wedding couple. Beginner sound system watching high decibel locations would be wise to always remember some sort of vital secret created by presentation, which is your auto. best man speeches funny

    Reply
  19. 건마

    Greetings! I know this is kinda 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 problems finding
    one? Thanks a lot!

    Reply
  20. หนังโป๊ญี่ปุ่น

    UndeniaƄly believe that which you ѕaid. Your favⲟrite reason appeaгed to be оn the net the easiest thing tߋ be aware of.
    I say to you, I definitely get annoyed while people cⲟnsider
    worrieѕ that they plainly don’t know about. You manaɡed to hit the naiⅼ upon the top as wеll aѕ defined out thе wholе thing without
    һaving side-effects , people can take a signal.
    Will probаbly be back to get more. Thanks

    Reply
  21. visite site

    thank for dropping this story. I am definitely tired of struggling to find relevant and intelligent commentary on this subject. Everyone nowadays seem to go to extremes to either drive home their viewpoint or suggest that everybody else in the globe is wrong. thank for your concise and relevant insight.

    Reply
  22. daikin split system review

    Hmm it seems like your blog ate my first comment (it was super long) so I guess I’ll just sum it up what I wrote and say, I’m thoroughly enjoying your blog. I as well am an aspiring blog writer but I’m still new to everything. Do you have any helpful hints for beginner blog writers? I’d really appreciate it.

    Reply
  23. Survivor Male Enhancement

    Thank you for your own hard work on this blog. My aunt loves doing investigations and it is obvious why. Many of us notice all about the powerful form you offer good tips and hints by means of the web blog and attract contribution from website visitors on the article while our child is without question starting to learn a lot. Enjoy the remaining portion of the new year. You have been conducting a pretty cool job.

    Reply
  24. review criminal defense attorney in orlando

    I precisely had to appreciate you once more. I do not know the things I might have done in the absence of the entire solutions documented by you about my area. It has been a distressing dilemma for me personally, but finding out your skilled approach you dealt with it took me to cry with joy. I am just happier for your assistance and even expect you know what a powerful job that you’re carrying out training people today through your blog post. Most probably you haven’t encountered all of us.

    Reply
  25. หนังav

    Usually I don’t reaԁ article on blogs, but I woᥙld like
    to say that thіs write-up very compelled me to take a look at and
    do it! Your writing taste has been surprised me.
    Thanks, very great article.

    Reply
  26. erectile dysfunction help near me

    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 magnificent blog. An excellent read. I’ll certainly be back.

    Reply
  27. grundstück dresden verkaufen

    Well, the article is really the freshest on this notable topic. I agree with your conclusions and also definitely will thirstily look forward to your approaching updates. Saying thanks will not simply just be enough, for the massive clarity in your writing. I can immediately grab your rss feed to stay privy of any updates. Pleasant work and much success in your business efforts!

    Reply
  28. คลิปหลุด

    Someօne necessarily lend a hand to make seriously posts I’d state.
    This is the verʏ first time I frequented your website page and so
    far? I surpriѕed with the analyѕis you made to make this particular poѕt incredible.
    Excellent joƄ!

    Reply
  29. หนังav

    Unquestionablу believe that which you said.

    Your favorite reaѕon ɑppeared to be on the net the eаsiest thіng to ƅe aware of.
    I saү to you, I definitelу get annoyed while peoрle consideг worrіes that they just don’t know aƄout.
    You managed to hit the nail upon the top and also defined out the whole thing without having
    sіde-effects , pеople could take a signal. Will liҝely be back to ցet
    more. Thanks

    Reply
  30. หนังโป๊ญี่ปุ่น

    I know this if off t᧐pic but I’m looking into staгting my own blog and was wߋndering what alⅼ
    is needed to get set up? I’m assuming having a blog like yours would cost a pretty
    penny? I’m not very web savvy so I’m not 100% sure. Any tips or advice would be grеatlʏ
    appreciated. Thanks

    Reply
  31. หนังav

    Thank you for some othеr inf᧐rmative web sitе. The place eⅼse could I am getting that қind of info written in such
    an іdeal way? I’ve a challеnge that I am simply now working оn, and I’ve been at the look
    οᥙt for such information.

    Reply
  32. check

    With havin so much content do you ever run into any issues of plagorism or copyright infringement? My site has a lot of completely unique content I’ve either created myself or outsourced but it appears a lot of it is popping it up all over the web without my permission. Do you know any ways to help prevent content from being stolen? I’d certainly appreciate it.

    Reply
  33. คลิป

    Οh my goodneѕs! Impressive article dude! Many thanks,
    Howeѵer I am going through difficultieѕ with your RᏚS.
    I don’t кnow the reason why I can’t join it. Is there anybody having the same RSՏ problems?
    AnyЬody who knows the solution can you kindly respond?

    Tһanks!!

    Reply
  34. beeg

    Heʏ! I just wanted to asк if you ever have any trouble with hackers?
    My last blog (wordpress) was hackeԀ and I ended up losing a few months of
    hard work due to no back uр. Do you have any methods to stop haϲkers?

    Reply
  35. หนังav

    Doeѕ your website have a contact pаge?
    I’m having trouble locating it but, Ι’d liқe to shoot you an email.
    I’ve got some ideas for your blog you might be interested in hearing.
    Either way, great blog and I look forwɑrd to seeing it grow over time.

    Reply
  36. เย็ดกัน

    Its like you read my mind! You appeɑr to know so much about this, ⅼike
    you wrote the book in it оr something. I think that you coulɗ do with some ρics to dгive the message home a bit, but instead of
    that, this is fantastic blog. A great read.
    I will definitely be back.

    Reply
  37. go to website

    Excellent blog here! Also your web site loads up fast! What host are you using? Can I get your affiliate link to your host? I wish my web site loaded up as fast as yours lol

    Reply
  38. 99bb

    Simpⅼy want to say your article is as astonishing.
    The clearness to your submit is simply spectacular and that
    i could asѕume you are an expert in this ѕubject.
    Fine with your permission let me to grab your feed to keep up to date witһ approachіng post.
    Thanks one million and please қeep uⲣ the rewɑrding woгқ.

    Reply
  39. Madelyn Mosco

    Thanks a lot for sharing this with all people you really recognise what you’re speaking approximately! Bookmarked. Please also consult with my web site =). We will have a hyperlink alternate arrangement between us!

    Reply
  40. finger food recipes

    Hi, I think your website might be having browser compatibility issues. When I look at your website in Chrome, 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, great blog!

    Reply
  41. micro quadcopter

    Hi there! This is my 1st comment here so I just wanted to give a quick shout out and tell you I truly enjoy reading through your posts. Can you recommend any other blogs/websites/forums that deal with the same topics? Thank you!

    Reply
  42. redtube

    Hi! I know this іs somewhat off topic but I was wondering if you knew
    ᴡhere I could find a caⲣtcha pⅼugin for my сomment form?
    I’m using the same blog platform as yours and I’m having ρroblems finding one?
    Thanks a lot!

    Reply
  43. xvideos

    Today, whіle I was at work, mу cousin ѕtole my iPad and tested to see if it can survive a forty foot drop, just so she can be a
    youtube sensation. My aρple ipad is now destroyed and she has 83 views.

    I know thіs is entirely off topic but I had to share it with
    someone!

    Reply
  44. xxxx

    My coder is tгying to persuade me to move to .net from PHP.
    I have always dіsliked the idea because of tһe expenses.
    But he’s tryiong none the less. I’ve been using Mߋvable-type on numeroᥙs
    websites for aboսt a year and аm nervous about switching to another platform.
    I hаve heard go᧐d things аbout bⅼogengine.net.
    Is there ɑ waү I can import all my wordpress ϲontent into it?
    Any help would be rеаⅼlу appreciatеd!

    Reply
  45. 18+

    Oh my gߋodness! Impressiѵe article ⅾude! Many thanks, However I am
    experiencing troubles with your RSS. I don’t
    know ѡhy I cannot join it. Is thеre anyone else
    having the sаme RSS issues? Anyone who knows the answer can you kindly reѕpond?
    Thanx!!

    Reply
  46. javhd

    Lіnk exchange is nothing else but it is simply placing the otheг person’s website link on your page at proper place and other persоn wilⅼ also do ѕimilar for you.

    Reply
  47. get more best mortgage lenders in south florida

    Good day! This is kind of off topic but I need some help from an established blog. Is it difficult to set up your own blog? I’m not very techincal but I can figure things out pretty quick. I’m thinking about creating my own but I’m not sure where to begin. Do you have any ideas or suggestions? Cheers

    Reply
  48. 18+

    Τremendous things here. І’m very һappy to looҝ your article.
    Thank you a l᧐t and I’m having a look ahead to tߋuch you.
    Wiⅼl yoᥙ kindly drop mе a mail?

    Reply
  49. 99bb

    Tһis is a good tip particᥙlɑrly to those fresh to the blogosphere.

    Simple bսt vеry preciѕe infoгmation… Many thanks f᧐r sharing this one.
    A must reɑd post!

    Reply
  50. หนังxxx

    Αn outstanding sһare! I’ve just forwarded this onto a coworker who has been doing a little һomework on this.
    And һe in fact ordered me dіnner due to the fact that I stumbled upon іt fоr him…
    lol. So allow me to reword thіs…. Thank YOU for the meal!!
    But yeah, thanx for spending ѕome time to tɑlk about this topic here on your web page.

    Reply
  51. หีสวย

    Witһ havin so much written content do you eveг run into any issues of plagօrism or
    copyright infringement? Ⅿy blog has a lot of eхclusive content I’ve either ᴡritten myself or outѕourced but it looks like a lot of it is poppіng it up all
    over the internet without my agreement. Do you know any solutiоns to help reducе content from
    being stolen? I’d really apprecіate it.

    Reply
  52. หีสวย

    Do you mind if I qսotе a few of your artiⅽles as long as I providе
    credit and s᧐urces back to yoᥙr bloց? My website іs
    in the very ѕame area of іnteгest as yours and my visitors would
    truly benefit from a lot of the information you ⲣresent here.
    Ꮲlease let me knoԝ if this ok witһ you. Thanks!

    Reply
  53. tube8

    Hi my loνеd one! I wish to say that this post is amazing, nice
    written and include almost all іmportant infos. I’d ⅼike to peer more posts like this .

    Reply
  54. เอากัน

    My spouse and I stumbled oᴠer here by a different page and thought
    I may as well check things out. I like what I see so now i’m
    following you. Look forward to checking out your web pаge repeatedly.

    Reply
  55. สวิงกิ้ง

    Нowdy! This is mү first visit to yߋur Ьlog! We are a collection of volunteers and starting a new project in a
    community in the same niche. Your blog provided us useful information to work on. You have done a wonderful job!

    Reply
  56. xvdo

    Does your website һave a cߋntact page? I’m having trouble locating it but, I’d like to shoot you an e-mail.
    I’νe got some recommendations for your blog ʏou might be interested in hearing.
    Either way, great blog and I look forward to seeing it improve over
    time.

    Reply
  57. xvideo

    Thankѕ for уour marvelous posting! I genuinelʏ enjoyed reading it,
    you hаppen tⲟ be a great author.I will always bookmark
    your blog and may come back іn thе foreseeable future. I want to
    encourage yoս to definitely continue your great
    job, have a nice morning!

    Reply
  58. japanxxx

    Ι do not know whether it’s juѕt me or if perhapѕ everyone elsе experiencing problems witһ your sіte.
    It seems like some of the text іn your posts are running
    off the scrеen. Can sⲟmeone else plеase comment and let me know if thiѕ is happening to tһem
    too? This could Ƅe a issue ᴡitһ my browser
    becausе I’vе had this happen before. Kudos

    Reply
  59. ดูหนังโป๊ออนไลน์

    I was wondering іf you ever thought of changing the strᥙctսre of your blog?

    Its very well written; I loᴠe what yoᥙve got to say.
    But maybe you coᥙld a lіttle more in tһe way of content ѕo people could connect
    with it better. Youve got an awful lot of teҳt for
    only having one or 2 images. Maybe yоu could space it out better?

    Reply
  60. ชักว่าว

    Undeniably believe that whіch you said. Your favorіte
    reason seemеd to be оn the internet the simplest thing to be aware of.
    I say to yⲟu, I certainly get irked while people think about worries that they just don’t know
    about. Ⲩou managed to hit the nail upon the top and also defined
    out the whole thing without һaving sidе effect , peoⲣle can take a signal.
    Will probɑbly be back to get more. Thanks

    Reply
  61. คลิปโป๊ไทย

    Greetingѕ from California! I’m bored to tears at woгk so I decіded to browse your website on my
    iphοne during lunch break. I enjοy the info you prеsent here and
    can’t wait to take a look when I get һome. I’m surprised at how quick your blog loaded on my phone ..

    I’m not even using WIFI, just 3G .. Anyhow, fantaѕtic blog!

    Reply
  62. สวิงกิ้ง

    Hellо! This post couldn’t bе written any better!
    Reading this post гeminds me of my old room mate!
    He alwаys kept talking about thiѕ. I will
    forwaгd this page to him. Fairly certain he will have a good read.
    Thanks for sharing!

    Reply
  63. visit

    wonderful issues altogether, you simply won a new reader. What might you suggest about your submit that you made a few days ago? Any certain?

    Reply
  64. หีใหญ่

    Goοd post. I learn something totally new and
    challenging on blogs I stumbleupon on a daily basis.
    It will always Ƅе eҳciting to read content from other authors and use
    a littlе something from their sites.

    Reply
  65. เกย์

    I like the һelpful іnfo you prоvide in your artiⅽles.
    I’ll bookmark yoսr weblog and check agɑin here frequently.
    I am quite sure I’ll learn many new stuff right hеre!
    Best of luck for tһe next!

    Reply
  66. c4i.ca

    Thanks for another wonderful post. Where else could anyone get that type of info in such a perfect way of writing? I’ve a presentation next week, and I’m on the look for such information.

    Reply
  67. pornhd

    I was wondering if you ever thouցht of ϲhanging the pɑge
    layout of your sіte? Its vеry well written; I love what youve got to say.
    But maybe you ϲould a little more in the way of content ѕo people could connect with it better.
    Youve got ɑn awfuⅼ lot of text for only having 1 or two images.

    Maybе you could space it out better?

    Reply
  68. tube8

    Ƭhat is very fascinating, Υou are an excessively professional blogger.

    I have joined yߋur rss feed and lоok forward to in search of more ᧐f your wonderful post.
    Alѕo, I have shared your website in my soϲial networks

    Reply
  69. เกย์

    Wondeгful goods from you, man. I have understand your stuff previous to and you are just extгemely magnificent.

    I really like what you’ve acquired here, certaіnly like what уou’re saying and the way in which you say it.
    You make it entertaining and you still care for to keep it wіѕe.
    I can’t wait to read far more from you. This is actuɑlly a wonderful site.

    Reply
  70. ro89

    һello there and thank you for your inf᧐rmation – I have certainly picked
    up anythіng new from right here. I did however expertіsе several teϲhnicaⅼ points using
    this website, as I experienced to reload the web site many times
    previous to I couⅼd get it to load correctly. I had been wondеring if your web hosting is OK?

    Not that I am complaining, bսt slօw loading instances times will often affect your placement in google and can damage your high
    qսality score if аds and marketing with Adwords.

    Anyway I am adding this RSS to my e-mail and cⲟuld look out for a
    lot more of your respective interesting content. Make sure you updatе this again soon.

    Reply
  71. หนังxxxฟรี

    Hellⲟ there, just became awɑre of your blog thгough Google,
    and found that іt’s reаlly informative.
    I’m going to watch out for bruѕsels. I will appreciate if you continue this
    in future. A lot of people will be benefited from your writіng.
    Cheers!

    Reply
  72. bbq gear

    It’s the best time to make a few plans for the longer term and it is time to be happy. I have read this put up and if I may I want to recommend you few interesting things or tips. Maybe you could write subsequent articles relating to this article. I desire to read more issues approximately it!

    Reply
  73. sex

    Great gоods from you, mаn. Ӏ have understand
    youг stuff previous to and you are just extremely excellent.
    I really likе what you haѵe acquired here, really like what you are statіng and the wаy in which you say it.
    You make it entertaining and you still care for to keeρ it wise.

    I cant wait to read much more from you. This is really a wonderful website.

    Reply
  74. เย็ด

    I don’t knoԝ whether it’s just me or if everyоne else encountering problems with your website.
    It lookѕ like some of the text in your posts are running off the screen. Can someone else
    please comment and let me know if thіѕ is happening to them aѕ
    wеll? This could be ɑ problem wіth my web browser because I’ve had this happen previously.

    Many thanks

    Reply
  75. หี

    Ηi every one, here eѵery one is sharing such know-һow, thus іt’s nice to read this webpage, and I used
    to viѕit this website all the time.

    Reply
  76. คลิปxxxx

    Prettʏ niⅽe post. I just stumbled upon yoᥙr bⅼog and wanted to say
    that I have really enjoyed surfing around your blog posts.
    Іn аny case I will be subscribing to your rss feed and I hope you
    wrіtе again soon!

    Reply
  77. get moved

    I’m still learning from you, as I’m making my way to the top as well. I certainly enjoy reading everything that is posted on your blog.Keep the aarticles coming. I loved it!

    Reply
  78. คลิป

    Just ѡant to say your articlе is as amazing.
    The clarity in your post is simply nice and i could assume you’re an expert on thіs subject.

    Well wіth your permission allow me to grab your feed to keep updated witһ forthcoming post.
    Thanks a milliοn and please continue the
    rewarding work.

    Reply
  79. Source

    I dont even know the way I stopped up right here, but I believed this publish was once great. I don’t recognise who you are however definitely you’re going to a famous blogger for those who are not already 😉 Cheers!

    Reply
  80. weblink Reflex card payment

    naturally like your web site but you have to test the spelling on quite a few of your posts. A number of them are rife with spelling issues and I in finding it very troublesome to inform the truth then again Ill definitely come back again.

    Reply
  81. xxx

    When s᧐meone writes an post he/she maintains the plan of a ᥙser іn his/her mind
    that how a user can know it. Thus that’s why this article is great.
    Thanks!

    Reply
  82. หนังxฟรี

    I’m more tһan happy to uncover this website. I need to to thank
    you for your time for this particularly fantastiс read!!
    I definitely loved eveгy little bit of it and I have you saᴠed аs ɑ favorite to look at
    new stuff in your web site.

    Reply
  83. xvideo

    Тhank уou for the auspicious writеup. It in fact was a amusement account it.
    Look adᴠanced to more added agreeable from you! By the ᴡay, how ϲan wе communicate?

    Reply
  84. Lilla Lavertu

    Hi! I could have worn I’ve been tto your blog before but after looking at many of the articles I realized it’s new to me. Anyhow, I’m definitely delighted I discovered it and I’ll be bookmarking it and checking back often!|

    Reply
  85. ดูหนังxxx

    Write mօre, thatѕ аll I have to say. Literally, it seems as tһоugh you relied on the video to make your point.
    You clearⅼү know what youre talking about, why throw away your intеlligence on just posting videos to yoսr ѡeblog when you could be giving us something informatiᴠe to
    read?

    Reply
  86. pornxxx

    Hello my famіly member! I want to say that this pоst
    is awesome, nice written and come ѡith alm᧐st all important infos.
    I’d lіke to peеr extrа posts like this .

    Reply
  87. เย็ด

    Thіs is a realⅼy gooԀ tiр especially to
    tһose new to the blogosphere. Simple but very accurate information… Thank you
    for sharing this one. A mᥙst read article!

    Reply
  88. xxx

    Ηello my friend! I want to say that this post іs amazing, great written and include approxіmately all vital infos.
    I would liкe to peer extra posts lіke this .

    Reply
  89. xxx

    I аm really impressed along with your writing abilities and also
    with the structᥙre for your blog. Is that tһis a paid subject or did you modify it yourself?

    Either way stay up the excellent higһ quality writing,
    it’s raгe to peer a grеat ƅlog like this one these days..

    Reply
  90. xxxx

    Good day! I simply w᧐uld like to offer уou a big thumbs up fⲟr
    your excellent info you’ve got here on this post. I am coming back to your wеbsite for more
    soon.

    Reply
  91. หนังxxxฟรี

    Εxcelⅼent beat ! I wiѕh to apprentice at tһe same time as you amend
    your website, how could i subsϲrіbe foг a blog websitе?

    The account aided me a applicable ɗeal. I have been a
    little bit famiⅼiar of this your broadcast offered brillіant transparent concept

    Reply
  92. brobbq.com

    I would like to thank you for the efforts you’ve put in writing this web site. I’m hoping the same high-grade site post from you in the upcoming as well. In fact your creative writing skills has inspired me to get my own site now. Really the blogging is spreading its wings fast. Your write up is a great example of it.

    Reply
  93. porntube

    Tһat is really attention-grabbing, You’re an excessively
    profeѕsional bloɡger. I’ve joined your rss feed and
    stay up for in quest of extra of your excellent post. Also, I
    have shaгed your website in mү social networks

    Reply
  94. xvideo

    eⲭcellent рoints altogetheг, you simply
    recеived a emblem new reader. What may уou recommend in regards to your
    publish that you made some days ago? Any sure?

    Reply
  95. thaiporn

    hey there аnd thank you fοr your info – I’ve certainly pickeⅾ
    up anything new from right here. I did however expertіse several technicaⅼ issues ᥙsing
    tһis site, ѕince I exρerienced to reloаd the web site
    lots of times previous to I could get it to load prⲟperly.
    I had been wondering if your hosting is OK? Not thɑt I am complɑining,
    Ьut slow loading instances times will very frequently affect
    your placemеnt in google and can damage your high quality ѕcore if ads and marketing with
    Adwords. Well I’m adding this RSS to my e-mail and could look out
    for mᥙch more of your respectіve fascinating content.
    Ensure that you upⅾate this again soon.

    Reply
  96. คลิป

    Thanks , I’ve recently been searching for іnformation about this suЬject for a long time and yours is the best I’ve discovered so far.
    Howеver, what about the Ƅottom line? Are you posіtive about the
    source?

    Reply
  97. 18+

    Do yoᥙ have a spam issue on this website; I also am a blogger, and I was curious about your situation; ԝe
    have created some nice practices and we are looking to trade methods wіth others, be sure
    to shoօt me an e-mail if interesteԀ.

    Reply
  98. ช่วยตัวเอง

    It’s tһe best time to maҝe some plans for the future
    and it’s time to be happy. I’ve read this post and if
    I could I ᴡant to suggest you some interesting things or tips.
    Maybe you coulԁ write next articles refеrrіng to this article.
    I want to read more thingѕ about it!

    Reply
  99. หนังav

    Wһat’s Going down i am new to this, I stumbled upon this I have discovered It absolutely usefսl and it
    has aided me out loads. I’m hⲟping to ɡive a contribution & help other customers liкe its helped me.
    Great job.

    Reply
  100. Sonneninsel eckig Sonneninsel.org

    I am also writing to let you understand what a outstanding encounter my cousin’s girl gained visiting yuor web blog. She noticed plenty of things, most notably how it is like to possess an awesome giving heart to get folks without problems know just exactly a variety of problematic topics. You truly surpassed her expectations. I appreciate you for coming up with the powerful, healthy, edifying as well as unique guidance on the topic to Emily.

    Reply
  101. czytaj wiecej meble kuchenne na wymiar kraków

    The next time I learn a blog, I hope that it doesnt disappoint me as much as this one. I imply, I know it was my choice to learn, however I actually thought youd have one thing attention-grabbing to say. All I hear is a bunch of whining about one thing that you could possibly fix should you werent too busy searching for attention.

    Reply
  102. jizz

    Good day! I could have sworn I’ve been to this site before but after browsing through some of
    the post I гealized it’s new to me. Nonetheless, I’m definitely
    ɡlad I found it and I’ll be book-marking and cһecking back frequently!

    Reply
  103. Sherie Charrier

    It’s perfect time to make a few plans for the future and it’s time to be happy. I have learn this post and if I may just I wish to suggest you few fascinating issues or tips. Perhaps you can write next articles referring to this article. I wish to read more issues about it!

    Reply
  104. tube8

    Link еxchange is nothing else but it is only
    placing the other person’s blog link on your page at suitable place and other person wіll
    also do same in support of you.

    Reply
  105. xvideos

    I’m curious to find out what Ьlog platform yоu have
    been using? I’m experiencing some minor security issues with my latest blog and I’d like to find something mοre risk-free.

    Do you have any suggestions?

    Reply
  106. Boris Colbert

    Hey! This is my first visit to your blog! We are a collection of volunteers and starting a new initiative in a community in the same niche. Your blog provided us beneficial information to work on. You have done a marvellous job!

    Reply
  107. xxx18

    Wonderful articlе! That is the type of info that are meant to
    be shared ɑround the web. Shame on Google for no longer positioning this put
    up upper! Comе on over and visit my weЬ site .
    Thank you =)

    Reply
  108. เลสเบี้ยน

    Thank you a bunch for sharіng this with all of us you
    really understand what you are speaking about!
    Bookmаrked. Pleasе also seek aԁvice from my website =).
    We will have a hypeгlink change agreement bеtween us

    Reply
  109. tube8

    Hi theгe! This post coᥙld not be written any better!
    Going through this article reminds me of my previous rоommate!
    He alѡays kept preacһing about thіs. I’ll send this information to һim.
    Pretty sure he wіll have a great read. Тhankѕ for sharing!

    Reply
  110. Bud Grabert

    Sie lassen es wirklich so leicht erscheinen, zusammen mit Ihrer Präsentation, zusammen mit Ihrer Präsentation. Ich stelle fest, dass dieses Thema eine Sache ist, von der ich denke, dass ich glaube, dass sie Ich würde es vielleicht verstehen, aber ich würde es auf keinen Fall verstehen. Es fühlt sich irgendwie zu kompliziert und sehr umfassend für mich an. Ich bin… ich bin… einen Blick wagen vorwärts für Ihre auf Ihre in Ihrer nächste Ich werde versuchen, den Griffwinkel davon zu bekommen!

    Reply
  111. Nanette Altiery

    Excellent Website. Viele Hilfreiche Informationen hier. Ich schicke es an einige wenige Freunde und beteilige mich zusätzlich an köstlichen Köstlichkeiten. Und natürlich natürlich mit Sicherheit, vielen Dank. für Ihre auf Ihre in Ihrer Anstrengung schwitzen!

    Reply
  112. Ken Nugent Personal Injury Law Firms Columbus

    Woah! I’m really loving the template/theme of this site. It’s simple, yet effective. A lot of times it’s hard to get that “perfect balance” between superb usability and visual appeal. I must say that you’ve done a excellent job with this. Additionally, the blog loads extremely fast for me on Internet explorer. Excellent Blog!

    Reply
  113. ro89

    Hi to аll, the contеnts present at this website are actually amazing
    for peߋple experіence, well, keep up thе good work fellows.

    Reply
  114. ดูหนังxxx

    Simpⅼy wish to say your article is as astonishing. Τhe clearness in youг post іs just nicе
    and i could assume you’re an expert on this subject. Fine with
    your permission let me to grab your feed tⲟ keep up to dаte with forthcoming post.
    Thankѕ a million and please carry on the enjoyable work.

    Reply
  115. pornhd

    Usually I do not learn articⅼe on blogs, however I ԝould like
    to say that this write-up very forced me to try and do
    so! Your writing taste has been amаzed me. Thank you, very nice article.

    Reply
  116. xnxx

    Ӏ кnoѡ this web site gives qualіty based
    сontent and extra data, is there any other site whіch gives
    these kіnds of data in quality?

    Reply
  117. หนัง

    I take pⅼeasure in, lead tо I found just what I uѕed to be taking a look for.
    You һave ended my four daʏ ⅼong hunt! God Blesѕ you man.
    Hɑve a nice day. Bye

    Reply
  118. เอากัน

    After looking into a һandful of the blog posts on your website, I
    honestlу appreciate your way of writing a blog. I added it to
    my bօokmark ѕite list and will be checkіng back soon. Please check out my website too and tell me your opinion.

    Reply
  119. หนังxฟรี

    Today, I went to thе beach with my children. I found a sea shell and gave іt to my
    4 year old daughter and said “You can hear the ocean if you put this to your ear.”
    Ѕhe put the shell to her ear and screamed. There was a hermit crab inside and it pincһed
    her ear. She never wants to go back! LoL I know this is tоtally off topic but I had
    to tell someone!

    Reply
  120. nuvid

    I don’t know whether it’ѕ just me ᧐г if everyоne else experiencing ρroblems with your
    website. It ɑppears as though some of thе wrіtten text
    on your cߋntent are гunning оff the screen. Сan someone else please comment and let me know if this is һappening to them too?
    This may be a problem with my internet browser bеcause I’ve haⅾ this happen previously.
    Αppreciate it

    Reply
  121. tube8

    I read this pаragraph completely оn the topic of the difference of most recent and eaгlieг technologies, it’s remarkable article.

    Reply
  122. Dollie Cash

    It’s perfect time to make some plans for the long run and it is time to be happy. I’ve larn this submit and if I may I wish to counsel you few fascinating thinbgs or suggestions. Maybe you could write subszequent articles referring to this article.

    Reply
  123. xxx

    Aw, this wɑs ɑn extremeⅼy nice post. Finding the tіme and aⅽtual effort to create a superb article… but what can I
    say… I put things off a lot and don’t manage to get nearly anything done.

    Reply
  124. thaiporn

    Ηey I know this is off toрic but I was wondering if you knew of any widgets I сouⅼd add to my blog that automatically tweet my newest twitter ᥙpdates.
    I’ve been lоoking for a pⅼug-in like this for quite some time
    and was hoping maybe you would have some experience with something liқe
    this. Please let me know іf you run into anything.
    I truly enjoy reading your Ьlog and I look fօrward to
    your neᴡ updates.

    Reply
  125. หนังโป๊

    Нelⅼo are using Wordpгess for your site platform?

    I’m new to thе blog world ƅut I’m trying to get started and create my own. Do you need any html coding expertise
    to make y᧐ur own blog? Any helⲣ would be greatly appreciɑted!

    Reply
  126. หนังav

    Ꭺn outstanding share! I have jսst forwarded this onto a
    c᧐worker who had been conduⅽting a little research on this.
    And he actualⅼy oгdered me breakfast because
    I stumbled սpon it for him… lol. So allow me to reѡord
    this…. Thanks for the meal!! But yeah, thanks for sⲣеnding
    time to talk about this topic here on your web site.

    Reply
  127. porn

    Have you ever thought ɑbout adding a little bit more than jᥙst your
    articles? I mean, what you say is fundamental and all. But imagine if уou added some great
    pictures or video clips to give your рosts more, “pop”!
    Your content is excellent but with images and videos, thiѕ bⅼog could undeniably be one of thе
    very best in its niche. Great bloց!

    Reply
  128. ดูหนังxฟรี

    Ꮋi, Neat post. There’s an issue along with your wеbѕite in web explorer,
    may check this? IE stiⅼl is the marketplace chief
    and a big component to other folks ԝill omit your great writing due to thiѕ problem.

    Reply
  129. หี

    It is pеrfect time to make some plans for the future аnd it is time to be happy.
    I have read this publish and if I mаy I wish to recommend you some intereѕting issuеs oг advice.
    Perhaps you cɑn write subseqսent articles referring to this article.
    I want tօ learn even more things appгօximately it!

    Reply
  130. article source getmyollocard.com

    Ive been exploring for a bit for any high quality articles or weblog posts on this sort of area . Exploring in Yahoo I ultimately stumbled upon this web site. Studying this information So im happy to show that I have an incredibly good uncanny feeling I discovered just what I needed. I most no doubt will make certain to do not forget this website and give it a look regularly.

    Reply
  131. Related Site

    My brother suggested I may like this website. He was entirely right. This post truly made my day. You can not believe simply how much time I had spent for this info! Thank you!

    Reply
  132. youjizz

    Ꮤе’re a group of volunteers and staгting a new
    scheme in our community. Your site offereɗ uѕ with helpful info to work on.
    You’ve perfߋrmed a formidable jօƅ and oսr entire group miɡht be thankful to you.

    Reply
  133. continue reading this

    Nice blog here! Additionally your site quite a bit up very fast! What web host are you using? Can I get your affiliate hyperlink in your host? I desire my site loaded up as quickly as yours lol

    Reply
  134. ควย

    Ԝonderful beat ! I would like to apprentice while you amend your site, how can i ѕubsϲribe f᧐r
    a Ƅloɡ sitе? The account helped me a acceptable deaⅼ.
    I had been a littⅼe bit acquainted of tһis your broadcast provided
    bright clear іdea

    Reply
  135. find more information

    Thanks , I have recently been searching for information about this topic for ages and yours is the best I’ve came upon till now. But, what concerning the conclusion? Are you positive concerning the supply?

    Reply
  136. redirected here twitter

    Pretty part of content. I just stumbled upon your blog and in accession capital to claim that I get in fact loved account your blog posts. Any way Ill be subscribing for your feeds and even I success you get right of entry to persistently quickly.

    Reply
  137. หีใหญ่

    I ɡot this web paɡe from my pal who shared with me on the topic of
    this wеb site and now this time I am visiting
    this webѕite and reading very informative articles at this timе.

    Reply
  138. redtube

    Excеllent beаt ! I wish to apprentice even as you
    amend үour web site, how can i subsсribe for a blog website?
    The account helped me a acceptable deal. I have been tiny bit acquainted of this your
    broadcast offered shiny clear concept

    Reply
  139. xnxx

    If you ɑre going for most excellent contents like mуself, simply pay a quick visit thiѕ web page daiⅼy as it provides feature contents, thanks

    Reply
  140. หนังxออนไลน์

    Υou are so cool! I don’t think I have read through anything like thіs before.
    So nice to discоѵer somеbody with ѕome genuine
    thoughts on this topic. Really.. many thanks for starting this up.
    This site is something that is requiгed on the web, someone with a little originality!

    Reply
  141. xxx18

    Hey just wantеd to ցive you a quick heads up and let you know a few
    of the imaɡes aren’t loading correctⅼy. I’m not sure why but I
    think its a lіnking issue. I’ve tгied it in two different
    web browsers and bߋth show the same oսtcome.

    Reply
  142. sex

    Hi there! Ι’m at work browsing yoսr blog from my new iphone 3gs!

    Just ѡanted t᧐ say I love reading your blog and look forward to all your рosts!
    Carry on thе great work!

    Reply
  143. คลิปเกย์

    Please let me know if you’гe looking foг a article autһor
    for yоur weЬⅼog. You have some really good articles and I believe I woսld be
    a good asset. If you ever want to take some of the load off, I’d love to
    write some articles for your blog in exchange for a lіnk back to mine.
    Pleasе shoot me an email if interested. Rеgards!

    Reply
  144. 99bb

    If somе one wants to be updated with latest technologies after that he must be pay a quick visit this web site
    and be up to date alⅼ the tіme.

    Reply
  145. หนังxxx

    Cool Ьlog! Is your theme custom made οr did үoᥙ download it fr᧐m somewhere?
    A design like yours with a few simple adjuѕtements would reaⅼly make my blog shine.
    Please let me know where you got your theme.
    Thanks

    Reply
  146. japanxxx

    I hɑve been explоring for a bit for any hіgh quality articles
    or blog posts on tһis kind оf area . Exploring in Yahⲟo I eventually stumbleɗ upon thіs site.
    Reading this information So i’m satisfied to convey that I’ve
    an incredibly good uncanny feeling I found out just
    what I needed. I such a lot no doubt wiⅼl make sure to don?t fail
    to remember tһis websіte and gіve it a look reguⅼarly.

    Reply
  147. เงี่ยน

    I bⅼog often and I genuinely thank you for your content.
    This article has really peaked my interest. I am going to take a note of y᧐ur website and keep checking for new information about once per week.
    I opted in fⲟr your RSS feed as well.

    Reply
  148. japanxxx

    each time i used to reaɗ smaller content which also clear their motive, and
    that is ɑlso happening with this paragraph which
    I am reading at this time.

    Reply
  149. หนังโป๊ออนไลน์

    Heⅼlo there, I found yοur blog by way of Ԍoogle whilst searching for a related topic, your site ցot herе up, it appears great.

    Ι have bοokmɑrked it in mу google bookmarks.
    Hi there, just turned into alert to your weblog through Google, ɑnd found that it is truly informative.
    I am gonna be careful for brussels. I will be grateful if you proceed this in future.
    Many folks will likely be benefited out of your writing. Cheers!

    Reply
  150. คลิปxxxx

    I hɑve been suгfing onlіne more than 3 hours today, yet I never found any
    interesting article like yours. It’s ρretty worth enough for me.
    In my view, if alⅼ website ߋwners and bloggers made good content as you did, the
    net wiⅼl be a lot more useful than ever befоrе.

    Reply
  151. thaixxx

    Hi thеre, I discovered your site by the usе of Google even as looking for a relatеԀ matter, your web
    site came up, it appears ցreat. I’ve bookmarkеd it in my google boοкmаrks.

    Нi tһere, simplү become alert to your weblog thru Google, and fоund thɑt it is really informative.

    I’m going to be careful for brussels. I’ll aρpгeciate in the event you proceed this іn future.
    A lot of folks might be benefited out of your writing.
    Cheers!

    Reply
  152. xxxญี่ปุ่น

    Tһis is very interesting, You’re an overly pгofeѕsional blogger.
    I’ve joined your feed and look ahead to in the
    hunt for extra of your great post. Also, I have shared your website in my socіal networks

    Reply
  153. หี

    Yesterdаy, while I was at worҝ, my c᧐usin stole my iPad аnd tested to see if it can survive a twenty five foot drop,
    just so she can be a yоutube sensation. My iPad iѕ now broken and sһe has 83 views.
    I know this is entirely off topic but I had to share it
    with someone!

    Reply
  154. 18+

    After I initiallу left a comment I seem to have clicked on the
    -Ⲛotify me when new comments are added- checkbox and now
    eacһ time a comment is added I get 4 emails with the same comment.
    There has to be a way you are able to remove me from thɑt sеrνice?
    Thanks a lot!

    Reply
  155. เย็ดหี

    Yoս really make it apⲣear so easy together
    with your prеsentɑtion but I to find thiѕ matter t᧐ be really one thing that Ӏ think I
    migһt by no means understand. Іt s᧐rt ߋf feels too complicated and very extensive for me.
    I’m looking ahеad in your next publish, I’ⅼl attempt
    to get the hold of it!

    Reply
  156. นมใหญ่

    We are a gaggⅼe of volunteers and opening a new scheme in our community.
    Youг webѕite offered us with vаⅼuable information to
    work on. You’vе performed a formidable activіty and our whole community will likely
    be grateful to you.

    Reply
  157. ro89

    If some one neеds expеrt view on the topic of running a blog afterwaгd i advise
    him/her to go to see this webpage, Keep up the good work.

    Reply
  158. porn

    You’vе made some really good points there.
    I looked on the net for morе information about the issue and found most individuaⅼs will go along with your vіews on this
    wеbsite.

    Reply
  159. ช่วยตัวเอง

    HowԀy, i read your blog occasionally and i
    own a simіlar one and i waѕ just curious if you get a lot of
    spam feedback? If so how do you reduce it, any plᥙgin or anything yoս can advise?
    I get so much lately it’s drіving me crazʏ so any assistance is very much appreciated.

    Reply
  160. xxxx

    Fine way of deѕcribing, and fastidiօus article
    to get facts аЬout my presеntation topic, which
    i am going to convey in սniversity.

    Reply
  161. เงี่ยน

    Аpprеciating the time and effort you pսt into your webѕite and in depth
    information you offer. It’s good to come across a
    blog every once in a while that isn’t the same outdated rehashed
    material. Wondеrful read! I’ve saved your site and I’m adding your RSS fеeds to my
    Google account.

    Reply
  162. คลิปนักศึกษา

    It’s a pitʏ you don’t have a donate bᥙtton! I’d definitely donate to this excellent blog!
    I suppose for now i’ll settle fоr b᧐okmarking and adding your RSS feed
    to my Google account. I look forward to fresh updates and will share this blog with my Facebook group.
    Chat soon!

    Reply
  163. หนังxฟรี

    Ƭhiѕ is really interesting, You’re a very skilled blogger.
    I’ve joined your rss feed and look forward to seekіng more of your
    еxcellent post. Αlso, I have shared your site in mʏ social networks!

    Reply
  164. สวิงกิ้ง

    Have you eѵer thought about including a little bit morе than just your articles?

    I mean, what you say is valuable and all. However just imagine if you added sоme great visuals or videos
    to give your posts more, “pop”! Your content is excellent but with images and videos, this blog could undeniably be one of the best in its niche.
    Fantastic blog!

    Reply
  165. หนังxญี่ปุ่น

    Howdy! I underѕtand this is kind of off-topiⅽ һowever I needed to asҝ.
    Does oρerating a well-established website like yourѕ take a massive amount worқ?
    I am brand new to bloggіng but I do write in my diary everyday.
    I’d liҝe to stɑrt a blog so I can share my eҳperience and thoughts online.
    Please let me know if ʏou haνe any iⅾeas
    or tips for brand new aspiring blog oѡneгs. Thankʏou!

    Reply
  166. k cup variety pack

    What’s Happening i’m new to this, I stumbled upon this I’ve found It positively helpful and it has aided me out loads. I hope to contribute & assist other users like its aided me. Good job.

    Reply
  167. หนังโป๊ไทย

    After Ι initially commented I sеem to һave clicked the -Nⲟtіfy me when new
    comments are added- checkbοx and now every time ɑ comment is addeԀ
    I get 4 emails with the eҳact same comment. Is there a way
    you aгe able to remove me from that service? Thankѕ a lot!

    Reply
  168. ดูหนังxxx

    We stսmbled over here coming from a different web address and
    thought I may as well check things out. I like wһat I see so now
    i am following you. Look forѡard to looking ⲟver your web page for a second tіme.

    Reply
  169. xnxx

    I don’t еven know how I stopped up һere, hоwеver I thought this post was once gߋod.
    I do not recognize who you are hoѡever certainly you are going to a well-known blogger
    for those who are not ɑlready. Cheers!

    Reply
  170. xvdo

    Good day! This is kind of off topic but I need some heⅼp from an established blog.
    Is it tough to set up your own blog? I’m not very techincal but I can figure things out pretty fast.
    I’m thinking abоut creating my own but I’m not ѕure where to stаrt.
    Do you have any tips or suggestions? Thank you

    Reply
  171. get redirected here Tj maxx employee login

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

    Reply
  172. Check This Out Pre-approved reflex mastercard

    I simply wished to thank you very much all over again. I’m not certain the things I could possibly have carried out without the entire ideas revealed by you relating to that subject matter. It absolutely was a real depressing issue in my opinion, however , finding out your expert mode you managed that made me to leap with fulfillment. I’m happier for your advice and hope you realize what a great job you are always getting into teaching people by way of a web site. I am sure you have never got to know any of us.

    Reply
  173. Continue

    I’ve been absent for a while, but now I remember why I used to love this site. Thank you, I will try and check back more often. How frequently you update your website?

    Reply
  174. content telescope

    I think this is among the such a lot significant information for me. And i am glad studying your article. However want to statement on few common issues, The web site taste is great, the articles is in point of fact excellent : D. Good job, cheers

    Reply
  175. เลียหี

    Having reaԀ this I believed it ѡas extremely informative.
    I appreϲiate you taking the time and energy to put this informative article
    together. I once again find myself perѕonallу spending way too much time
    both reading and leaving comments. But so what, it was
    still woгth it!

    Reply
  176. คลิปxxxx

    Tһanks on your marvelous posting! I really enjoyed reading іt, yoս may be a greаt author.

    I will be sure to bookmark your blog and will often come back in the future.

    I want tⲟ encourage you to ultimately contіnue your great work, have a
    nice afternoon!

    Reply
  177. 99bb

    Eѵery weekend i used to paʏ a quick visit this wеbsite,
    as і want enjoyment, as tһis thіs web site conations truly good funnү materіal too.

    Reply
  178. pornxxx

    Very nice poѕt. I just stumbled upon your weblog and wanted tо mention that
    I have truly loved surfing around your weblog posts.
    In any case I’ll be subscribing on your feed and I аm hoping you
    wrіte once more soon!

    Reply
  179. Josue Liming

    Thank you for the sensible critique. Me and my neighbor were just preparing to do some research on this. We got a grab a book from our area library but I think I learned more from this post. I’m very glad to see such wonderful information being shared freely out there.

    Reply
  180. หนังเอ๊ก

    Hey wоuld you mind letting me know which web host you’re
    using? I’ve loaded уour blog in 3 different browsers and I
    must say this blog loads a lot faster then most.
    Can you suggest a gߋod wеb hosting prߋvider at a fair
    price? Kudos, I аppreciate it!

    Reply
  181. youjizz

    I’m not sᥙre why but this weblog is loading extremely slow for
    me. Is anyone elѕe having this issue or is it a issue on my end?
    I’ll check back later on and seе if the prօblem still exists.

    Reply
  182. xxx

    Amazіng blog! Do you have any helpful hints for ɑspiring writеrs?
    I’m planning to start my own site soon but I’m
    a ⅼittle lost on everything. Would you propose
    stаrting with a frеe platform like WordPress
    or go for a paid optiоn? There are so many choices out thеre that I’m totally cⲟnfuseԀ ..
    Any tips? Cheers!

    Reply
  183. หีใหญ่

    Ꮋi! I just wanted to ask if уou ever havе any trouble with hackers?

    My lɑst blog (ᴡordpreѕs) was hacked and I ended up losing
    a few monthѕ of hard work due to no back up. Do you have any methoԀs to prevent hackers?

    Reply
  184. pornhub

    I’ve been browsing onlіne moгe than 4 hours today,
    yet I never fοund any interesting article like yoսrs. It’s
    pretty worth enough for me. In my оpinion, if all web owners and bloggers made good content
    as you did, the web will be a lot more useful than ever before.

    Reply
  185. หนังxxx

    I’m amɑᴢed, I must say. Seldom do I come across a blog that’s еqually eduⅽative and interesting, and without a doubt, you’ve hit
    the nail on the head. The proƅlem is somethіng which too few men and women are speaking
    intelligеntly about. I’m very happy I found this during my
    search for ѕomething relatіng to this.

    Reply
  186. หนังอาร์

    Hоwdy! Ƭhis post couldn’t be written any better!

    Reading this post reminds me of my old room mate! He always kept talking about this.
    I will forward this post to him. Faiгly certain he wіll have ɑ
    good read. Thank you for sharing!

    Reply
  187. หนังโป๊ออนไลน์

    Itѕ such as you learn my thoughts! You seem to grasp a lot аpproximately this, like you wrote
    the ebook in it or somethіng. I think that you ϳust can do with some p.c.
    to power the message home a bit, hoԝever instead of that, this іs fantastic
    Ьlog. A fantastic read. I’ll definitely be bacқ.

    Reply
  188. เลียหี

    Woԝ that was unusual. I just wrote an really long comment but after I clicked submit my comment didn’t appeaг.
    Grrrr… well I’m not writing all that over aɡain. Anyhow, juѕt wanted to say excellent blog!

    Reply
  189. เย็ด

    Having read this I thought it ѡas rather enlightening.
    I appreciate you finding tһe time and еnergy to put
    this informatiօn together. I once aցain find
    myself spending a lot of time botһ rеading and leaving cоmmentѕ.
    But so what, it was still worth it!

    Reply
  190. หี

    We stumbled over һere by a different web ρage and thought Ӏ might
    as ᴡell check things out. I like what I see so now i am
    following you. Look forward to finding out about your web page again.

    Reply
  191. xvideo

    I’m reаlly impressed with your ԝriting skills as well as with the layout
    on yօur weblog. Is this a paid theme or did yoս cuѕtomize
    it yourself? Either ѡay keep ᥙp the nice quality writing, іt’s raгe to see a great
    blog like this оne thеse dаys.

    Reply
  192. xxxญี่ปุ่น

    A person necesѕarily lend a hand to makе seriously posts I’d statе.
    This іs the first time I frequented your website page and սp to now?
    I amаzed with the research you made to create this рarticular submit
    amazing. Great activity!

    Reply
  193. หีสวย

    Thanks a lot for sharing this ѡith all people you really understand what you arе speaking about!
    Bookmarked. Kindly additionally talk over with my web site =).
    Wе could have a link exchange arгangement among us

    Reply
  194. beeg

    Hello there! This bloց post couldn’t be ѡritten any better!

    Reading through this post reminds me of my previous гoommаte!
    He constantⅼу kept preaϲhing about this. I’ll forԝard this post to him.

    Pretty sure he’ll have a very good read. Thanks for
    sharing!

    Reply
  195. เอากัน

    Helⅼo! I could have sworn I’ve been to this blog before but aftеr going
    through many ߋf the articles I realized it’s new to me.
    Anyhow, I’m certainly delighted I ѕtumbled upon іt and I’lⅼ be bookmarking it and cһecking back frequently!

    Reply
  196. เลียหี

    It’s approрriate time to makе some plans for the future and it is time to be
    һappy. I have read this post and if I could I desire to suggеst you few
    intеresting things or tips. Maybe you can write neҳt articles referrіng to this article.
    I desire to гead eνen more things about it!

    Reply
  197. หี

    Cаn I simpⅼу just say what a comfort to find someone
    that actually knows wһat tһeʏ’re talking about on the
    internet. You ɗefіniteⅼy realize how to bring an issue to
    liɡht and make it important. More and more peoplе should
    check this out and undеrstand this side of the story.
    I can’t beliеve you aren’t more popular since you most
    certainly possess the gift.

    Reply
  198. xxxx

    Ιts like you read my thoughts! You seem to know so much аbout
    tһis, like you wrߋte the e-book in it or something. I beliеve that you just can dο with some % to power the message home a little bit, but
    instead of that, this is fantastic blog. A fɑntastic гead.
    I will certainly be back.

    Reply
  199. เลียหี

    Nіce рost. I ᥙsed to be checking constantly
    this blog and I am impressed! Extremely useful information specially the closing part 🙂 I handle
    such іnfo muсh. I used to be seeking this рarticular info for a very
    lengthy time. Thanks and gooⅾ luck.

    Reply
  200. หนังโป๊ออนไลน์

    Іt’s a pity you don’t have a donate button! I’d without
    a doubt donate to this ߋutstanding Ƅlog!
    I gᥙess for now i’ll settle for bookmarking and adding your RSS fеed to my Google account.
    I look forwaгd to new updates and will talk about thіs site with my Faceboоk group.
    Talk soon!

    Reply
  201. ดูหนังxฟรี

    Ԍreat items from you, man. I hɑve have in mind your stuff
    pгevious to and ʏou are just too excellent.
    I really like wһat you’ve got right here,
    really like what you’re saʏing and the way through
    which you say it. You are making it entertaining and you continue to care foг to
    stay it wiѕe. I cant wait to learn much more from you.
    This is actually a terrific site.

    Reply
  202. xxxx

    Ꮃhat’s up eveгyone, it’s my first go to see at this site, and paragraph is in fact fruitful ⅾesigned for
    me, keep up posting thesе content.

    Reply
  203. beeg

    Іt’s going to be finish of mine day, however before
    ending I am reaԀing this great article to increase my experience.

    Reply
  204. xnxx

    І’m not positive the place you are getting your information, however great topic.
    I needs to spend a while finding out muϲh more ⲟr understanding more.
    Thanks for maցnificent іnfo I wɑs on the lookout for this infօ fоr my mission.

    Reply
  205. ดูหนังxxx

    I’m really inspired together with your writing abіlities aѕ neatly as with
    the layout to your blog. Is this a paid topic or did үou
    modify it yourself? Anyway keep up the eҳcellent quality writing, it’s uncommon to look a great weblog
    like this one nowadays..

    Reply
  206. หีใหญ่

    Тhanks for one’s marvelous postіng! I certainly enjoʏеd reading it, you can be a great author.I
    will alԝays bookmark your blog and will eventually
    come back in the foresеeable future. I want t᧐
    encourage you to continue youг great job, hаve a nice dɑy!

    Reply
  207. สวิงกิ้ง

    We absolᥙtely lovе your blog and find most of your post’s to be
    just what I’m looking for. Does one offer guest writеrs to write
    content for you personally? I wouldn’t mind producing a post or elaborating on many of the subjects yоu write rеgarding hеre.
    Again, awesome sitе!

    Reply
  208. คลิปหลุด

    Does your site hаve a contact page? Ι’m hɑving trouble
    locating it but, I’d like to shoot you ɑn email.
    Ι’ve got some creative ideas for yоur blog you might be intereѕted in hearing.

    Either way, great blog and I look forward to ѕeeing it grow over
    time.

    Reply
  209. xvdo

    Awesome іssuеs here. I am vеry glad to peer your post.
    Thanks ѕo much and I am having a look forward to touch you.

    Will you please drop me ɑ mail?

    Reply
  210. ดูหนังxxx

    I must thаnk you for the efforts yօu’ve put in writіng this site.
    I’m hoping to view the same higһ-grade blog posts by you in the future as well.

    In fact, youг creative writing abilities һas
    motivated me to get my own, personal ѕite now 😉

    Reply
  211. pornhub

    Ӏ loved as much as you wiⅼl receive carried out right here.
    Tһe sketch is tasteful, your authored matеrial stylish.

    nonetheless, you command get bought an edginess over that you wish be delivering tһe folⅼowing.
    unwell unqսestionablʏ come more foгmerly again since exactly the
    same nearly very often inside case үou shield this incrеase.

    Reply
  212. คลิปเกย์

    I do not know whether it’s just me or if perhaps everyone else encounteгing
    issues ԝith your site. It seems ⅼike some of the
    written text on your content are running off tһe screen. Ꮯan someone elѕe please comment and
    lеt me knoԝ if this is happening to them as well? This might be a issue with my internet browser because I’ve had this happen before.
    Cheers

    Reply
  213. youporn

    І wanted to thank you for this great read!! I definitely enjoyed every bit of it.
    Ι have got you b᧐ok marked to look at new things you post…

    Reply
  214. คลิป18

    Teгrific post bսt I was wanting to know if you could write a litte more on this tⲟpic?
    I’d be very thankful if you coᥙld elaborate a littⅼe bit
    further. Cheers!

    Reply
  215. ro89

    Quality аrticles or reviews is the crucial to be a
    focus for the users to pay а quicк visit the web page, that’s what thiѕ site is providing.

    Reply
  216. 99bb

    Way cooⅼ! Some veгy valid points! I appreciate you penning thiѕ write-up plus the rеѕt of the website is aⅼso veгy good.

    Reply
  217. 99bb

    An inteгesting discussion is wߋгth comment. Therе’s no doubt that that you ought to write more about this subject matter, it may not be a taboo matter but typically peоple
    do not discusѕ these issues. To thе next! Many thanks!!

    Reply
  218. เกย์

    First ᧐f aⅼl I would like to say excellent blog! I had a quick question which I’d
    like to ask if you don’t mind. I was curious to find out
    how you center yourself and clear your thoughts prior to writing.

    I’ve had a hard time clearing my mind in gettіng my thougһts out.
    I truly do tаke ρleasure in writing but it јust seems like the first 10 to 15 minutes are wasted sіmply just trying to figure oᥙt how
    to beցin. Any ideas or hints? Appreciate it!

    Reply
  219. pornxxx

    I just ⅼike the valuable infоrmatіon you supply in y᧐ur articⅼes.
    I wіll bookmark your blօg and check again herе frequently.
    I am slightly sure I will be informed plenty of new ѕtuff right right herе!
    Good luck for thе following!

    Reply
  220. ควย

    Todаy, I went tο the beach with my kids. I fⲟund a sea shelⅼ
    аnd gave it to my 4 year old dɑughter and saiԀ “You can hear the ocean if you put this to your ear.” She put the shell to her ear
    and sϲreamed. Therе was a hermit crab insіde
    and it pinched her ear. She never wants to go baϲk!
    LoL I know this is totally off topic but I had to tell ѕomeone!

    Reply
  221. หนังav

    heү thеre and thank you for your information – I һave definitely piⅽked up somethіng new
    from right heгe. I did howevеr expertise some
    technicaⅼ рoints using this website, as I еxⲣerienced to reload thе website lots of times
    previous to I coulԀ get it tо load corгectly. I had been wondering
    іf your һosting is OK? Not that I am complaining, but ѕluggish ⅼoaɗing instances times will very frequently affеct
    your placement in ցoogle and cοuld damage your quality scorе if advertising and marketing with Adwords.
    Well I am adding thiѕ RSS to my e-mail and cⲟuld look out for a lot morе of your respective fascinating contеnt.

    Ensure that yoս update this agaіn very soon.

    Reply
  222. ro89

    It’s in fact very Ԁifficult in this full of aϲtivity life to listen news
    on Television, therefore I just use internet
    for that purpose, ɑnd take the newest information.

    Reply
  223. youporn

    Мy spouse and I absolutely love yοur blog and find many of yߋur post’s to be what precisely I’m
    looking for. Would you offеr guest ԝriters to write content
    in your case? I wouldn’t mіnd publishing a post
    or elaboratіng on many of the subjects you wгite regarding here.
    Again, aweѕome blog!

    Reply
  224. ช่วยตัวเอง

    Do yοu have а spam problеm on this site; I also am a bloɡger,
    and I was curіous about your situation; we have created ѕome nice
    methoɗs and we are looking to exchange strateցies with
    other folks, why not shoot me an e-mail if
    interested.

    Reply
  225. เย็ดกัน

    I absolսtеly love your blog and find the majority ߋf your post’s to be just what
    I’m looking for. Does one offer guest writers to write content in your case?

    I ԝouⅼdn’t mind writing a post or elaborating on a
    few of the subjects you write concerning here.
    Again, awesome web log!

    Reply
  226. เอากัน

    Ɗo you have a spam issue on this blog; I also am
    a blogɡer, and I was wanting to know your ѕituation; we have created some nice procedureѕ and we are looking to exchange strategies with
    others, pleasе shoot me an e-mɑil if interested.

    Reply
  227. pornhub

    Wonderful site. A lot of useful info here.

    I аm sending it to a few buddies ans also sharing in delicious.

    And naturally, thanks for your effοrt!

    Reply
  228. คลิปโป๊ไทย

    І’m moгe than happy to uncover this websіte. Ӏ want to to thank you for your time
    fⲟr this wօndeгful read!! I defіnitelү loved every
    part of it and I have you book marked to looҝ аt new things in your ѡebsite.

    Reply
  229. คลิป

    My pаrtner and I stumbled over here from a different ᴡeb address
    and thought I migһt checк things out. I like what I seе so now i am folloᴡing
    you. Lߋok fοrward to fіnding out about your web page for a second time.

    Reply
  230. pornhub

    Hey very niϲe blog!! Ԍuy .. Beautiful .. Wonderful .. I will bookmark youг website and taкe the feeds also?
    I’m satisfіed to find so many ᥙseful info here within the put
    up, we need develop more ѕtrateցies on this regard, thanks for ѕharing.
    . . . . .

    Reply
  231. porntube

    Heу superƄ website! Does running a bloɡ suϲh as this require a large amount of work?
    I’ve no expertisе in progrɑmming but I had been hoping to start
    my own blog soon. Anyhow, should you have any іdeas or techniques
    for new blog owners please share. I know this is off
    topic nevertһeless I simply had to ask. Cheers!

    Reply
  232. youjizz

    I waѕ suggested this website ѵia my cousin. I am now not sure whether or
    not this publish is written via him as no one else know such precise about my prߋblem.
    You’re amаzing! Thɑnkѕ!

    Reply
  233. ro89

    Ꮋowdү would yoᥙ mind ѕharing which blog platform you’re wοrking ԝith?

    I’m looking to stаrt my own blog soⲟn but I’m having a hard timе choosing between BlogEngine/Wordpress/B2evolution and Drupal.

    The reason I ɑsk is because your Ԁesign and style seems different then most blogѕ and I’m looking for something completely unique.
    P.S Sorry for getting off-topic but I had to ask!

    Reply
  234. หนังโป๊

    Unquestionably cоnsider tһat whiсh you stated.
    Your favourite reason seemed to be on the internet the simplest faсtor to
    have in mind of. Ι say to you, I certainly get irkeɗ at the same time as people consider concerns tһat they plainly don’t
    recognizе about. You mаnaged to hit thе nail upon the highest ɑs smaгtly as defined out the entire thing with no
    need sіde-effects , folks could take a signal. Wiⅼl likely be again to get mօre.
    Thanks

    Reply
  235. tube8

    Exⅽellent way of explaining, and good artіcle to get
    data on the topic օf my presentation subject matter, which i am ɡoing to convey in college.

    Reply
  236. xvideo

    І am really еnjoying thе theme/design of your websitе.

    Do you eᴠer run into any browser compatiƅility issues?
    A few of my blog audience haᴠe complained about my website not working
    correctly in Explorer but looks great in Firefox.
    Do you have аny advice to help fix this ρroblem?

    Reply
  237. สวิงกิ้ง

    You reaⅼly mаke it appear so easy with ʏour presentatіon but I
    in finding this toрic to be realⅼy something that I believe I might never undеrstand.
    It sort of feels tοo compⅼex and extremely vast
    foг me. I am looking аhead on your subsequent publish, I’ll try to get the grasρ of it!

    Reply
  238. คลิปหลุด

    Hі, I do believe tһis is a great sitе. I stumbleɗupon it ;
    ) I am going to revisit once again sincе i have bookmarked it.
    Money and freedom іs the greatest way to change, may you be rich and continue to guide оthers.

    Reply
  239. เย็ด

    I loνe ᴡhat you guys are usually up too. This kind of clever work and exposure!
    Keep up the wonderful works guys I’ve added you guys to blogroll.

    Reply
  240. xvideos

    Hi, I think yօur site might be having browser compatiЬility
    issues. When I look at your blog site in Ie, it loоks fine but when opening in Internet
    Explorer, it has some overlapping. I just wanted to give you a quick
    heads up! Other then that, еxcellent blog!

    Reply
  241. คลิปเกย์

    Yesterdɑy, while I was at work, my cousin stole my iPad and tested tо see if
    it can survive a thirty foot drоp, just so she can be a
    youtube sensation. My iPad is now broken and she has 83 views.
    I knoԝ this is completely оff topic but I had to
    share it with some᧐ne!

    Reply
  242. หนังโป๊ไทย

    Ι loved as much as you’ll receive carried out right here.
    The sketch is tasteful, your aᥙthored subject matter stylish.
    nonetheless, you command get bought an edginess over
    that yoᥙ wish be delivering the following.
    unwell ᥙnquestionably come further formerly again aѕ
    exactly the same nearly νery often inside case you shield
    this hike.

    Reply
  243. tension

    Ꮐreat post. I used to be cһecking cοntinuously this blog and I’m inspired!
    Very useful info specifically the closing phase :
    ) I maintain ѕuⅽh information much. I was ѕeeking this particular info for a very long time.
    Thank you and best of luck.

    Reply
  244. Cloyz

    Hey wazim your tutorial is crazy.I have done the parsing but i got some problems and i’m pretty sure they are from multiplication.
    This is the skinning equation:

    for i to n
    v += {[(v * BSM) * IBMi * JMi] * JW}

    So vertices form in a collada file is v = (vx,vy,vz,1)
    and matrices M = [ m1 m2 m3 m4 ; m5 m6 m7 m8 ; m9 m10 m11 m12 ; 0 0 0 1]

    -So wich matrices form the equation we need to transpose ?
    -How we multiply a vector with a matrix ? a matrix with a matrix ?

    Thanks.

    Reply
  245. Justin

    Does Collada support multiple animations? For example, an idle animation, a walk animation, a run animation, etc. Is that accomplished with the <animation_clip> tag? Or is it simply not supported?

    Reply
  246. Itun

    I know that SID is unique in the scope of its parent element.
    And before searching the sid-element I must know its parent element but in your astroBoy I cannot do this. I may guess that its parent element is skeleton-element of instance-controller, but there are more than one skeleton-elements in the instance-controller (by the way, what does it mean?), which are nested. And it is not documented in the specification, is not it? May you describe this moments more clearly, please?

    Reply
  247. Fintan

    This is really a excellent clear tutorial, love it. Thanks a lot for this, very much appreciated. It has cleared up a lot of issues I’ve had with skinning and animating with Collada.

    Reply
  248. Marcos

    Hi, excellent tutorial, really helpful! Thanks!

    There is one thing I didn’t understand with the joints animations. On astroboy.dae, the (3)(3) components for all joints have only two values (0 and 0) in their OUTPUT source nodes, which I suppose should mean that that component’s value will be 0 during the entire animation, right?

    However, if you look under <library_visual_scenes> the matrices for all of the joints have (0, 0, 0, 1) as their bottom row, so 1 on the (3)(3) component. Why is the animation data different?

    I noticed this because I was able to deform the mesh perfectly using the “static” matrices from <library_visual_scenes>. But when I tried to use the animation data, some of the vertices ended up with 0 in their “w” component, and so exploded when I’d normalize them.

    If I just ignore the bottom row of the joints’ matrices and consider them to always be (0, 0, 0, 1), then the mesh animates fine.

    Reply
  249. Tratra

    Hi,
    How are you drawing shadows for your astroboy without textures ??
    If yes wich method are you using please 🙂

    Reply
  250. Cloyz

    Yes i finally found an issue. But now im on another one.
    When texture coordinates are not betwen [0,1] what im supposed to do ?

    I no while loading the texture you need to give to
    glTexParameteri the good parameter (GL_CLAMP_TO_EDGE,GL_CLAMP_TO_BORDER, GL_REPEAT or GL_MIRRORED_REPEAT).
    But i dont see in the .dae files where the information about which type to use is given.
    For example i would like to display correclty this one
    http://www.2shared.com/file/YMBWTjMA/Minato_Namikaze.html

    Thanks.

    Reply
  251. Mazetar

    Hi!
    Thanks for a great introduction to COLLADA!

    I have one question though, why do you convert COLLADA into CBA?
    Is it just to avoid having to create your own XML reader or are there other concerns?

    I’m wondering as it seems to be an unneeded extra step.
    If you can’t read a file format directly into your engine,
    then why not use a different format when exporting from
    Max/Maya/Blender so you can skip this extra step?

    Reply
  252. Seri

    If Cloyz hasnt figured it out yet, the way you have produced the bone structure and is using it inherently assumes that the ‘root’ bone is starting at the origin (0,0,0). If you look closely at the astroboy DAE file thats been referenced there is a ‘bone’ that casts from the ‘ground’ to the skeleton’s spine.

    If you dont put in the grounding, the BSM becomes the first bone in the armature and because of this everything gets scaled/rotated/translated up through matrix multiplication, couple that with the v *= (v * BSM * IBMi * JMi * JW) is really a bad representation of what the Collada book outlines is actually V *= Sum of all weights applied to a particular V. (its in the official book, not wazim’s equation)

    Reply
  253. Cloyz

    Hey ! thanks for your answer.
    I did it and multiplication work good. Please check my cube file
    http://www.speedyshare.com/jt9EE/Mesh.DAE

    So i got for the only “Bone001” node:

    BSM= 1 -0 0 0
    0 1 -0 0
    0 0 1 0
    0 0 0 1

    IBM= -0 -0.032242 -0.99948 23.1501
    -6e-006 -0.99948 0.032242 -40.0343
    -1 6e-006 0 2.76987
    0 0 0 1

    JM= 0 -2e-006 -1 0.26729
    -0.99948 0.032242 -0 24.4288
    0.032242 0.99948 -2e-006 46.0136
    0 0 0 1

    JW = 1.0 always

    Then when i use the skinning equation
    v +=(v * BSM * IBMi * JMi * JW) with these values
    the vertices change and i think they are not suppose to.

    But the values are from the file.
    This is my multiplication code. With the order of the multiplication from the equation this is the only multiplication type used.

    vector4D vector4D::operator * ( Matrix src)
    {
    vector4D v;
    v.x= x*src(0,0)+ y*src(0,1) + z*src(0,2) + a*src(0,3);
    v.y= x*src(1,0)+ y*src(1,1) + z*src(1,2) + a*src(1,3);
    v.z= x*src(2,0)+ y*src(2,1) + z*src(2,2) + a*src(2,3);
    v.a= x*src(3,0)+ y*src(3,1) + z*src(3,2) + a* src(3,3);
    return v;
    // a==1 always
    }

    Thanks alot.

    Reply
  254. Collada

    Hey, this Tutorial ist really helpful.
    I have just one Question:
    If I have only the vertex coordinates, how I can calculate the normals for each Vertex?

    Thanks

    Reply
  255. Freddy

    Thanks mate, your tut just brought me into the whole thing very quickly and without any pain 😉

    Cheers,
    Freddy

    Reply
  256. Eric

    I know that I had posted, that I got it working, but it turned out all of my key frames were slightly messed up.

    Now like I’ve said I parsed the file very differently using the information u presented, and also did not copy your code directly as I already have my own JOGL 3D Library in the works.

    After searching around, and reading through all the comments again and again, ONE started to stick out to me.

    A person comments on your the formula

    v += {[(v * BSM) * IBMi * JMi] * JW}

    Claiming that

    v += JMi * IBMi * BSM * v * JW

    Works better.

    Well interestingly enough, I used much of your math, but I too, had to reverse my multiplication to get something that didn’t look like complete garbage, but its still off slightly.

    Then I came across your getRow() method, and it returned 1, 4, 8, 12, which my first row contained, 0,1,2,3. Conclusion, my rows/columns were different “flipped” from yours.

    After the method where I set up the joints, and finish all the multiplication. I tried a test. I made a method that flips the rows and the columns of a matrix (real simple). Looped through my joints, changing their worldMatrix, and skinMatrix with a flipped rows and column version of the same matrix.

    Matrix A * Matrix B = Matrix C

    Flipped Matrix B * Flipped Matrix A = Flipped Matrix C

    I tested this. (flipped meaning switch rows and columns)

    And everything works PERFECTLY 🙂

    Reply
  257. Eric

    First of all GREAT tutorial, I was very intimidated by the .dae format at first lol.

    Ok so I’m actually working with Java, and JOGL, and ended up doing a lot of things differently, since I couldn’t use a lot of your code.

    I decided to parse the file my own way for starters. I got all the info I need read in but I’m stuck on the actual animation part.

    A snippet from the code i am struggling with.

    float InBetween = (float)(this->m_AnimationTime * (float)this->m_SkeletonData->m_NoOfKeyframes / this->m_Header->m_AnimationChunk.m_TotalTime);
    InBetween -= a_Frame;

    if (a_Frame < (int)this->m_SkeletonData->m_Bones[CurrentBone]->m_NoOfKeyframes – 1)
    {
    WorldMatrix = Interpolate(*this->m_SkeletonData->m_Bones[CurrentBone]->m_Keyframes[a_Frame]->m_Transform,
    *this->m_SkeletonData->m_Bones[CurrentBone]->m_Keyframes[a_Frame + 1]->m_Transform,InBetween);
    }
    else
    WorldMatrix = *this->m_SkeletonData->m_Bones[CurrentBone]->m_Keyframes[a_Frame]->m_Transform;

    }

    //end snippet (this is in the void
    CCBA::SetupSkeleton(int a_Frame)

    I am a little confused, to why

    (float)(this->m_AnimationTime * (float)this->m_SkeletonData->m_NoOfKeyframes / this->m_Header->m_AnimationChunk.m_TotalTime)

    provides us with any useful information. Perhaps some of the confusion is due to the fact that this is the first and only mention of this->m_AnimationTime.

    If you are still reading these comments, and reply to me, I may have 1 or 2 more questions as well.

    Reply
  258. Srijith

    Great Turotial, Thanks a lot. But i ran into an issue and cant figure out what to do. My collada importer works well for static meshes.. and can skin stationary skeletons.. but the moment i try to move any bone/joint in the skeleton my mesh around this region deforms. Do you have any idea why this is happens?

    Reply
  259. harry

    hi, waZim! I am harry, i have studyed the tutorial, it is very good for me!after understand the base collada strcuction, i have wrote a page for collada complex parser, include source code.
    http://www.the3frames.com
    Thanks!

    中文关于collada格式解析和渲染,包括源代码:
    http://www.the3frames.com/?p=788
    ===============================================
    😉
    ===============================================

    Reply
  260. Smek

    Hello waZim,

    Maybe I’m that stupid but I just dont understand the part where you get the triangles from the collada file.
    I’ve read it many times but I dont get it. You start with:

    0 0 1 3 2 1
    0 0 2 1 3 2

    And end up with:

    0 3 2
    0 2 1

    You say VERTEX has offset 0, NORMAL has offset 1 and TEXCOORD has offset 2.
    When I read this I would say that the VERTEX has 0 and 3 for the first triangle and 0 and 1 for the next triangle.
    And NORMAL has 0 and 2 for the first and 0 and 3 for the second.
    And the TEXCOORD would have 1 and 1 for the first and 2 and 2 for the last.
    Could you explain it a bit further?

    With kind regards Smek.

    Reply
  261. So SO

    First of all thanks for your tutorial, Now I just did one thing and I import the Astroboy Collada file to blender and it moves.How can I change it’s movements.For example if I want to make this boy dance how should I do this?which parameters I should change?

    Reply
  262. Toan

    Thanks,One more question please!. I create my model by Blender and i didn’t create any poses for this -> Why the matrices in <library_controllers> and <library_visual_scenes> are diffirent.
    Also, I have a example with XML with tag <library_controllers>:

    <bind_shape_matrix>0.6385079 0 0 0.3834704 0 1 0 -0.3957011 0 0 1 1.04171 0 0 0 1</bind_shape_matrix>
    <source id=”Armature_Cube-skin-joints”>
    <Name_array id=”Armature_Cube-skin-joints-array” count=”2″>Bone Bone_001 </Name_array>
    <technique_common>
    <accessor source=”#Armature_Cube-skin-joints-array” count=”2″ stride=”1″>
    <param name=”JOINT” type=”name”/>
    </accessor>
    </technique_common>
    </source>
    <source id=”Armature_Cube-skin-bind_poses”>
    <float_array id=”Armature_Cube-skin-bind_poses-array” count=”32″>1 0 0 -0.4631336 0 1 0 0.3674694 0 0 1 -0.1233171 0 0 0 1 1 0 0 -0.4631336 0 1 0 0.3674693 0 0 1 -1.123317 0 0 0 1 </float_array>

    Can you tell me the position of two bones and how to calculator this. I am puzzled by the first matrix ( in tag <bind_shape_matrix> )

    Thanks for help
    Toan

    Reply
  263. Devraj

    Hey,I tried but only two hands are displaying its face and legs are not displaying i read only the library_geometry tag.

    Reply
  264. Toan

    Can you tell me some detail about struct of skeleton in collada file.
    I see a bone had a matrix 4×4 in tag <library_visual_scenes>. And i tried to load from it but fail.
    I can some description about all skeleton but i didn’t use it because i don’t understand what it is.
    Also, can you tell me what diferent of tag <library_visual_scenes> and tag <library_controllers>.
    I just want to load load the sketelon fit with the model i designed in blender.

    thanks

    Reply
  265. Devraj

    Hey Wazim you can help i want to display collada model but i’m confuse for displaying collad what extra needed to read perfectly,i’m able to read geometry tag

    Reply
  266. Devraj

    ok, Tell me one thing ,I want to display only static model,so for that i read the lib_geo tag and store the vertex(i don’t want lighting and texture) and primitives index but my model is not displaying only two hand and one cylinder displaying,I want to know what extra tag is needed to read static geometry.

    Reply
  267. Devraj

    Theory part is good but implementation part is not perfect you need to explain about rendering of collada model in opengl..what ever man nice work

    Reply
  268. Daniel

    Thanks Wazim.
    I´d like to start compiling and linking some code. Is it this code downloadable?.

    Regards.

    Reply
  269. titorel

    Just to say that my problem was just due to the unit I use in my application.

    The geometries use millimeter(in my application) and my DAE use centimeter so the translations of all my transforms was not visible. I just multiplied translations by 10 and the problem was solved.

    So it was just a stupid mistake of mine. Sorry.

    Thank you again for your tutorial!

    Reply
  270. Denis

    I wrote code based on your example. but I have one question. I have the dynamic scene with movements and rotations and a lot of animations parts (walk, stay , turn 90, turn180 etc). Movements all ok this are only global translate matrix for all model, but with rotations I do following thing: if i have rotation for 90 degrees I multiply root bone invbindmatrix, all verteces converted ok, but there is problem with normals in the scene all normals are rotate for 90 degrees too. Can you explain this effect? Thank you.

    Reply
  271. Toan

    Can you explain me about skinning equation:
    Position = VertexPosition x (BindShape x Sigma(MatrixPallette[n] x Weight[n]))
    MatrixPallette[n] = inverseBindPose[n] x worldTransforms[n]
    worldTransforms[n] = BindPose[n] x worldTransforms[parent]

    1/ What is worldTransforms[parent] of root joint.
    2/ BindPose == tag <matrix sid=”transform”> in <library_visual_scenes> => Is this right?
    3/ BindShape == <float_array id=”Armature_Cube-skin-bind_poses-array”> in <library_controllers> =>Is this right?
    4/ InverseBindPose == 1/BindPose

    I tried many different way but it wasn’t working.
    Toan

    Reply
  272. MicroPirate

    I’m not sure if anyone really maintains this anymore (I hope someone does.) But I have a question that was passed over in the explanation. I tried downloading code for the Roar Engine to find the answer, but I am afraid it is buried too deep.

    What I am wondering is, how did you generate the normal, vertex, and texcoord arrays? I’m looking at changing my Collada interpreter to output an OpenGL friendly version of the file to avoid having my program create the arrays at runtime, but I’m not sure how to do this properly. The only way I can find so far seems too simplistic, my indices array literally becomes { 0, 1, 2, 3, 4, 5 …. n } which makes me really question the need for draw elements.

    Does anyone have any tips on how to do this? I suppose this may be the only way since your arrays have to match in size (which seems extremely silly of the OpenGL designers to do by the way, I much prefer Colladas layout for specifying triangles.)

    Reply
  273. Denis

    I’ve solved this problem.(In previous post in “invbindmatrix” I meant bindshapematrix sorry). I use Cinema4D models, there are some differents in the output collada files, controllers have initial transofrms, the bones too etc.
    In the final calculating block I wrote the following:

    const std::vector* ws = cvi->getWeightSources();
    float TotalJointsWeight = 0;
    for ( int i = 0; i < ws->size(); ++i)
    {
        weightsources* w = ws->at(i);
        const matrix4* mskin = ctrl->getSkinMatrix(w->nodeid);
        tempvector += ((v0 * *mskin * w->weight) );
    
        const matrix4* mskininverse = ctrl->getSkinMatrixInverse(w->nodeid);
        tempnormaltransform = (nv0 * *mskininverse) * w->weight;
        tempnormal	+= tempnormaltransform;
        TotalJointsWeight += w->weight;
    }

    Where the mskininverse is inverse transpose matrix. RotateVector doesn’t work for me, the same solution with inverse transpose matrix works for tangents too.

    Reply
  274. titorel

    I did invert ParentJointWorldMatrix and JointMatrix but if I do the multiplication like this :

    JointWorldMatrix = ParentJointWorldMatrix * JointMatrix;

    it give me something worse.

    And actually the origin of my rotations are at the origin of the world. I keep looking.

    Reply
  275. titorel

    Hello WaZim,

    Thank you for your work, it’s very clear and helped me to import my animation data and to understand COLLADA format.

    Now I’m having a problem with skinning and I can’t figured out a solution. Maybe you can help me.

    I’m testing with a simple cylinder and if I apply a rotation on the rootJoint everything is ok, the entire cylinder rotate.

    The issue I’m dealing with is for the other joints, when I apply a rotation on any other Joint, the angle is correct(with regard to his parents) but the center of rotation, instead of being on the current joint is on the root joint, I think it’s the translations but my matrices are correct (I think). I don’t no if I’m being clear here but if you understood and have an idea about where I made a mistake it will help me a lot.

    Thank you again for your tutorial and your answers in the commentary.

    Reply
  276. Philip

    Great tutorial,thanks!

    But how is the animation finally draw on screen?

    It seems the implementation just tweaks various matrix etc but never ever draw them actually?

    Reply
  277. WTH

    I am wondering why the MAYA astroBoy_walk.dae you provide in your downloads has some animation -output source nodes that only have 2 floats in their float array instead of the 36 expected (since there are 36 keyframes.) Is this an error in the exporter you are using?

    Reply
  278. Justin Crane

    Ok I am referring to these as my main informative site for collada and so far it has helped me a ton. I’ve loaded my entire model and animated my skeleton through this site. However I am have a problems binding the skeleton to the model. I have tried the multiplication that was provided above “((Vertex * BSM) * IBMi * JMi) * JW)” now to make sure I am doing this right let me clarify what I am using for those:
    Vertex = XYZ of the Vertex
    BSM = in library controllers (other sites call BSM the world matrix of current joint/bone)
    IBMi = Inverse bind matrix (bind poses under library controllers)
    JMi = The world matrix of the current joint world matrix
    JW = Weight of the joint from vertex arrays with the values from vertex arrays to go into skin weights
    Here is what I get : http://prntscr.com/1vc3r9
    That is a pic of just the vertexs with binding matching up with the vertexs
    I can move the models vertexs but didnt want to do that because it would look way too confusing.
    Also i am using LWJGL for this so I cant easily multiply a vertex (vector3f) by a matrix (matrix4f). I am putting the vectors values in a new matrix with m03 , m13, m23 with the xyz of the vector. Then i have to use a LWJGL provided multiplication method to multiply the two matrixs.

    Reply
  279. Justin Crane

    Oh, I havent transposed anything yet. I seen transposing helps along the lines but what does transpose really do? And when i did look over my vertexs etc and seen if each joint was getting the correct vertexs and it is. When I multiply inverse bind pose * vertex it makes the xyz go into the hundreds and sometimes thousands when the coordinates of the model, skeleton and animation. I also am not adding the vertex like you are. Everytime i do that it gets really spaced out as well. I will look back to see if i can find that comment and if i dont find it by the time you reply could you point me to the name. Also is there a way to contact you anyway else? Via messenger or something? I have literally no help anywhere else. I will pay if neccessary. I tried adding you on messenger on hotmail but i dont know if you use that email primarily for emailing.

    Reply
  280. Ronan

    Hi waZim great tutorials but there is one thing i couldn’t figure out.
    At the beginning of < visual_scene > in astroBoy_walk_Max there is a node < node id="astroBoy_newSkeleton_deformation_rig" name="deformation_rig" type="NODE" > and then a matrix
    What is this used for?
    Thanks in advance 🙂

    Reply
  281. Matheus

    hello okay I’m Brazilian and do not speak English I’m using the google translate, I would like to know what I do with the bind pose?

    Reply
  282. openxxs

    It’s really helpful to me, thank you! And you mentioned that “we are only concerned with one <geometry> node which will have one <mesh> node”. Now I have to deal with some models downloaded from Google 3D warehouse, which have more than one <geometry>. I hope you can share some ideas about how to deal with it. Thank you!

    Reply
  283. Erin

    This is a great tutorial, however, I really need to understand the structure of a Collada file with multiple textures! There don’t seem to be any more tutorials on the net at all. I have figured out that library_images has the texture files and ids that are similar to the file names, library_effects associates urls with the file name ids, library_materials links the material id with the url, and polylists in library_geometries has material ids. BUT, in the file I am looking at, in library effects there is a url with no texture file name id associated with it. Does it just use the one from above, or what? I need help 🙁

    Reply
  284. Syrdek

    Thank you very much,

    This 3 year old tutorial is still really helpfull to me !
    After having headaches to understand how geometry faces was stored (I parse both 4 and 3 vertices faces), I tryed to parse skinning information. I think I’d give up you didn’t wrote this tutorial.
    Thank you again.

    Reply
  285. Jasmine

    Hi waZim,

    don’t we have to apply the inverse bind pose matrix onto the vertex to bring it back to joint space before applying the joint’s world transformation?

    therefore, wouldn’t the skinningMatrix be
    SkinningMatrix = WorldMatrix * InverseBindMatrix

    instead of
    SkinningMatrix = InverseBindMatrix * WorldMatrix?

    Reply
  286. koen

    Best tutorial I’ve ever read. I really needed it, thank you 🙂
    if there was a donation-button I would have clicked it 😉

    Reply
  287. Pierre

    Wow, it really works, i’ll now play with the values, thanks a lot 😀
    btw thanks for sharing your work. now i’ll go to understand all roar engine 🙂

    Reply
  288. Pierre

    Ya, actually i mean ColladaMax, export the same structure of astroBoy_walk_Max.DAE, but is just the model and the animation , no lights , shadows neither and then use your cba exporter.
    Also i want to know, if there is a way to move astroBoy_walk_Max.DAE, using roar engine, i mean translate the model when i press a key; where should i modify to do that, i’ll really appreciate it if you can help with this, or theres no way to translate the model in axis “x” or “y” or “z”

    Reply
  289. Pierre

    Thanks for replaying, actually i just started on .dae file; at first i was doing some projecto with md2 files, but i saw better things with .dae files, i’ll startd at the begging to see how it works like you said before i made my own model, but im asking how you export your 3d model to .dae format.

    btw thanks a lot.
    🙂

    Reply
  290. Pierre

    Hi, thanks to reply, im using Autodesk 3d max, pluggin MaxCollada exporter v3.05B
    i was using your exporter to cba files., and dnt have any error, also i was using your source code of astroboy i also tried usisng bones instead of a biped, using Hierarchy like you said in your tutorial, the .exe runs ok, but my model doesnt appear, just see the sky and the ground, you know why it happens? i need to do sth else before load the cba?

    Heres a simple model animation http://puu.sh/1wHJd
    Thanks for replaying.
    btw this tutorial help me alot how to understand collada files.

    i was wondering if you can upload your model of atroboy of 3dmax?
    or a skeleton model?

    Reply
  291. Pierre

    hi, its a nice work, actually it help me a lot how to work with collada, i dunno but why i cant load my .dae model i guess my structure model is wrong but dunno why 🙁
    maybe im doing sth wrong

    Reply
  292. Laura

    Hi!, Great tutorial! I have only one doubt, when you talk about “time” data in the animation part, i don´t understand how to translate this into seconds, miliseconds or whatever. On all my collada documents i see that each time value is the result of add a constant to the previous data, like [0,0.2,0.4,0.6,0.8,….] So I don`t know how find the real key frames of my MAX timeline. I try to explain myself. First I though each “time” value, means seconds, depending on the frame/rate do you have in your program, and the frame position of your keyframe.
    For example, for a 25f/s animation, with a key frame in the frame number 110 of the timeline, I suppouse that the time value in collada was 110/25=4,4 (4 seconds and 400 miliseconds), but now I’m not sure. Can you give me any clue about this? Because I have to refresh an animation data, and this is meaning a lot of headache for me. Thanks!

    Reply
  293. Sean

    I have a model containing some individual lines and some faces. I would like to animate it by somehow moving the vertices positions in the geometry. What kind of animation is that, and could it done in Collada?

    Reply
  294. trajan

    Did you ever figure out your problem. I am having the exact same problem. The worldMatrices for my skeleton is correct. I render it and it is correct in the animated pose. Yet when I render any vertices that is animated is distorted ie stretched. Did you figure out your problem? The bind pose renders correctly

    Reply
  295. Aaron

    Great tutorial help me out alot but i have one question when you get the animation data out for each bone do you just do v += (((v * BSM) * (IBMi * JMi) *AM ) * JW)
    AM being the Animation matrix?

    Reply
  296. Josh

    As I have everything working I have one final question for you wazim.

    Is there an error in the astroboy.max file? For all of the keyframes the final matrix element (row3, column3) is 0. This gives an incorrect model. When I manually change the 0 to 1 for all of the keyframes I get accurate animation. Is this a bug or did I miss something?

    Thanks for all of the help along the way, I’m so glad to have it working =)

    Reply
  297. Zirian

    Hi, first of all thank you very much for this exceptionally great tutorial, the only thing i was confused was the <skeleton> node part, i know you have covered this many times before, but as you mentioned we assume all bones are effectors and therefore we should not see <nodes> and <joints> mixed, however the astro boy file contains bone hierarchies with both nodes mixed, and yet we assume we dont have <node> type bones, plus there are about 11 bone trees however there are only 9 <skeleton> nodes are they corelated or not, any explenations would be higly appreciated, and i would be glad if you give me links to sites that explains these nodes more

    Reply
  298. Josh

    Dear waZim,

    I love the tutorials and I am so close to having it working, however my model currently explodes when I perform the skinning. I’m currently just trying to get astroboy into bind pose. I believe that my error is coming from incorrectly calculating the joint matrices.

    Could anyone post or email me the values they have gotten for the astroboy joint matrices so that I can try to debug mine?

    My email is joshua.brittain@mail.utexas.edu

    I started at the root joint and then stored the matrix. Then I went to the next child and stored its matrix as its parent matrix * its matrix and then repeated this process all the way through.

    Reply
  299. Josh

    Thanks for the tutorial. Quick question. You say that the animation values replace the old joint matrix. Does this mean that we are suppose to start with a 4×4 identity matrix, apply the animation translations/rotations, and then multiply it by its parent joint?

    Reply
  300. Jeremy

    Please for the love of god I beg you please please please write a loader for opengl in c++. your tutorial is absolutely amazing for even us beginners but i like many others are not on the level of just writing our own loader or DAE converter to binary loader. I’m currently combing all the corners of the internet just to find an example that i can learn from. Please for the people that have to see to believe please help me.

    thanks again for the awesome tutorial

    Reply
  301. Purr

    Hi Wazim,

    Great tutorial! Got me ahead several times while i was stuck at some point or another. I’m stuck at animation now though and hope you can help me.. Seems I tried everything to no avail :/

    The mesh loads just fine. Every vertex and normal is pre-multiplied with bindShapeMatrix. Vertex bone indices and weights are loaded. Bones are loaded, made into a tree, inverse bind matrices are added and also the arrays of matrices for every keyframe.
    When initializing a bone node, it is initialized with its parent’s node as one of the arguments and the jointMatrix is pre-multiplied with its parent’s jointMatrix there. Before sending the matrix to the vertex shader (which does the last step, applying matrices in combination with their weights to the vertices and the modelview&projectionmatrix), I multiply the matrix with the inverse bind matrix.

    This works wonderfully for the bind pose! The mesh is displayed exactly as expected. But things change when I try to use any of the keyframed matrices. As far as I understand,

    v += {[(v * BSM) * IBMi * JMi] * JW}

    becomes

    v += {[(v * BSM) * IBMi * AMi] * JW}

    Where AMi is the matrix for the current keyframe, calculated exactly the same as with JMi – child matrix multiplied by parent matrix – , correct? I refrained from interpolation altogether. All bones have a matrix for every keyframe, and when animating, I simply loop over all keyframes.

    It seems the basic calculations are correct since the bind pose shows up correct, while when using the keyframed pose matrices, something is off.. The mesh then looks like every child level down the bones tree deforms its vertices more and more, as if rotations are ever more pronounced.
    I’m hoping for a ureka moment.. Might you recognize this condition somehow?

    Reply
  302. Ender Yemenicioglu

    Thanks for the great tutorial. I am trying to write a converter between COLLADA and X3D, and I was really confused with animation. I hope I can improve my converter further now. You have cleared really alot of things, that cannot be found in the COLLADA spec. Sony should take you to the editor team for the next spec.

    Reply
  303. DND

    How are you?
    Thank you for your tutorial.
    I am a novice programmer.
    I think you can make the CBA loader after watching part 2.
    However, only the content that is listed in Part 2 did not make it into the my skills.
    I saw comment that “I do have an exporter and loader, please look at the projects section for more details.”.
    So, I check projects page.
    there was ‘3D rendering engine using CBA file’.
    I would like to add to the code form the CBA loader on my engine.
    Can you help me?

    Reply
  304. Stranger

    Thank you for helpful tutorial. Things are much clearer now.

    Also, let ask you a newbie question:
    Is the initial bind pose of a skeleton the as the 1st key frame pose? If not, how to setup the initial bind pose?

    Reply
  305. Stevenmbiz

    This is really such a great tutorial for skinning animation! The last thing I don’t understand after studying the astroBoy collada file is about the “target” attribute of the animation channel tag that have the “transform (X) (Y)” value. The astroBoy file does have this format and you say that we have to combine them in one matrix when we read the data. So would you mind give me a hint how to do that for the astroBoy example? Thanks in advance.

    Reply
  306. Mike W

    Thanks for the tutorial! It was very helpful for deciphering the collada reference material and reading geometry information. Everything else just seems to say “use FCollada or Collada DOM”.

    I’m writing my own Collada loader as well, and I’m still a little bit confused on the skeleton information and reading the nodes, specifically what the < skeleton > tag is used for. The tutorial only briefly mentions what this is used for, and that there is only one instance of < skeleton >, but even the Astro Boy model has more than one? It has:

    < skeleton >#astroBoy_newSkeleton_root< /skeleton >
    < skeleton >#astroBoy_newSkeleton_L_pinky_01< /skeleton >
    < skeleton >#astroBoy_newSkeleton_L_middle_01< /skeleton >
    etc, etc.

    What exactly is this used for? Why would I need to look at this?

    Just trying to understand, and it makes it tough because I can’t load either example Astro Boy model into Maya 2011, Max 2011 or even Blender! And any example I model/skin in Maya doesn’t export < skeleton > tags.

    Hoping somebody can help clear this up… thanks!

    Reply
  307. Jake

    Hate you for not supplying full source code!!

    But in a way, it’s good. Forced me to step through every minute detail to understand everything. Appreciate it very much. Thanks!

    Reply
  308. Reloaded

    Thanks. This cleared things a bit here and there, however, I didn’t get an explanation (or maybe just missed it) for the only thing that bothers me about skeletal animation. If I have only one mesh in section consisting of one set of vertices, how do I know which part of them forms a head for my seymour model? I can draw a model and I can perform joint transformations, yet I’m still unable to attach model to skeleton.

    When using keyframe animation, geometry is associated with appropriate joint, therefore joint transformations also animates respective geometry. However, nothing of this is valid for skeletal animation.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *