
<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.robotika.sk/robowiki/index.php?action=history&amp;feed=atom&amp;title=Source_4</id>
		<title>Source 4 - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.robotika.sk/robowiki/index.php?action=history&amp;feed=atom&amp;title=Source_4"/>
		<link rel="alternate" type="text/html" href="https://wiki.robotika.sk/robowiki/index.php?title=Source_4&amp;action=history"/>
		<updated>2026-04-30T16:34:05Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>https://wiki.robotika.sk/robowiki/index.php?title=Source_4&amp;diff=1652&amp;oldid=prev</id>
		<title>Admin: import from robotika.sk</title>
		<link rel="alternate" type="text/html" href="https://wiki.robotika.sk/robowiki/index.php?title=Source_4&amp;diff=1652&amp;oldid=prev"/>
				<updated>2006-11-30T04:54:56Z</updated>
		
		<summary type="html">&lt;p&gt;import from robotika.sk&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#include &amp;lt;ode/ode.h&amp;gt;&lt;br /&gt;
#include &amp;lt;drawstuff/drawstuff.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifdef _MSC_VER&lt;br /&gt;
#pragma warning(disable:4244 4305)  // for VC++, no precision loss complaints&lt;br /&gt;
#endif &lt;br /&gt;
&lt;br /&gt;
// select correct drawing functions&lt;br /&gt;
&lt;br /&gt;
#ifdef dDOUBLE&lt;br /&gt;
#define dsDrawBox dsDrawBoxD&lt;br /&gt;
#define dsDrawSphere dsDrawSphereD&lt;br /&gt;
#define dsDrawCylinder dsDrawCylinderD&lt;br /&gt;
#define dsDrawCapsule dsDrawCapsuleD&lt;br /&gt;
#define dsDrawLine dsDrawLineD&lt;br /&gt;
#define dsDrawTriangle dsDrawTriangleD&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// some constants&lt;br /&gt;
&lt;br /&gt;
#define NUM 1000			// max number of objects&lt;br /&gt;
#define DENSITY_ROTOR (4.5)		// density of rotor&lt;br /&gt;
#define DENSITY_AIR (1.2)	// density of air&lt;br /&gt;
#define MAX_CONTACTS 1024		// maximum number of contact points per body&lt;br /&gt;
#define NEW_PER_STEP	10		// must be less then NUM&lt;br /&gt;
#define TIMESTEP	0.01&lt;br /&gt;
#define MOLECULE_SIZE	0.005&lt;br /&gt;
#define INITIAL_FORCE_Y 0.0001&lt;br /&gt;
&lt;br /&gt;
// dynamics and collision objects&lt;br /&gt;
&lt;br /&gt;
struct MyObject {&lt;br /&gt;
	dBodyID body;			// the body&lt;br /&gt;
	dGeomID geom;		// geometries representing this body&lt;br /&gt;
&lt;br /&gt;
	// Trimesh only - double buffered matrices for 'last transform' setup&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
static int num=0;		// number of objects in simulation&lt;br /&gt;
static int nextobj=0;		// next object to recycle if num==NUM&lt;br /&gt;
static dWorldID world;&lt;br /&gt;
static dSpaceID space;&lt;br /&gt;
static MyObject obj[NUM];&lt;br /&gt;
static dJointGroupID contactgroup;&lt;br /&gt;
static int selected = -1;	// selected object&lt;br /&gt;
static int show_aabb = 0;	// show geom AABBs?&lt;br /&gt;
static int show_contacts = 0;	// show contact points?&lt;br /&gt;
static int random_pos = 1;	// drop objects from random position?&lt;br /&gt;
&lt;br /&gt;
static long int stepp = 0;&lt;br /&gt;
&lt;br /&gt;
// Bunny mesh ripped from Opcode&lt;br /&gt;
const int VertexCount = 74;			&lt;br /&gt;
const int IndexCount = 18 * 6 * 3;&lt;br /&gt;
&lt;br /&gt;
typedef dReal dVector3R[3];&lt;br /&gt;
&lt;br /&gt;
static dGeomID TriMesh1;&lt;br /&gt;
static dGeomID TriMesh2;&lt;br /&gt;
static dGeomID List1;&lt;br /&gt;
static dGeomID List2;&lt;br /&gt;
static dTriMeshDataID TriData1, TriData2;  // reusable static trimesh data&lt;br /&gt;
&lt;br /&gt;
static dGeomID Capsule;&lt;br /&gt;
static dGeomID blade1_geom;&lt;br /&gt;
static dGeomID blade2_geom;&lt;br /&gt;
static dGeomID axis_geom;&lt;br /&gt;
&lt;br /&gt;
static dBodyID rotor;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
static dJointID lozisko;&lt;br /&gt;
&lt;br /&gt;
float Vertices[VertexCount * 3] = {&lt;br /&gt;
	REAL(-0.275), REAL(0.0), REAL(0.1),&lt;br /&gt;
	REAL(-0.275), REAL(0.0), REAL(0.0),&lt;br /&gt;
	REAL(-0.275), REAL(0.0), REAL(-0.1),&lt;br /&gt;
	REAL(-0.25), REAL(0.0), REAL(0.15),&lt;br /&gt;
	REAL(-0.25), REAL(0.0), REAL(0.05),&lt;br /&gt;
	REAL(-0.25), REAL(0.0), REAL(-0.05),&lt;br /&gt;
	REAL(-0.25), REAL(0.0), REAL(-0.15),&lt;br /&gt;
	REAL(-0.225), REAL(0.0), REAL(0.1),&lt;br /&gt;
	REAL(-0.225), REAL(0.0), REAL(0.0),&lt;br /&gt;
	REAL(-0.225), REAL(0.0), REAL(-0.1),&lt;br /&gt;
	REAL(-0.2), REAL(0.0), REAL(0.15),&lt;br /&gt;
	REAL(-0.2), REAL(0.0), REAL(0.05),&lt;br /&gt;
	REAL(-0.2), REAL(0.0), REAL(-0.05),&lt;br /&gt;
	REAL(-0.2), REAL(0.0), REAL(-0.15),&lt;br /&gt;
	REAL(-0.175), REAL(0.0), REAL(0.1),&lt;br /&gt;
	REAL(-0.175), REAL(0.0), REAL(0.0),&lt;br /&gt;
	REAL(-0.175), REAL(0.0), REAL(-0.1),&lt;br /&gt;
	REAL(-0.15), REAL(0.0), REAL(0.05),&lt;br /&gt;
	REAL(-0.15), REAL(0.0), REAL(-0.05),&lt;br /&gt;
	REAL(-0.125), REAL(0.0), REAL(0.1),&lt;br /&gt;
	REAL(-0.125), REAL(0.0), REAL(0.0),&lt;br /&gt;
	REAL(-0.125), REAL(0.0), REAL(-0.1),&lt;br /&gt;
	REAL(-0.1), REAL(0.0), REAL(0.15),&lt;br /&gt;
	REAL(-0.1), REAL(0.0), REAL(0.05),&lt;br /&gt;
	REAL(-0.1), REAL(0.0), REAL(-0.05),&lt;br /&gt;
	REAL(-0.1), REAL(0.0), REAL(-0.15),&lt;br /&gt;
	REAL(-0.075), REAL(0.0), REAL(0.1),&lt;br /&gt;
	REAL(-0.075), REAL(0.0), REAL(0.0),&lt;br /&gt;
	REAL(-0.075), REAL(0.0), REAL(-0.1),&lt;br /&gt;
	REAL(-0.05), REAL(0.0), REAL(0.15),&lt;br /&gt;
	REAL(-0.05), REAL(0.0), REAL(0.05),&lt;br /&gt;
	REAL(-0.05), REAL(0.0), REAL(-0.05),&lt;br /&gt;
	REAL(-0.05), REAL(0.0), REAL(-0.15),&lt;br /&gt;
	REAL(-0.025), REAL(0.0), REAL(0.1),&lt;br /&gt;
	REAL(-0.025), REAL(0.0), REAL(0.0),&lt;br /&gt;
	REAL(-0.025), REAL(0.0), REAL(-0.1),&lt;br /&gt;
	REAL(0.0), REAL(0.0), REAL(0.05),&lt;br /&gt;
	REAL(0.0), REAL(0.0), REAL(-0.05),&lt;br /&gt;
	REAL(0.025), REAL(0.0), REAL(0.1),&lt;br /&gt;
	REAL(0.025), REAL(0.0), REAL(0.0),&lt;br /&gt;
	REAL(0.025), REAL(0.0), REAL(-0.1),&lt;br /&gt;
	REAL(0.05), REAL(0.0), REAL(0.15),&lt;br /&gt;
	REAL(0.05), REAL(0.0), REAL(0.05),&lt;br /&gt;
	REAL(0.05), REAL(0.0), REAL(-0.05),&lt;br /&gt;
	REAL(0.05), REAL(0.0), REAL(-0.15),&lt;br /&gt;
	REAL(0.075), REAL(0.0), REAL(0.1),&lt;br /&gt;
	REAL(0.075), REAL(0.0), REAL(0.0),&lt;br /&gt;
	REAL(0.075), REAL(0.0), REAL(-0.1),&lt;br /&gt;
	REAL(0.1), REAL(0.0), REAL(0.15),&lt;br /&gt;
	REAL(0.1), REAL(0.0), REAL(0.05),&lt;br /&gt;
	REAL(0.1), REAL(0.0), REAL(-0.05),&lt;br /&gt;
	REAL(0.1), REAL(0.0), REAL(-0.15),&lt;br /&gt;
	REAL(0.125), REAL(0.0), REAL(0.1),&lt;br /&gt;
	REAL(0.125), REAL(0.0), REAL(0.0),&lt;br /&gt;
	REAL(0.125), REAL(0.0), REAL(-0.1),&lt;br /&gt;
	REAL(0.15), REAL(0.0), REAL(0.05),&lt;br /&gt;
	REAL(0.15), REAL(0.0), REAL(-0.05),&lt;br /&gt;
	REAL(0.175), REAL(0.0), REAL(0.1),&lt;br /&gt;
	REAL(0.175), REAL(0.0), REAL(0.0),&lt;br /&gt;
	REAL(0.175), REAL(0.0), REAL(-0.1),&lt;br /&gt;
	REAL(0.2), REAL(0.0), REAL(0.15),&lt;br /&gt;
	REAL(0.2), REAL(0.0), REAL(0.05),&lt;br /&gt;
	REAL(0.2), REAL(0.0), REAL(-0.05),&lt;br /&gt;
	REAL(0.2), REAL(0.0), REAL(-0.15),&lt;br /&gt;
	REAL(0.225), REAL(0.0), REAL(0.1),&lt;br /&gt;
	REAL(0.225), REAL(0.0), REAL(0.0),&lt;br /&gt;
	REAL(0.225), REAL(0.0), REAL(-0.1),&lt;br /&gt;
	REAL(0.25), REAL(0.0), REAL(0.15),&lt;br /&gt;
	REAL(0.25), REAL(0.0), REAL(0.05),&lt;br /&gt;
	REAL(0.25), REAL(0.0), REAL(-0.05),&lt;br /&gt;
	REAL(0.25), REAL(0.0), REAL(-0.15),&lt;br /&gt;
	REAL(0.275), REAL(0.0), REAL(0.1),&lt;br /&gt;
	REAL(0.275), REAL(0.0), REAL(0.0),&lt;br /&gt;
	REAL(0.275), REAL(0.0), REAL(-0.1),&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int Indices[IndexCount / 3][3] = {&lt;br /&gt;
	{0, 3, 7},&lt;br /&gt;
	{10, 7, 3},&lt;br /&gt;
	{7, 10, 14},&lt;br /&gt;
	{7, 14, 11},&lt;br /&gt;
	{4, 7, 11},&lt;br /&gt;
	{0, 7, 4},&lt;br /&gt;
&lt;br /&gt;
	{1, 4, 8},&lt;br /&gt;
	{8, 4, 11},&lt;br /&gt;
	{8, 11, 15},&lt;br /&gt;
	{8, 15, 12},&lt;br /&gt;
	{5, 8, 12},&lt;br /&gt;
	{5, 1, 8},&lt;br /&gt;
&lt;br /&gt;
	{2, 5, 9},&lt;br /&gt;
	{9, 5, 12},&lt;br /&gt;
	{9, 12, 16},&lt;br /&gt;
	{9, 16, 13},&lt;br /&gt;
	{6, 9, 13},&lt;br /&gt;
	{6, 2, 9},&lt;br /&gt;
&lt;br /&gt;
	{11, 14, 17},&lt;br /&gt;
	{17, 14, 19},&lt;br /&gt;
	{17, 19, 23},&lt;br /&gt;
	{17, 23, 20},&lt;br /&gt;
	{15, 17, 20},&lt;br /&gt;
	{15, 11, 17},&lt;br /&gt;
&lt;br /&gt;
	{12, 15, 18},&lt;br /&gt;
	{18, 15, 20},&lt;br /&gt;
	{18, 20, 24},&lt;br /&gt;
	{18, 24, 21},&lt;br /&gt;
	{16, 18, 21},&lt;br /&gt;
	{16, 12, 18},&lt;br /&gt;
&lt;br /&gt;
	{19, 22, 26},&lt;br /&gt;
	{26, 22, 29},&lt;br /&gt;
	{26, 29, 33},&lt;br /&gt;
	{26, 33, 30},&lt;br /&gt;
	{23, 26, 30},&lt;br /&gt;
	{23, 19, 26},&lt;br /&gt;
&lt;br /&gt;
	{20, 23, 27},&lt;br /&gt;
	{27, 23, 30},&lt;br /&gt;
	{27, 30, 34},&lt;br /&gt;
	{31, 27, 34},&lt;br /&gt;
	{24, 27, 31},&lt;br /&gt;
	{24, 20, 27},&lt;br /&gt;
&lt;br /&gt;
	{21, 24, 28},&lt;br /&gt;
	{28, 24, 31},&lt;br /&gt;
	{28, 31, 35},&lt;br /&gt;
	{32, 28, 35},&lt;br /&gt;
	{25, 28, 32},&lt;br /&gt;
	{25, 21, 28},&lt;br /&gt;
&lt;br /&gt;
	{30, 33, 36},&lt;br /&gt;
	{36, 33, 38},&lt;br /&gt;
	{36, 38, 42},&lt;br /&gt;
	{39, 36, 42},&lt;br /&gt;
	{34, 36, 39},&lt;br /&gt;
	{34, 30, 36},&lt;br /&gt;
&lt;br /&gt;
	{31, 34, 37},&lt;br /&gt;
	{37, 34, 39},&lt;br /&gt;
	{37, 39, 43},&lt;br /&gt;
	{40, 37, 43},&lt;br /&gt;
	{35, 37, 40},&lt;br /&gt;
	{35, 31, 37},&lt;br /&gt;
&lt;br /&gt;
	{38, 41, 45},&lt;br /&gt;
	{45, 41, 48},&lt;br /&gt;
	{45, 48, 52},&lt;br /&gt;
	{49, 45, 52},&lt;br /&gt;
	{42, 45, 49},&lt;br /&gt;
	{42, 38, 45},&lt;br /&gt;
&lt;br /&gt;
	{39, 42, 46},&lt;br /&gt;
	{46, 42, 49},&lt;br /&gt;
	{46, 49, 53},&lt;br /&gt;
	{50, 46, 53},&lt;br /&gt;
	{43, 46, 50},&lt;br /&gt;
	{43, 39, 46},&lt;br /&gt;
&lt;br /&gt;
	{40, 43, 47},&lt;br /&gt;
	{47, 43, 50},&lt;br /&gt;
	{47, 50, 54},&lt;br /&gt;
	{51, 47, 54},&lt;br /&gt;
	{44, 47, 51},&lt;br /&gt;
	{44, 40, 47},&lt;br /&gt;
&lt;br /&gt;
	{49, 52, 55},&lt;br /&gt;
	{55, 52, 57},&lt;br /&gt;
	{55, 57, 61},&lt;br /&gt;
	{58, 55, 61},&lt;br /&gt;
	{53, 55, 58},&lt;br /&gt;
	{53, 49, 55},&lt;br /&gt;
&lt;br /&gt;
	{50, 53, 56},&lt;br /&gt;
	{56, 53, 58},&lt;br /&gt;
	{56, 58, 62},&lt;br /&gt;
	{59, 56, 62},&lt;br /&gt;
	{54, 56, 59},&lt;br /&gt;
	{54, 50, 56},&lt;br /&gt;
&lt;br /&gt;
	{57, 60, 64},&lt;br /&gt;
	{64, 60, 67},&lt;br /&gt;
	{64, 67, 71},&lt;br /&gt;
	{68, 64, 71},&lt;br /&gt;
	{61, 64, 68},&lt;br /&gt;
	{61, 57, 64},&lt;br /&gt;
&lt;br /&gt;
	{58, 61, 65},&lt;br /&gt;
	{65, 61, 68},&lt;br /&gt;
	{65, 68, 72},&lt;br /&gt;
	{69, 65, 72},&lt;br /&gt;
	{62, 65, 69},&lt;br /&gt;
	{62, 58, 65},&lt;br /&gt;
&lt;br /&gt;
	{59, 62, 66},&lt;br /&gt;
	{66, 62, 69},&lt;br /&gt;
	{66, 69, 73},&lt;br /&gt;
	{70, 66, 73},&lt;br /&gt;
	{63, 66, 70},&lt;br /&gt;
	{63, 59, 66}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// this is called by dSpaceCollide when two objects in space are&lt;br /&gt;
// potentially colliding.&lt;br /&gt;
&lt;br /&gt;
static void nearCallback (void *data, dGeomID o1, dGeomID o2)&lt;br /&gt;
{&lt;br /&gt;
	int i;&lt;br /&gt;
	//if ((o1 == 0) || (o2 == 0)) return;&lt;br /&gt;
	//if (o1-&amp;gt;body &amp;amp;&amp;amp; o2-&amp;gt;body) return;&lt;br /&gt;
	if (dGeomGetClass(o1) == dGeomGetClass(o2)) return;&lt;br /&gt;
&lt;br /&gt;
	// exit without doing anything if the two bodies are connected by a joint&lt;br /&gt;
	dBodyID b1 = dGeomGetBody(o1);&lt;br /&gt;
	dBodyID b2 = dGeomGetBody(o2);&lt;br /&gt;
	if (b1 &amp;amp;&amp;amp; b2 &amp;amp;&amp;amp; dAreConnectedExcluding (b1,b2,dJointTypeContact)) return;&lt;br /&gt;
&lt;br /&gt;
	dContact contact[MAX_CONTACTS];   // up to MAX_CONTACTS contacts per box-box&lt;br /&gt;
	for (i=0; i&amp;lt;MAX_CONTACTS; i++) {&lt;br /&gt;
		contact[i].surface.mode = dContactBounce | dContactSoftCFM;&lt;br /&gt;
		contact[i].surface.mu = 0;&lt;br /&gt;
		contact[i].surface.mu2 = 0;&lt;br /&gt;
		contact[i].surface.bounce = 0.1;&lt;br /&gt;
		contact[i].surface.bounce_vel = 0.1;&lt;br /&gt;
		contact[i].surface.soft_cfm = 0.01;&lt;br /&gt;
	}&lt;br /&gt;
	if (int numc = dCollide (o1,o2,MAX_CONTACTS,&amp;amp;contact[0].geom,&lt;br /&gt;
		sizeof(dContact))) {&lt;br /&gt;
			dMatrix3 RI;&lt;br /&gt;
			dRSetIdentity (RI);&lt;br /&gt;
			const dReal ss[3] = {0.02,0.02,0.02};&lt;br /&gt;
			for (i=0; i&amp;lt;numc; i++) {&lt;br /&gt;
				dJointID c = dJointCreateContact (world,contactgroup,contact+i);&lt;br /&gt;
				dJointAttach (c,b1,b2);&lt;br /&gt;
				if (show_contacts) dsDrawBox (contact[i].geom.pos,RI,ss);&lt;br /&gt;
			}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// start simulation - set viewpoint&lt;br /&gt;
&lt;br /&gt;
static void start()&lt;br /&gt;
{&lt;br /&gt;
	static float xyz[3] = {1,0,1};//{2.1640f,-1.3079f,1.7600f};&lt;br /&gt;
	static float hpr[3] = {180,0,0};//{125.5000f,-17.0000f,0.0000f};&lt;br /&gt;
	dsSetViewpoint (xyz,hpr);&lt;br /&gt;
	printf (&amp;quot;To toggle showing the geom AABBs, press a.\n&amp;quot;);&lt;br /&gt;
	printf (&amp;quot;To toggle showing the contact points, press t.\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
char locase (char c)&lt;br /&gt;
{&lt;br /&gt;
	if (c &amp;gt;= 'A' &amp;amp;&amp;amp; c &amp;lt;= 'Z') return c - ('a'-'A');&lt;br /&gt;
	else return c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// called when a key pressed&lt;br /&gt;
&lt;br /&gt;
static void command (int cmd)&lt;br /&gt;
{&lt;br /&gt;
	cmd = locase (cmd);&lt;br /&gt;
	if (cmd == 'a') {&lt;br /&gt;
		show_aabb ^= 1;&lt;br /&gt;
	}&lt;br /&gt;
	else if (cmd == 't') {&lt;br /&gt;
		show_contacts ^= 1;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// draw a geom&lt;br /&gt;
&lt;br /&gt;
void drawGeom (dGeomID g, const dReal *pos, const dReal *R, int show_aabb)&lt;br /&gt;
{&lt;br /&gt;
	if (!g) return;&lt;br /&gt;
	if (!pos) pos = dGeomGetPosition (g);&lt;br /&gt;
	if (!R) R = dGeomGetRotation (g);&lt;br /&gt;
&lt;br /&gt;
	int type = dGeomGetClass (g);&lt;br /&gt;
	if (type == dBoxClass) {&lt;br /&gt;
		dVector3 sides;&lt;br /&gt;
		dGeomBoxGetLengths (g,sides);&lt;br /&gt;
		dsDrawBox (pos,R,sides);&lt;br /&gt;
	}&lt;br /&gt;
	else if (type == dSphereClass) {&lt;br /&gt;
		dsDrawSphere (pos,R,dGeomSphereGetRadius (g));&lt;br /&gt;
	}&lt;br /&gt;
	else if (type == dCapsuleClass) {&lt;br /&gt;
		dReal radius,length;&lt;br /&gt;
		dGeomCapsuleGetParams (g,&amp;amp;radius,&amp;amp;length);&lt;br /&gt;
		dsDrawCapsule (pos,R,length,radius);&lt;br /&gt;
	}&lt;br /&gt;
	else if (type == dGeomTransformClass) {&lt;br /&gt;
		dGeomID g2 = dGeomTransformGetGeom (g);&lt;br /&gt;
		const dReal *pos2 = dGeomGetPosition (g2);&lt;br /&gt;
		const dReal *R2 = dGeomGetRotation (g2);&lt;br /&gt;
		dVector3 actual_pos;&lt;br /&gt;
		dMatrix3 actual_R;&lt;br /&gt;
		dMULTIPLY0_331 (actual_pos,R,pos2);&lt;br /&gt;
		actual_pos[0] += pos[0];&lt;br /&gt;
		actual_pos[1] += pos[1];&lt;br /&gt;
		actual_pos[2] += pos[2];&lt;br /&gt;
		dMULTIPLY0_333 (actual_R,R,R2);&lt;br /&gt;
		drawGeom (g2,actual_pos,actual_R,0);&lt;br /&gt;
	} &lt;br /&gt;
	else if (type == dTriMeshClass) {&lt;br /&gt;
		int* Indices = (int*)::Indices;&lt;br /&gt;
&lt;br /&gt;
		for (int ii = 0; ii &amp;lt; IndexCount / 3; ii++) {&lt;br /&gt;
			const dReal v[9] = { // explicit conversion from float to dReal&lt;br /&gt;
				Vertices[Indices[ii * 3 + 0] * 3 + 0],&lt;br /&gt;
				Vertices[Indices[ii * 3 + 0] * 3 + 1],&lt;br /&gt;
				Vertices[Indices[ii * 3 + 0] * 3 + 2],&lt;br /&gt;
				Vertices[Indices[ii * 3 + 1] * 3 + 0],&lt;br /&gt;
				Vertices[Indices[ii * 3 + 1] * 3 + 1],&lt;br /&gt;
				Vertices[Indices[ii * 3 + 1] * 3 + 2],&lt;br /&gt;
				Vertices[Indices[ii * 3 + 2] * 3 + 0],&lt;br /&gt;
				Vertices[Indices[ii * 3 + 2] * 3 + 1],&lt;br /&gt;
				Vertices[Indices[ii * 3 + 2] * 3 + 2]&lt;br /&gt;
			};&lt;br /&gt;
			dsDrawTriangle(pos, R, &amp;amp;v[0], &amp;amp;v[3], &amp;amp;v[6], 0);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (show_aabb) {&lt;br /&gt;
		// draw the bounding box for this geom&lt;br /&gt;
		dReal aabb[6];&lt;br /&gt;
		dGeomGetAABB (g,aabb);&lt;br /&gt;
		dVector3 bbpos;&lt;br /&gt;
		for (int i=0; i&amp;lt;3; i++) bbpos[i] = 0.5*(aabb[i*2] + aabb[i*2+1]);&lt;br /&gt;
		dVector3 bbsides;&lt;br /&gt;
		for (int j=0; j&amp;lt;3; j++) bbsides[j] = aabb[j*2+1] - aabb[j*2];&lt;br /&gt;
		dMatrix3 RI;&lt;br /&gt;
		dRSetIdentity (RI);&lt;br /&gt;
		dsSetColorAlpha (1,0,0,0.5);&lt;br /&gt;
		dsDrawBox (bbpos,RI,bbsides);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// simulation loop&lt;br /&gt;
&lt;br /&gt;
static void simLoop (int pause)&lt;br /&gt;
{&lt;br /&gt;
	dsSetColor (1,0,0);&lt;br /&gt;
	dSpaceCollide (space,0,&amp;amp;nearCallback);&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;%ld\t&amp;quot;, stepp++);&lt;br /&gt;
&lt;br /&gt;
	static int start = 500;&lt;br /&gt;
	int i,k;&lt;br /&gt;
	dMass m;&lt;br /&gt;
	dMatrix3 R;&lt;br /&gt;
	const dReal* a;&lt;br /&gt;
	dRFromAxisAndAngle (R, 0.0, 0.0, 0.0, 0);&lt;br /&gt;
&lt;br /&gt;
	if (start &amp;gt; 0) start--;&lt;br /&gt;
	if (!start &amp;amp;&amp;amp; !pause)&lt;br /&gt;
	{&lt;br /&gt;
		if (num &amp;gt;= NUM - NEW_PER_STEP - 1)&lt;br /&gt;
			start = -1;&lt;br /&gt;
		for (k = 0; k &amp;lt; NEW_PER_STEP; k++)&lt;br /&gt;
		{&lt;br /&gt;
			if (obj[num+k].body) // this case should be rare&lt;br /&gt;
			{&lt;br /&gt;
				continue;&lt;br /&gt;
			}&lt;br /&gt;
			obj[num+k].body = dBodyCreate (world);&lt;br /&gt;
&lt;br /&gt;
			dBodySetPosition (obj[num+k].body, dRandReal()-0.5, -1.0 + (dRandReal()-0.5)/10, dRandReal()+0.5);&lt;br /&gt;
&lt;br /&gt;
			dMassSetSphere (&amp;amp;m,DENSITY_AIR, MOLECULE_SIZE);&lt;br /&gt;
			obj[num+k].geom = dCreateSphere (space, MOLECULE_SIZE);&lt;br /&gt;
			dGeomSetBody (obj[num+k].geom, obj[num+k].body);&lt;br /&gt;
&lt;br /&gt;
			dBodySetMass (obj[num+k].body,&amp;amp;m);&lt;br /&gt;
			dBodyAddRelForceAtRelPos (obj[num+k].body, 0.0, INITIAL_FORCE_Y, 0.0, 0.0, 0.0, 0.0);&lt;br /&gt;
		}&lt;br /&gt;
		num += NEW_PER_STEP;&lt;br /&gt;
	}&lt;br /&gt;
	dsSetColor (1,1,0);&lt;br /&gt;
	dsSetTexture (DS_WOOD);&lt;br /&gt;
	for (int i=0; i&amp;lt;num; i++) {&lt;br /&gt;
		if (obj[i].geom) {&lt;br /&gt;
			a = dGeomGetPosition (obj[i].geom);&lt;br /&gt;
			// restart particles flying out of rotor space&lt;br /&gt;
			if ((a[0] &amp;lt; -0.5) || (a[0] &amp;gt; 0.5) || (a[2] &amp;lt; 0.5) || (a[2] &amp;gt; 1.5) || (a[1] &amp;gt; 0.5) || (a[1] &amp;lt; -1.0))&lt;br /&gt;
			{&lt;br /&gt;
				// particles are flying in a loop when it reaches 0.2 then is restarted around -0.2 with new position&lt;br /&gt;
				dBodySetPosition (obj[i].body, dRandReal()-0.5, -0.5 + (dRandReal()-0.5)/10,dRandReal()+0.5);&lt;br /&gt;
				dBodySetLinearVel (obj[i].body, 0.0, 0.0, 0.0);&lt;br /&gt;
				dBodySetRotation (obj[i].body, R);&lt;br /&gt;
				dBodyAddRelForceAtRelPos (obj[i].body, 0.0, INITIAL_FORCE_Y, 0.0, 0.0, 0.0, 0.0);&lt;br /&gt;
			}&lt;br /&gt;
			// checking the force affecting particles&lt;br /&gt;
			//a = dBodyGetForce (obj[i].body);&lt;br /&gt;
			//if (a[0] || a[1] || a[2])&lt;br /&gt;
			//	printf (&amp;quot;obj[%d].body-force = [%5.4f, %5.4f, %5.4f]\n&amp;quot;, i, a[0], a[1], a[2]);&lt;br /&gt;
&lt;br /&gt;
			drawGeom (obj[i].geom,0,0,show_aabb);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	dsSetColor (0,0,1);&lt;br /&gt;
	drawGeom (blade1_geom, 0, 0, show_aabb);&lt;br /&gt;
	drawGeom (blade2_geom, 0, 0, show_aabb);&lt;br /&gt;
	drawGeom (axis_geom, 0, 0, show_aabb);&lt;br /&gt;
&lt;br /&gt;
	if (!pause) dWorldStep (world, TIMESTEP);&lt;br /&gt;
//	if (!pause) dWorldStepFast1 (world,TIMESTEP, 5);&lt;br /&gt;
&lt;br /&gt;
    // remove all contact joints&lt;br /&gt;
	dJointGroupEmpty (contactgroup);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
	// setup pointers to drawstuff callback functions&lt;br /&gt;
	dsFunctions fn;&lt;br /&gt;
	fn.version = DS_VERSION;&lt;br /&gt;
	fn.start = &amp;amp;start;&lt;br /&gt;
	fn.step = &amp;amp;simLoop;&lt;br /&gt;
	fn.command = &amp;amp;command;&lt;br /&gt;
	fn.stop = 0;&lt;br /&gt;
	fn.path_to_textures = &amp;quot;../../drawstuff/textures&amp;quot;;&lt;br /&gt;
	if(argc==2)&lt;br /&gt;
	{&lt;br /&gt;
		fn.path_to_textures = argv[1];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// create world&lt;br /&gt;
&lt;br /&gt;
	world = dWorldCreate();&lt;br /&gt;
&lt;br /&gt;
	space = dSimpleSpaceCreate(0);&lt;br /&gt;
	contactgroup = dJointGroupCreate (0);&lt;br /&gt;
	dWorldSetGravity (world,0,0,0);&lt;br /&gt;
	dWorldSetCFM (world,1e-5);&lt;br /&gt;
	dCreatePlane (space,0,0,1,0);&lt;br /&gt;
&lt;br /&gt;
	memset (obj,0,sizeof(obj));&lt;br /&gt;
&lt;br /&gt;
//	 note: can't share tridata if intending to trimesh-trimesh collide&lt;br /&gt;
	TriData1 = dGeomTriMeshDataCreate();&lt;br /&gt;
	dGeomTriMeshDataBuildSingle(TriData1, &amp;amp;Vertices[0], 3 * sizeof(float), VertexCount, (int*)&amp;amp;Indices[0], IndexCount, 3 * sizeof(int));&lt;br /&gt;
	TriData2 = dGeomTriMeshDataCreate();&lt;br /&gt;
	dGeomTriMeshDataBuildSingle(TriData2, &amp;amp;Vertices[0], 3 * sizeof(float), VertexCount, (int*)&amp;amp;Indices[0], IndexCount, 3 * sizeof(int));&lt;br /&gt;
	&lt;br /&gt;
	TriMesh1 = dCreateTriMesh(0, TriData1, 0, 0, 0);&lt;br /&gt;
	TriMesh2 = dCreateTriMesh(0, TriData2, 0, 0, 0);&lt;br /&gt;
	&lt;br /&gt;
	{&lt;br /&gt;
		dMatrix3 R;&lt;br /&gt;
		dMass m;&lt;br /&gt;
		dMass m2;&lt;br /&gt;
		dMassSetZero (&amp;amp;m);&lt;br /&gt;
&lt;br /&gt;
	// rotor body - comprises 3 GeomTransforms&lt;br /&gt;
		rotor = dBodyCreate (world);&lt;br /&gt;
&lt;br /&gt;
//		List1 = dCreateBox (0, 0.5, 0.1, 0.001);&lt;br /&gt;
		//blade1 of Rotor - encapsulating geom&lt;br /&gt;
		blade1_geom = dCreateGeomTransform (space);&lt;br /&gt;
		dGeomTransformSetCleanup (blade1_geom,1);&lt;br /&gt;
		dMassSetBox (&amp;amp;m2,DENSITY_ROTOR,0.5, 0.001, 0.1/*rozmery kocky s rovnakym objemom ako vsetky trojuholniky trimeshu s hrubkou napr. 0.1*/);&lt;br /&gt;
		dGeomTransformSetGeom (blade1_geom,TriMesh1);&lt;br /&gt;
&lt;br /&gt;
		// set the transformation (adjust the mass too)&lt;br /&gt;
		dGeomSetPosition (TriMesh1,0.25,0.0,0.0);&lt;br /&gt;
		dMassTranslate (&amp;amp;m2,0.0,0.0,0.0 );&lt;br /&gt;
		dMatrix3 Rtx;&lt;br /&gt;
		dRFromAxisAndAngle (Rtx, 1.0,0.0,0.0, M_PI / 4);&lt;br /&gt;
		dGeomSetRotation (TriMesh1,Rtx);&lt;br /&gt;
		dMassRotate (&amp;amp;m2,Rtx);&lt;br /&gt;
		// add to the total mass&lt;br /&gt;
		dMassAdd (&amp;amp;m,&amp;amp;m2);&lt;br /&gt;
&lt;br /&gt;
//		List2 = dCreateBox (0, 0.5, 0.1, 0.001);&lt;br /&gt;
		//blade2 of Rotor - encapsulating geom&lt;br /&gt;
		blade2_geom = dCreateGeomTransform (space);&lt;br /&gt;
		dGeomTransformSetCleanup (blade2_geom,1);&lt;br /&gt;
		dMassSetBox (&amp;amp;m2,DENSITY_ROTOR,0.5, 0.001, 0.1/*rozmery kocky s rovnakym objemom ako vsetky trojuholniky trimeshu s hrubkou napr. 0.1*/);&lt;br /&gt;
		dGeomTransformSetGeom (blade2_geom,TriMesh2);&lt;br /&gt;
&lt;br /&gt;
		// set the transformation (adjust the mass too)&lt;br /&gt;
		dGeomSetPosition (TriMesh2,-0.25,0.0,0.0); &lt;br /&gt;
		dMassTranslate (&amp;amp;m2,0.0,0.0,0.0 );&lt;br /&gt;
&lt;br /&gt;
		dRFromAxisAndAngle (Rtx, 0.0,0.0,1.0, M_PI);&lt;br /&gt;
		dQuaternion q1;&lt;br /&gt;
		dRtoQ (Rtx, q1);&lt;br /&gt;
		dRFromAxisAndAngle (Rtx, 1.0,0.0,0.0, M_PI / 4);&lt;br /&gt;
		dQuaternion q2;&lt;br /&gt;
		dRtoQ (Rtx, q2);&lt;br /&gt;
		dQuaternion qr;&lt;br /&gt;
		dQMultiply0 (qr, q1, q2);&lt;br /&gt;
		dQtoR (qr, Rtx);&lt;br /&gt;
&lt;br /&gt;
		dGeomSetRotation (TriMesh2,Rtx);&lt;br /&gt;
		dMassRotate (&amp;amp;m2,Rtx);&lt;br /&gt;
		// add to the total mass&lt;br /&gt;
		dMassAdd (&amp;amp;m,&amp;amp;m2);&lt;br /&gt;
&lt;br /&gt;
		//Capsule - axis of rotor - encapsulated geom&lt;br /&gt;
		Capsule = dCreateCapsule (0, 0.05, 0.1);&lt;br /&gt;
&lt;br /&gt;
		//Axis of Rotor - encapsulating geom&lt;br /&gt;
		axis_geom = dCreateGeomTransform (space);&lt;br /&gt;
		dGeomTransformSetCleanup (axis_geom,1);&lt;br /&gt;
		dMassSetCapsule (&amp;amp;m2, DENSITY_ROTOR, 1, 0.05, 0.1);&lt;br /&gt;
		dGeomTransformSetGeom (axis_geom,Capsule);&lt;br /&gt;
&lt;br /&gt;
		// set the transformation (adjust the mass too)&lt;br /&gt;
		dGeomSetPosition (Capsule,0.0, 0.0, 0.0);&lt;br /&gt;
		dMassTranslate (&amp;amp;m2,0.0, 0.0, 0.0 );&lt;br /&gt;
		dRFromAxisAndAngle (Rtx, 0.0, 0.0, 0.0, M_PI / 2);&lt;br /&gt;
		dGeomSetRotation (Capsule,Rtx);&lt;br /&gt;
		dMassRotate (&amp;amp;m2,Rtx);&lt;br /&gt;
		// add to the total masss&lt;br /&gt;
		dMassAdd (&amp;amp;m,&amp;amp;m2);&lt;br /&gt;
&lt;br /&gt;
		// move all encapsulated objects so that the center of mass is (0,0,0)&lt;br /&gt;
&lt;br /&gt;
		dGeomSetPosition (TriMesh1,&lt;br /&gt;
			 0.25-m.c[0], &lt;br /&gt;
			 -m.c[1],&lt;br /&gt;
			 -m.c[2]);&lt;br /&gt;
		dGeomSetPosition (TriMesh2,&lt;br /&gt;
			 -0.25-m.c[0],&lt;br /&gt;
			 -m.c[1],&lt;br /&gt;
			 -m.c[2]);&lt;br /&gt;
		dGeomSetPosition (Capsule,&lt;br /&gt;
			 -m.c[0],&lt;br /&gt;
			 -m.c[1],&lt;br /&gt;
			 -m.c[2]);&lt;br /&gt;
		dMassTranslate (&amp;amp;m,-m.c[0],-m.c[1],-m.c[2]);&lt;br /&gt;
&lt;br /&gt;
		if (blade1_geom) dGeomSetBody (blade1_geom,rotor);&lt;br /&gt;
		if (blade2_geom) dGeomSetBody (blade2_geom,rotor);&lt;br /&gt;
		if (axis_geom) dGeomSetBody (axis_geom,rotor);&lt;br /&gt;
&lt;br /&gt;
		dBodySetMass (rotor, &amp;amp;m);&lt;br /&gt;
		dRFromAxisAndAngle (Rtx, 1.0, 0.0, 0.0, M_PI / 2);&lt;br /&gt;
		dBodySetRotation(rotor, Rtx);&lt;br /&gt;
		dBodySetPosition(rotor, 0.0, 0.0, 1.0);&lt;br /&gt;
&lt;br /&gt;
		//joint with static environment - center of rotor&lt;br /&gt;
		lozisko = dJointCreateHinge (world, 0);&lt;br /&gt;
		dJointAttach (lozisko, 0, rotor);&lt;br /&gt;
		dJointSetHingeAnchor (lozisko, 0.0, 0.0, 1.0);&lt;br /&gt;
		dJointSetHingeAxis (lozisko, 0.0, 1.0, 0.0);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// run simulation&lt;br /&gt;
	dsSimulationLoop (argc,argv,652,488,&amp;amp;fn);&lt;br /&gt;
&lt;br /&gt;
	dJointGroupDestroy (contactgroup);&lt;br /&gt;
	dSpaceDestroy (space);&lt;br /&gt;
	dWorldDestroy (world);&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>