Programming
Fundamentals
Setting Up Development Environment
UnigineScript
High-Level Systems
C++
C#
UUSL (Unified UNIGINE Shader Language)
File Formats
Rebuilding the Engine and Tools
GUI
Double Precision Coordinates
API
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
Rendering-Related Classes

Creating and Attaching a Cloth

This example shows how to create a cloth pinned to 2 dummy bodies resting on a sphere using a particles joint. A tutorial teaching how to reproduce the same scene in UnigineEditor can be found here.

Source code (UnigineScript)
#include <core/scripts/primitives.h>
			
ObjectMeshDynamic MyCloth;
ObjectMeshDynamic MySphere;
ObjectDummy dummy1;
ObjectDummy dummy2;

/// function, creating a named sphere with a specified radius and color at pos	
Object createSphere(string name, float radius, Vec4 color, Vec3 pos)
{
	// creating a dynamic mesh object with a sphere surface and passing it to Editor
	ObjectMeshDynamic sphere = Unigine::createSphere(radius);
	engine.editor.addNode(node_remove(sphere));

	// setting object's parameters and transformation
	sphere.setWorldTransform(translate(pos));
	sphere.setMaterial("mesh_base", "*");
	sphere.setMaterialParameter("albedo_color", color, 0);
	sphere.setProperty("surface_base", "*");
	sphere.setName(name);		

	return sphere;	
}

/// function, creating a named cloth body with specified parameters
Object createBodyCloth(string name, float width, float height, float step, float mass, float friction, float restitution, float rigidity, float lrestitution, float arestitution, int num_iterations, Vec4 color, Vec3 pos) 
{
	// creating a dynamic mesh object with a sphere surface and passing it to Editor
	ObjectMeshDynamic cloth = Unigine::createPlane(width,height,step);
	engine.editor.addNode(node_remove(cloth));
	
	//assigning a cloth body to the dynamic mesh object and setting cloth parameters
	BodyCloth body = class_remove(new BodyCloth(cloth));
	body.setMass(mass);
	body.setFriction(friction);
	body.setRestitution(restitution);
	body.setLinearRestitution(lrestitution);
	body.setAngularRestitution(arestitution);	
	body.setRigidity(rigidity);
	body.setNumIterations(num_iterations);

	// setting object's parameters and transformation
	cloth.setMaterial("mesh_base", "*");
	cloth.setMaterialParameter("albedo_color", color, 0);	
	cloth.setProperty("surface_base", "*");
	cloth.setWorldTransform(pos);
	cloth.setName(name);		
	
	return cloth;
}

/// function, creating a named dummy body  of a specified size at pos
Object createBodyDummy(string name, Vec3 size, Vec3 pos)
{
	// creating a dummy object and passing it to Editor
	ObjectDummy dummy = new ObjectDummy();
	engine.editor.addNode(node_remove(dummy));
	
	// setting object's parameters
	dummy.setWorldTransform(translate(pos));
	dummy.setName(name);		

	//assigning a dummy body to the dummy object and adding a box shape	to it
	BodyDummy body = class_remove(new BodyDummy(dummy));
	ShapeBox shape = class_remove(new ShapeBox(size));
	body.addShape(shape, translate(0.0f, 0.0f, 0.0f));

	return dummy;
}

int init() {

	// setting up player
	Player player = new PlayerSpectator();
	player.setPosition(Vec3(30.0f,0.0f, 30.5f));
	player.setDirection(Vec3(-1.0f, 0.0f, -0.4f));
	engine.game.setPlayer(player);
	
	// creating a cloth
	MyCloth = createBodyCloth("MyCloth", 20.0f, 20.0f, 1.0f, 10.0f, 0.05f, 0.05f, 0.05f, 0.2f, 0.05f, 8, Vec4(1.0f, 0.1f, 0.1f, 1.0f), translate(Vec3(0.0f, 0.0f, 25.0f)));

	// creating a sphere
	MySphere = createSphere("MySphere", 3.0f, Vec4(1.0f, 0.1f, 0.1f, 1.0f), Vec3(-1.0f, 0.0f, 16.0f));
	
	// creating 2 dummy bodies to attach the cloth to
	dummy1 = createBodyDummy("fixpoint1", Vec3(1.0f, 1.0f, 1.0f), Vec3(-10.0f, -10.0f, 25.0f));
	dummy2 = createBodyDummy("fixpoint2", Vec3(1.0f, 1.0f, 1.0f), Vec3(-10.0f, 10.0f, 25.0f));
	
	// creating 2 particles joints to attach the cloth to dummy bodies
	class_remove(new JointParticles(dummy1.getBody(),MyCloth.getBody(),dummy1.getPosition(),Vec3(1.0f)));
	class_remove(new JointParticles(dummy2.getBody(),MyCloth.getBody(),dummy2.getPosition(),Vec3(1.0f)));
	
	return 1;
}
Last update: 2017-07-03