ambiera logo

Ambiera Forum

Discussions, Help and Support.

folder icon Ambiera Forum > CopperCube > CopperCube Open discussion
forum topic indicator Manipulating meshes
person icon
freddy
Registered User
Quote
2014-09-06 19:32:19

Hi everyone,

Just trying out the demo of CC. I come from working on a C-sharp project where I built and animated a head. I animated using my own morph target animation.

My question is this : can I take a mesh and iterate over it changing it's shape per vertex ?

Is there possibly some one who could show me in code an example of doing this ?

I see when I import an OBJ model that the groups seemed to get merged into one mesh - is that correct ? Can the grouping be retained so I have a model made of it's groups, ie individual meshes of the groups ?

If not I figured I could import the groups individually and animate them separately... but 'join' them somehow.

The reason is that for efficiency I would only want to animate parts of the whole model.

Any thoughts ?

Many thanks !

person icon
erik
Registered User
Quote
2014-09-06 20:35:28

Yes, you can do this using the Mesh Editing functions (see here: http://www.ambiera.com/coppercub...), like with this example for scaling all vertices by a factor 2:

var meshnode = editorGetSelectedSceneNode();
var bufferCount = ccbGetSceneNodeMeshBufferCount(meshnode);
if (bufferCount == 0)
alert('The selected node has no 3D geometry.');
else
{
for (var i=0; i<bufferCount; ++i)
{
var vertexcount = ccbGetMeshBufferVertexCount(meshnode, i);
for (var v=0; v<vertexcount; ++v)
{
var pos = ccbGetMeshBufferVertexPosition(meshnode, i, v);

pos.x *= 2;
pos.y *= 2;
pos.z *= 2;

ccbSetMeshBufferVertexPosition(meshnode, i, v, pos);
}
}
ccbUpdateSceneNodeBoundingBox(meshnode);
}


But this only works in the editor and in the Windows .exe and Mac OS .exe targets. (For the last two, you need to adapt the example of course a bit, because the functions starting with editor won't exist there)

About the groups when importing: Yes, that's how it works in coppercube. If you want multiple meshes, you need to import them from separate files.

person icon
freddy
Registered User
Quote
2014-09-06 20:53:47

Thanks for the quick reply.

I was hoping to run this on the web using an HTML document. But from what you say that's not possible.

That's a shame :(

person icon
freddy
Registered User
Quote
2014-09-06 21:01:21

Are there any plans to extend this to be included in the WebGL part ?

person icon
erik
Registered User
Quote
2014-09-06 21:02:09

If you want to run this one the web with WebGL, this is also possible. You just need to use another API for it, there is something more powerful available for WebGL, named copperlicht, see here: http://www.ambiera.com/copperlic...

person icon
freddy
Registered User
Quote
2014-09-06 21:07:05

Ohh nice :) Thanks, I will take a look at the new goodies emoji icon_grin

person icon
freddy
Registered User
Quote
2014-09-06 21:22:21

Just one quick question...

I was using morph targets in my C-sharp program. In other words I had differing models loaded into memory and used them as my reference points for the morphing.

My question is, would I be able to load a mesh but not necessarily display it ? Can a mesh be in memory and not displayed without any overheads ?

IF not, maybe I can write something to load the target morphs into some data structure.

Thanks :)

person icon
niko
Moderator
Quote
2014-09-07 07:09:10

Yes, that's no problem. In copperLicht, you can access your data through CL3D.Mesh and CL3D.MeshBuffer. Simply don't display it (make it invisible for example, or remove it from the scene) and no overhead will be done.

person icon
freddy
Registered User
Quote
2014-09-07 22:49:20

Hi Niko,

Thanks for the information. I'll have a play with things this week hopefully.

Thanks a lot for the replies you guys :)

person icon
freddy
Registered User
Quote
2014-09-10 15:13:57

I can't quite work this out. I'm trying to load a mesh into an array, so that I can traverse the array and work out how the main model should be morphed....

'v3' is a model that is in memory but not visible - this is my morph target.

This is my JS, the trouble is there does not seem to be anything in 'foo'.

Could someone advise please ?



	var engine = startCopperLichtFromFile('3darea', 'copperlichtdata/anima.ccbjs', 'Loading $PROGRESS$...', 'Error: This browser does not support WebGL.');

var morphSceneNode = null;
var foo;

// this is called when loading the 3d scene has finished
engine.ingComplete = function()
{
var scene = engine.getScene();
if (scene)
{
// also, force the 3d engine to update the scene every frame
scene.setRedrawMode(CL3D.Scene.REDRAW_EVERY_FRAME);

foo = CL3D.Mesh('v3');

}
}


person icon
freddy
Registered User
Quote
2014-09-10 15:55:59

Above, Niko gave this example for CopperCube....


var meshnode = editorGetSelectedSceneNode();
var bufferCount = ccbGetSceneNodeMeshBufferCount(meshnode);
if (bufferCount == 0)
alert('The selected node has no 3D geometry.');
else
{
for (var i=0; i<bufferCount; ++i)
{
var vertexcount = ccbGetMeshBufferVertexCount(meshnode, i);
for (var v=0; v<vertexcount; ++v)
{
var pos = ccbGetMeshBufferVertexPosition(meshnode, i, v);

pos.x *= 2;
pos.y *= 2;
pos.z *= 2;

ccbSetMeshBufferVertexPosition(meshnode, i, v, pos);
}
}
ccbUpdateSceneNodeBoundingBox(meshnode);
}


This is the kind of thing that I need to do. Is there possibly an example for CopperLicht ? I can't seem to find anything..

Cheers :)

person icon
niko
Moderator
Quote
2014-09-10 16:46:59

Hi,
you can use the CopperLicht API as well like this:


var node = engine.getScene().getSceneNodeFromName('NameOfYourNode');

if (node)
{
if (node.getType() == 'mesh')
{
var mesh = node.getMesh();
for (var i=0; i<mesh.GetMeshBuffers().length; ++i)
{
var meshBuffer = mesh.GetMeshBuffers()[i];
for (var v=0; v<meshBuffer.Vertices.length; ++v)
{
meshBuffer.Vertices[v].Pos.X += 1.0;
}

meshBuffer.update(false, false);
}
}
}


I just wrote this without testing it, but it should work.

person icon
freddy
Registered User
Quote
2014-09-10 17:04:33

Hey Nico, thanks a lot for you help.

I tried this but Firefox is returning the error :

TypeError: mesh.Vertices is undefined

I'll see if I can find out why, unless you beat me to it ;)

person icon
niko
Moderator
Quote
2014-09-10 17:10:01

Oh, it should have been 'meshBuffer', mistyped. I updated the code :)

person icon
freddy
Registered User
Quote
2014-09-10 17:12:17

Yeah that works emoji icon_grin

Thank you !


Create reply:










 

  

Possible Codes


Feature Code
Link [url] www.example.com [/url]
Bold [b]bold text[/b]
Image [img]http://www.example.com/image.jpg[/img]
Quote [quote]quoted text[/quote]
Code [code]source code[/code]

Emoticons


icon_holyicon_cryicon_devilicon_lookicon_grinicon_kissicon_monkeyicon_hmpf
icon_sadicon_happyicon_smileicon_uhicon_blink   






Copyright© Ambiera e.U. all rights reserved.
Contact | Imprint | Products | Privacy Policy | Terms and Conditions |