Hi,

Apparently csHitBeam result stores the polygon index (polygon_idx) of the
face that was hit. My goal is to get the normal vector of the face that has
been hit by my csHitBeam test.

   iPolygonMesh* wpolymesh = world_mesh->GetMesh ()->GetMeshObject ()->
      GetObjectModel ()->GetPolygonMeshBase ();
  csTriangle* wtris = wpolymesh->GetTriangles ();
  csVector3* wverts = wpolymesh->GetVertices ();

  printf("index: %i\n",res.polygon_idx);
  *if* ((res.polygon_idx > 0) && (res.polygon_idx <
wpolymesh->GetTriangleCount ()))
  {
    csTriangle tri =  wtris [res.polygon_idx];
    int vertc = wpolymesh->GetVertexCount ();

    *if* ((tri.a < vertc) && (tri.b < vertc) && (tri.c < vertc))
    {
      csVector3 a = wverts [tri.a],
                b = wverts [tri.b],
                c = wverts [tri.c];
      printf("(%f, %f, %f) (%f, %f, %f) (%f, %f,
%f)\n",a.x,a.y,a.z,b.x,b.y,b.z,c.x,c.y,c.z);
      csPoly3D poly;
      poly.AddVertex (a);
      poly.AddVertex (b);
      poly.AddVertex (c);
      csVector3 upthrust = poly.ComputeNormal () * force;
      ship_mech->AddForceDuration(upthrust, *false*,
          csVector3 (0,0,0), 0.1f);
      *//pcmechobj->AddForceOnce (csVector3 (0,force,0), false,
csVector3 (0,0,0));*
      *//pcmechobj->SetLinearVelocity (pcmechobj->GetLinearVelocity ()
+ csVector3 (0,force,0));*
    }
  }

Here I'm basically getting the triangles and using the index to get the
triangle, and get the verts for that face, construct a csPoly3D then use the
ComputeNormal function.

When I run it, I get some extreme negative value for res.polygon_idx!, so
looking in the docs I see that polygon_idx is only valid for HitBeamObject
(and not HitBeam for some strange reason).

  csReversibleTransform rt = world_mesh->GetMesh ()->GetMovable
()->GetFullTransform ();
  start = rt.Other2ThisRelative (start);
  end = rt.Other2ThisRelative (end);
  csHitBeamResult res = world_mesh->GetMesh ()->HitBeamObject (start, end);

As above I'm converting the start and end to the mesh which I'm testing on
into its local co-ordinates.

Re-running the first piece of code, and now I see that even though I have a
valid res.r (the hitbeam is working), that now res.polygon_idx is always -1
... What is going on here?

Is there an easy way I can get the normal vector of the face that the
hitbeam has intersected on the mesh?

Thanks.

Amir Taaki

Reply via email to