Hi, I tried... But I don't have the result I wish... see http://www.allcolor.org/terrain-character-pos.png
To arrive at this, I first hitbeam the character position with the terrain to find the elevation. Then I do three hitbeams near the character to form a plane and get the normal, then I compute the angle with the X and Z axis... but this is not correct.... someone could help me ? I used the following code to position the character (please not this is in java). iMeshWrapper meshTerrain = this.app.getEngine().FindMeshObject("Terrain"); CDebug.assertNotNull(meshTerrain); iMovable movable = this.hulk.GetMovable(); csReversibleTransform transform = movable.GetTransform(); csVector3 newPos = transform.GetOrigin().add( transform.GetFront().multiply(-elapsed_second * speed)); csHitBeamResult hbr = meshTerrain.HitBeam( new csVector3(newPos.getX(),-100,newPos.getZ()), new csVector3(newPos.getX(),100,newPos.getZ()) ); newPos = hbr.getIsect(); csHitBeamResult v1 = meshTerrain.HitBeam( new csVector3(newPos.getX()+0.1f,-100,newPos.getZ()), new csVector3(newPos.getX()+0.1f,100,newPos.getZ())); csHitBeamResult v2 = meshTerrain.HitBeam( new csVector3(newPos.getX()-0.1f,-100,newPos.getZ()), new csVector3(newPos.getX()-0.1f,100,newPos.getZ())); csHitBeamResult v3 = meshTerrain.HitBeam( new csVector3(newPos.getX()+0.1f,-100,newPos.getZ()+0.1f), new csVector3(newPos.getX()+0.1f,100,newPos.getZ()+0.1f)); csPlane3 plane = new csPlane3( v1.getIsect(), v2.getIsect(), v3.getIsect() ); csVector3 norm = plane.Normal(); norm.Normalize(); if (norm.getY() < 0.0f) { norm = norm.multiply(-1.0f); } movable.SetTransform(new csOrthoTransform( new csYRotMatrix3(this.hulkRotY).multiply( new csZRotMatrix3( (float) (Math.PI/2-Math.acos(norm.multiply(new csVector3(0,0,1)))) ).multiply( new csXRotMatrix3( (float) (Math.PI/2-Math.acos(norm.multiply(new csVector3(1,0,0)))) ) ) ) ,newPos)); movable.UpdateMove(); and I used the following code to position the camera: csReversibleTransform spriteTransform = this.hulk.GetMovable() .GetTransform(); csReversibleTransform cameraTransform = camera.GetTransform(); csVector3 cameraOrigin = spriteTransform.GetOrigin().add(new csVector3 (0,2,-8)); cameraTransform.SetOrigin(cameraOrigin); csVector3 lookAt = cameraOrigin.subtract(spriteTransform.GetOrigin()).multiply(-1.0f); cameraTransform.LookAt(lookAt,this.cameraOrientation); Quentin Anciaux On Thursday 15 February 2007 00:49:18 Andrew Robberts wrote: > csReversibleTransform has a LookAt function that will compute a look-at > transform. > > So, you can use this to compute a transform that will "look" towards the > normal of the terrain. You can do this by doing the following: > > csReversibleTransform rt; > rt.LookAt(terrainNormal, csVector3(0,1,0)); > csMatrix3 mat = rt.GetT2O(); > meshWrapper->GetMovable()->SetTransform(mat); > > This should orient your mesh so that some part of it is facing down the > terrain, but it probably won't be the correct part. I can't remember off > the top of my head which way the lookat will orient, but you can fix this > with a bit of trial and error. What you'll have to do is rotate your > character and then apply the lookat transform. > > For example, if your character's back faces the direction you want its > front to face then you can change line 3 to: > > csMatrix3 mat = rt.GetT2O() * csYRotMatrix3(3.14f); > > 3.14f is a half-turn rotation. > > If your character isn't even standing upright, then you'll probably have to > apply a rotation around the X axis: > > csMatrix3 mat = rt.GetT2O() * csXRotMatrix3(3.14f * 0.5f); // half of > 3.14fis a quarter turn > > If neither is sufficient then you might have to combine the two in some > way: > > csMatrix3 mat = rt.GetT2O() * csYRotMatrix3(3.14f) * csXRotMatrix3(3.14f * > 0.5f); > > or something similar. If you play around with it then you should get a > feel for transforming your character and manage to get him facing the right > way. > > -- > Andrew Robberts > > On 2/14/07, Quentin Anciaux <[EMAIL PROTECTED]> wrote: > > Hi, > > > > I've another question now that I know how to find the elevation. I would > > like > > the character displayed on the surface not only to be shown at the > > correct elevation but also to "rotate" according to the vector > > perpendicular (normal ?) from the terrain... How can I do ? > > > > Thank you very much, any help is appreciated. > > > > Quentin Anciaux > > > > ------------------------------------------------------------------------- > > Take Surveys. Earn Cash. Influence the Future of IT > > Join SourceForge.net's Techsay panel and you'll get the chance to share > > your > > opinions on IT & business topics through brief surveys-and earn cash > > http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV > > _______________________________________________ > > Crystal-main mailing list > > Crystal-main@lists.sourceforge.net > > https://lists.sourceforge.net/lists/listinfo/crystal-main > > Unsubscribe: mailto:[EMAIL PROTECTED] > > ?subject=unsubscribe ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Crystal-main mailing list Crystal-main@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/crystal-main Unsubscribe: mailto:[EMAIL PROTECTED]