Hi there,
currently I am trying walking around with my character in on a terrain. That works fine as I can
update the height at every step with terrain's getHeight(…)-method.
But I build a cool bridge-model that leads over a river. But now the question, is there a way to
get something like the local height of a certain x,z-position inside a spatial equal to the getHeight of
terrainpage? Or another possibility? If not my approach would be to see if there is a collision with the
bridge and increase the character's height until there is no collision anymore. But that is not elegant and
will for sure make problems as I use an animated character.
I would be very happy if someone could help me.
Thx, ToM
Ok…I found it out how to achieve it.
There was an example that helped me a lot (TestObjectWalking from the Intersection-Tests).
1)You need to put all elements you want to walk on in a special node.
2)You have a Ray pointing down from your location.
3)Every step you move check if a pick gets a collision.
4) get the triangle you walked on.
5) adjust y-value
(Hint:add the terrain at last to the end the method takes the first pick's y-pos! so this have to be modified
but I have no time for that now)
This is how it looked for me. It is more or less the same like in the TestObjectWalking:
class MyNode extends Node
{
.....
Ray ray = new Ray(new Vector3f(), new Vector3f(0,-1,0));
public void doStep()
{
ray.getOrigin().set(getLocalTranslation());
camResults.clear();
nodeWithAllElementsToWalkON.calculatePick(ray, camResults);
}
TrianglePickResults camResults = new TrianglePickResults() {
public void processPick() {
//initialize selection triangles, this can go across multiple target
//meshes.
int total = 0;
for(int i = 0; i < getNumber(); i++) {
total += getPickData(i).getTargetTris().size();
}
if (getNumber() > 0) {
PickData pData = getPickData(0);
ArrayList<Integer> tris = pData.getTargetTris();
TriMesh mesh = (TriMesh) pData.getTargetMesh();
if(tris.size() > 0) {
int triIndex = ((Integer) tris.get(0)).intValue();
Vector3f[] vec = new Vector3f[3];
mesh.getTriangle(triIndex, vec);
for(int x = 0; x < vec.length; x++) {
vec[x].multLocal(mesh.getWorldScale());
mesh.getWorldRotation().mult(vec[x], vec[x]);
vec[x].addLocal(mesh.getWorldTranslation());
}
Vector3f loc = new Vector3f();
pData.getRay().intersectWhere(vec[0], vec[1], vec[2], loc);
loc.y=loc.y+adjustHeight;
setLocalTranslation(loc);
System.out.println();
}
}
}
};
}