[vtkusers] vtkPlane::ProjectPoint ...(Is it orthographic based ?)
michał strzelecki
nexgen at poczta.onet.pl
Tue Jul 22 18:56:02 EDT 2003
To move any object in 3D Space
I do fallowing things:
{
// l1p1 , l1p2 two poits defining line (ray) in which the object is on start
// l3p1 , l3p2 two poits defining line (ray) in which the object is on end
// l2p1 , l2p2 two poits defining line (direction of movment)
float *l1p1, *l1p2, *l2p1, *l2p2, *l3p1, *l3p2, delta[3], v[3];
float position1[3], position2[3], position3[3], position4[3];
// we define vector of movement
vtkGeometric::Vector(capitalaxisActorMain->GetCenter(), capitalaxisActorMain->GetPosition(), v);
l1p1 = RenderPanelMain->lastpickedpoint; // point in 3D where we start picking
l1p2 = RenderPanelMain->pointbehindlastpickedpoint; // point behinde (i.e. i Z deph +1) that point but on the line (ray)
// we move vector in 3D space (creating a line)
l2p1 = capitalaxisActorMain->GetPosition();
vtkGeometric::MoveVector(v, l2p1);
l2p2 = v;
// calculating object's position on line (l2p1, l2p2);
vtkGeometric::CrossLinePoints(l1p1, l1p2, l2p1, l2p2, position1, position2);
l3p1 = RenderPanelMain->earlierpickedpoint; // point in 3D where we stop picking
l3p2 = RenderPanelMain->pointbehindearlierpickedpoint; // point behinde (i.e. i Z deph +1) that point but on the line (ray)
// calculating object's position on line (l2p1, l2p2);
vtkGeometric::CrossLinePoints(l3p1, l3p2, l2p1, l2p2, position3, position4);
// calculating shift;
delta[0] = position2[0] - position4[0];
delta[1] = position2[1] - position4[1];
delta[2] = position2[2] - position4[2];
// changing position
capitalplaneActorMain->AddPosition(delta);
capitalaxisActorMain->AddPosition(delta);
}
void vtkGeometric::MoveVector(float v[3], float point[3])
{
v[0] += point[0];
v[1] += point[1];
v[2] += point[2];
}
void vtkGeometric::Vector(float p1[3], float p2[3], float v[3])
{
v[0] = p1[0]-p2[0];
v[1] = p1[1]-p2[1];
v[2] = p1[2]-p2[2];
}
bool vtkGeometric::CrossLinePoints(float l1p1[3], float l1p2[3], float l2p1[3], float l2p2[3], float pointonl1[3], float pointonl2[3])
{
float v1[3], v2[3], v3[3], normal[3], t;
Vector(l1p1, l1p2, v1);
Vector(l2p1, l2p2, v2);
vtkMath::Cross(v1, v2, v3);
if ((v3[0] == 0.0) && (v3[1] == 0.0) && (v3[2] == 0.0))
return false; // the lines are parallel
vtkMath::Cross(v3, v2, normal);
vtkMath::Normalize(normal);
vtkPlane::IntersectWithLine(l1p1, l1p2, normal, l2p1, t, pointonl1);
vtkMath::Cross(v3, v1, normal);
vtkMath::Normalize(normal);
vtkPlane::IntersectWithLine(l2p1, l2p2, normal, l1p1, t, pointonl2);
return true;
}
I hope it would help.
michał
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20030723/3e5d2352/attachment.htm>
More information about the vtkusers
mailing list