Тема: AcGeView Coords

как преобразовать координаты мыши(x, y) в 3d view
координаты(x, y, z)?

Re: AcGeView Coords

Примерно так:

BOOL TransScreenCoordinatesToAcGePoint3d(CPoint point, AcGePoint3d &pt3d)
{
    CView *pView = acedGetAcadDwgView();
    if(!pView)return FALSE;
    int windnum = acedGetWinNum(point.x,point.y);
    CRect r;
    pView->GetClientRect(&r);    
    pView->ClientToScreen(&r);    
    acedDwgPoint ptOut;
    AcGePoint3d p3d;
    point.x -=r.left;
    point.y -=r.top;
    BOOL res = acedCoordFromPixelToWorld(windnum,point,ptOut);
    if (res)
        p3d = AcGePoint3d(ptOut[0],ptOut[1],ptOut[2]);
    return res;
}

Re: AcGeView Coords

как-то непереносимо...
может лучше так..??
AcGePoint3d toEye(long x, long y)
{
AcGePoint3d eyePt(x,y,0);
AcDbViewportTableRecord* vp = 0;
acdbOpenAcDbObject((AcDbObject*&)vp,acedActiveViewportId(),AcDb::kForRead);
AcGsView* view = vp->gsView();
eyePt.transformBy((view->screenMatrix() * view->projectionMatrix()).inverse());
return eyePt;
}

Re: AcGeView Coords

спасибо всем но эти методы не работают

Re: AcGeView Coords

> rolik
Сформулируй четко что тебе нужно. Покажи кусок кода, в которых эти методы не работают. Это конечно если ты хочешь получить помощь...

Re: AcGeView Coords

void cContourWnd::OnLButtonUp(UINT flags, CPoint pt)
{
AcGePoint3d  rayPos;
AcGeVector3d rayDir;
AcGeVector3d vr;
AcGePoint3d  cPt;
AcGePlane plane(AcGePoint3d(0, 0, 0), AcGeVector3d(0, 0, 1));
AcGePoint3d v(pt.x, pt.y, 0);
v.transformBy((m_pView->screenMatrix() * m_pView->projectionMatrix()).inverse());
/*
m_pView->setView(AcGePoint3d(0, 0, 100), AcGePoint3d(0, 0, 0), AcGeVector3d(0, 0, 1));
так камера уже установлена
ну вот при клике от центра слева v.x < 0, справа v.x > 0
так должно быть но нет а мне еше надо шчитать пересечение
plane(0, 0, 1).intersect(ray(view.position), v)
*/
}

Re: AcGeView Coords

> rolik
А так?

void cContourWnd::OnLButtonUp(UINT flags, CPoint pt)
{
  AcGePoint3d rayPos;
  AcGeVector3d rayDir;
  AcGeVector3d vr;
  AcGePoint3d cPt;
  AcGePlane plane(AcGePoint3d(0, 0, 0), AcGeVector3d(0, 0, 1));
  AcGePoint3d v(pt.x, pt.y, 0);
 v.transformBy((m_pView->screenMatrix() * m_pView->worldToDeviceMatrix().inverse());
}

Возможно (не проверял) еще нужно преобразовать координаты  pt из оконных в экранные (при помощи ClientToScreen).

Re: AcGeView Coords

ClientToScreen - пробовал не помогает

Re: AcGeView Coords

Закономерность какую-нибудь уловил?

Re: AcGeView Coords

да x как бы совпадает но не совсем
а y никак при замене знака все летет к чертям