Тема: Поворот матрицы не вокруг нужной точки

Не могу понять в чем дело, полученный solid из полилинии , строится не на прямой. Точки asp и aep задаются пользователем в чертеже (основная функция), затем вызывается ф-ция s_mysolid. Строю 3D полилинию в плоскости XY , выдавливаю ее, и начинаю вращать с помощью матрицы, полученный Solid. Solid поворачивается (как нужно) параллельно прямой образующейся при указании пользователем двух точек, проблема в том, но на расстоянии от нее (почему не понимаю). При чем, если указать первой точку 0,0,0, вторую не важно где, solid строится прямо на прямой как и нужно. Вопрос почему при указании точек, матрица поворота solid'а не поворачивается вокруг данной точки?

AcDbEntity *s_mysolid(AcGePoint3d asp, AcGePoint3d aep, double s_s, double s_h, double s_t)
{
    AcGePoint3d Pt,ao(0, 0, 0);
    AcGeVector3d v = aep-asp, amv = asp-ao; /*вектор между 0 и нач точкой трубы*/
    v.normalize();
    v = v.normal();
    AcGePlane apl1(asp,v); /*план, ортогональный оси */
    double len = asp.AcGePoint3d::distanceTo(aep); // длина
    double len1=apl1.distanceTo(asp);
    AcDbObjectId lineId;
    AcDb3dPolyline *pLine;
    AcDbBlockTable *pBlockTable;
    acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead);
    AcDbBlockTableRecord *pBlockTableRecord;
    pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite);
    pBlockTable->close();
    AcGePoint3dArray vertices;
Pt.x=asp.x;
Pt.y=asp.y;
Pt.z=asp.z;
vertices.append(Pt);
Pt.x =asp.x+s_b+s_s/2;
Pt.y =asp.y+s_t;
Pt.z=asp.z;
vertices.append(Pt);
Pt.x =asp.x+2*s_b;
Pt.y =asp.y+s_t;
Pt.z=asp.z;
vertices.append(Pt);
Pt.x =asp.x+2*s_b;
Pt.y =asp.y;
Pt.z=asp.z;
vertices.append(Pt);
Pt.x =asp.x;
Pt.y =asp.y;
Pt.z=asp.z;
vertices.append(Pt);
  AcDbVoidPtrArray regions;
  AcDbVoidPtrArray voidPtrArr;
  pLine = new AcDb3dPolyline(AcDb::k3dSimplePoly, vertices);
  pLine->setDatabaseDefaults();
  pBlockTableRecord->appendAcDbEntity(lineId, pLine);
  pBlockTableRecord->close();
  pLine->close();
int a_n1;
AcDbVoidPtrArray acircs1;
a_n1 = acircs1.append(pLine);
AcDbRegion *pRegion;
AcDbRegion::createFromCurves(acircs1, regions);
assert(regions.length() == 1);
pRegion = AcDbRegion::cast((AcRxObject*)regions[a_n1]);
    AcDb3dSolid  *pSolid = NULL;
    pSolid = new AcDb3dSolid;
pSolid->extrude(pRegion,len,0);
  //  pSolid->createFrustum(len, 40, 20, 80); если строить цилиндр, то он строится по прямой.
    AcGeMatrix3d mat(AcGeMatrix3d::translation(len1*v) /*Вектор перемещения*/ *AcGeMatrix3d::planeToWorld(v));
    pSolid->transformBy(mat);
    AcGeVector3d x(1, 0, 0), y(0, 1, 0), z(0, 0, 1);
    AcGePoint3d  moveBy(v[0]  ,
                        v[1]  ,
                        v[2]),
                 amp (amv[0], amv[1], amv[2]);
    mat.setCoordSystem(moveBy, x, y, z);
    pSolid->transformBy(mat);
    mat.setCoordSystem(amp, x, y, z);
    pSolid->transformBy(mat);
    return pSolid;
}

Re: Поворот матрицы не вокруг нужной точки

Почему бы не использовать метод AcGeMatrix3d::setRotation (точный синтаксис не помню, нет хелпа под рукой)?

Re: Поворот матрицы не вокруг нужной точки

AcGeMatrix3d::setToRotation
Была такая мысль, но как вычислить угол поворота матрицы? Я незнаю.

Re: Поворот матрицы не вокруг нужной точки

sergey_f пишет:

начинаю вращать с помощью матрицы, полученный Solid. Solid поворачивается (как нужно) параллельно прямой образующейся при указании пользователем двух точек

Не понятно как вообще должен солид поворачиваться. Схемку дай или на словах растолкуй.

Re: Поворот матрицы не вокруг нужной точки

Пользователь указывает две точки asp (первая точка) aep (вторая точка), которые образуют линию и вдоль которой нужно разместить 3dSolid. 3D полилиния строится из точки asp.

Pt.x=asp.x; //Точка начало построения
Pt.y=asp.y;
Pt.z=asp.z;
vertices.append(Pt);
Pt.x =asp.x+s_b+s_s/2; //Задаю другие точки полилинии.
Pt.y =asp.y+s_t;
Pt.z=asp.z;
vertices.append(Pt);
Pt.x =asp.x+2*s_b;
Pt.y =asp.y+s_t;
Pt.z=asp.z;
vertices.append(Pt);
Pt.x =asp.x+2*s_b;
Pt.y =asp.y;
Pt.z=asp.z;
vertices.append(Pt);
Pt.x=asp.x; //конец построения полилинии
Pt.y=asp.y;
Pt.z=asp.z;
vertices.append(Pt);

Образую Region. Выдавливаю по оси Z. Получаю 3DSolid. Начинаю вращать его. Так вот тут-то и проблема Solid вращается не вокруг точки asp (начальной), а какой-то мне не понятной. После вращения 3D solid становится параллельно линии образуемой точками asp и aep, но не на линии (как хотелось бы), а на расстоянии от линии.

Re: Поворот матрицы не вокруг нужной точки

> sergey_f
Из сказанного понял, что требуемый солид это тело вращения с осью, указанной пользователем. Если это так, то какие проблемы? Ось есть, угол (2*pi) известен.