Random generation of spatials

Hi!

Can you give a hint how to generate randomly cloned spatial?

1. generate randomly on a mesh (for example Box (10,10,10) geometry )
2. generate ramdomly on an area (for example I have 2 Vectors (0,0,0; 10,0,10))

For example, I have:

[java]Spatial geom;

int ammountOfClone = 1000;

[/java]

Thanks!

Math.Random() + minimum * (maximum-minimum) ?

and that vor every component of the vector?

That what you meant?

I’m not sure I’m following the question, but wouldn’t something like this work?

[java]

Vector3f center = new Vector3f(0, 0, 0);

Vector3f extent = new Vector3f(10, 10, 10);

for(int i=0; i<amountOfClone; i++){

Spatial clone = geom.clone(); // I’m not sure about object cloning in jME3… this may or may not work

float xValue = (float)(Math.random()*extent.x);

float zValue = (float)(Math.random()*extent.z);

clone.setLocalTranslation(new Vector3f(xValue, 0, zValue));

}

[/java]

EDIT: @EmpirePhoenix You beat me by 14 seconds!

Guys, THANKS A LOT!!! And how to clone on a mesh (on polygons)?

@EmpirePhoenix , what do you mean about “reuse”?

[java]for (…) {

Spatial clone = geom.clone();

//is the same like

// you said: new Geometry(“name”,mesh)

Geometry clone = new Geometry(“clone”+i, geom.clone());

}[/java]

also why clone geometry?

why not just new Geometry(“name”,mesh) and reuse the mesh ?

Also YAY 14 seconds win

Mesh box = new Box(whatever);

while(true){

newone = new Geometry(“clone_n” , box);

}

no need to call clone on unanimated Meshes, they can be shared.

Sorry, but as far as I understand in instancing: clone() method shares its geometry (and mesh too).

Am I wrong?

And deepClone() method shares its Material, but does not share with its Mesh.

As Momoko_fan said: “Note that clone() will share the meshes if they are not animated, and duplicate them if they are animated.”

There: http://hub.jmonkeyengine.org/groups/general-2/forum/topic/spatial-clone-question/

Using clone() is preferred if e.g. you set some parameters on the geometry itself like its material or scale. Otherwise clone() is the same as sharing the mesh (for non-animated models)

sorry for long delay… I want to thnk you about the random generation tip.

Also, about cloning I noticed that clone(false) is very cool option. It shares a mesh and a material.

Here is my code for those who will be interested in it:

GenerateFieldOfInstances.java

[java]

import com.jme3.app.SimpleApplication;

import com.jme3.material.Material;

import com.jme3.math.ColorRGBA;

import com.jme3.math.Vector3f;

import com.jme3.scene.Geometry;

import com.jme3.scene.Node;

import com.jme3.scene.shape.Box;

public class GenerateFieldOfInstances extends SimpleApplication {

public static void main(String[] args) {

GenerateFieldOfInstances app = new GenerateFieldOfInstances();

app.start();

}

Geometry geom;

Node instNodes = new Node();

@Override

public void simpleInitApp() {

Box b = new Box(Vector3f.ZERO, 1, 1, 1);

geom = new Geometry(“Box”, b);

geom.updateModelBound();

Material mat = new Material(assetManager, “Common/MatDefs/Misc/Unshaded.j3md”);

mat.setColor(“m_Color”, ColorRGBA.Red);

geom.setMaterial(mat);

geom.setLocalTranslation(0,2,1);

int numClones = 500;

for (int i=0; i<numClones; i++) {

Geometry gm = geom.clone(false);

gm.setName(“instance”+i);

gm.setLocalTranslation((float) Math.random() * 100.0f - 50f,(float) Math.random() * 10.0f,(float)Math.random() * 100.0f - 50f);

gm.rotate(0, (float) Math.random() * (float)Math.PI, 0);

instNodes.attachChild(gm);

}

rootNode.attachChild(instNodes);

mat.setColor(“m_Color”, ColorRGBA.Blue); //Check if material is shared by all objects

flyCam.setMoveSpeed(30);

viewPort.setBackgroundColor(ColorRGBA.Gray);

}

}[/java]

Another question is how to generate instances on a Mesh/Geometry? As far as I understand I should make Rays and Collision Detection with the Mesh/Geometry. But how to get the area of the Geometry to make Rays?

http://imageshack.us/photo/my-images/263/generateo.jpg/