Установка камеры/объектива, цели, ширины и высоты вида
Вопрос:
Я хочу установить камеру, цели и поле зрения в окне модели, чтобы точно сфокусироваться на определенных объектах в перспективе. Я пытался это сделать различными способами, но никогда не получалось в точности то, что хотелось.
Решение:
В прикрепленном чертеже (Загрузить Окружности) у нас три круга: красный (r = 10), зеленый (r = 20) и голубой (r = 30). Они все параллельны и их центры лежат на одной прямой.
Допустим, мы хотим поместить камеру в центре красного круга, а затем сфокусируемся на зелёном круге. Вы можете использовать AcGsView, связанный с текущим видом модели и настроить его. position устанавливает положение камеры и target устанавливает цель. Так как плоскость окружности параллельна плоскости дисплея, поэтому мы не должны преобразовать габариты круга из МСК (WCS) в ДСК (DCS). Ширина и высота поля и высота имеет габариты в плоскости, которая определяется целевой точкой и направлением взгляда. Так что если вы установите точку цели совпадающей с центром зеленого круга, то ширины поля и высоты могут быть установлены на основе диаметра круга.
Когда выполняется код примера сначала выбираем центр красного круга, а затем центр зеленого круга.
- static void TransformTest_SetModelView(void)
- {
- AcDbDatabase * pDb =
- acdbHostApplicationServices()->workingDatabase();
- if (!pDb->tilemode())
- {
- acutPrintf(
- L"\nЭта команда работает только в пространстве модели (т.е. tilemode отлична от 0)\n");
- return;
- }
- AcGePoint3d ptCamera;
- if (RTNORM != acedGetPoint(
- NULL, L"\nВыберите точку камеры: ", asDblArray(ptCamera)))
- return;
- AcGePoint3d ptTarget;
- if (RTNORM != acedGetPoint(
- NULL, L"\nВыберите точку цели: ", asDblArray(ptTarget)))
- return;
- resbuf cvport;
- acedGetVar(L"CVPORT", &cvport);
- AcGsView * view = acgsGetGsView(cvport.resval.rint, true);
- double aspectRatio = view->fieldWidth() / view->fieldHeight();
- double newWidth, newHeight;
- if (aspectRatio > 1)
- {
- // Высота зеленого круга, который мы хотим включить
- // в картинку равна 40
- newHeight = 40;
- newWidth = newHeight * aspectRatio;
- }
- else
- {
- newWidth = 40;
- newHeight = newWidth / aspectRatio;
- }
- view->setView(
- ptCamera,
- ptTarget,
- AcGeVector3d::kZAxis,
- newWidth,
- newHeight,
- AcGsView::kPerspective);
- view->update();
- acgsSetViewParameters(cvport.resval.rint, view, true, true);
- }
Этого же самого можно достичь используя AcDbViewTableRecord и функцию acedSetCurrentView:
- static void TransformTest_SetModelView2(void)
- {
- AcDbDatabase * pDb =
- acdbHostApplicationServices()->workingDatabase();
- if (!pDb->tilemode())
- {
- acutPrintf(
- L"\nЭта команда работает только в пространстве модели (т.е. tilemode отлична от 0)\n");
- return;
- }
- AcGePoint3d ptCamera;
- if (RTNORM != acedGetPoint(NULL,
- L"\nУкажите точку камеры: ", asDblArray(ptCamera)))
- return;
- AcGePoint3d ptTarget;
- if (RTNORM != acedGetPoint(NULL,
- L"\nУкажите точку цели: ", asDblArray(ptTarget)))
- return;
- Acad::ErrorStatus err = acedVports2VportTableRecords();
- {
- AcDbViewportTableRecordPointer
- ptrVp(acedActiveViewportId(), AcDb::kForRead);
- // Копируем данные из ViewportTableRecord
- AcDbViewTableRecord vtr;
- vtr.setBackClipDistance(ptrVp->backClipDistance());
- vtr.setBackClipEnabled(ptrVp->backClipEnabled());
- vtr.setElevation(ptrVp->elevation());
- vtr.setFrontClipAtEye(ptrVp->frontClipAtEye());
- vtr.setFrontClipDistance(ptrVp->frontClipDistance());
- vtr.setPerspectiveEnabled(ptrVp->perspectiveEnabled());
- vtr.setRenderMode(ptrVp->renderMode());
- vtr.setUcs(ptrVp->ucsName());
- vtr.setViewTwist(ptrVp->viewTwist());
- vtr.setCenterPoint(ptrVp->centerPoint());
- vtr.setLensLength(ptrVp->lensLength());
- // Главные установки
- double aspectRatio = vtr.width() / vtr.height();
- double newWidth, newHeight;
- if (aspectRatio > 1)
- {
- // Высота зеленого круга, который мы хотим включить
- // в картинку равна 40
- newHeight = 40;
- newWidth = newHeight * aspectRatio;
- }
- else
- {
- newWidth = 40;
- newHeight = newWidth / aspectRatio;
- }
- vtr.setWidth(newWidth);
- vtr.setHeight(newHeight);
- vtr.setTarget(ptTarget);
- vtr.setViewDirection(ptCamera - ptTarget);
- acedSetCurrentView(&vtr, NULL);
- }
- }
Обсуждение: http://adn-cis.org/forum/index.php?topic=89.0
Отредактировано 08.06.2013 в 02:41:21