Drawable не должны быть графическим. Например, drawable мог бы только устанавливать черты подпримитива в специфическую комбинацию и не осуществлять worldDraw () или viewportDraw () вообще.

Эта архитектура позволяет разработчику распределять исполнение, закодируют более эффективно.

Например, worldDraw () выполнение AcDbBlockReference просто помещает трансформанту вставки на стек, вызывает draw() пропускающий в указателе на его AcDbBlockTableRecord, и выталкивает матричный стек. WorldDraw () AcDbBlockTableRecord выполняет итерации по примитивам на определении. Выгода этой методики - то, что графика для данного примитива должна только быть сгенерированной однажды, и может кэшироваться на объекте и эффективно многократно использоваться для последующих ссылок.

ПРЕДУПРЕЖДЕНИЕ! Любой drawables прошел в, рисуют () должен иметь срок службы{*продолжительность жизни*}, равняются или превышение таковой внешнего объекта. Это требовано, потому что графика drawable могла бы кэшироваться в AcGsNode, приложенном к drawable. В течение дисплея графическая система могла бы возвращаться, чтобы получить этот кэш, и если объект был разрушен, ошибка во время выполнения программы произойдет.

Двумерные соты (Tessellation)

Кривые и кривые поверхности должны быть мозаичным —, разбитым в линии и многоугольники —, чтобы быть отображенными. Градус{*степень*} двумерных сот определяет насколько точный отображенная кривая будет (как близко это приблизит математическую “истинную” кривую) и сколько работы наверху требовано, чтобы генерировать графику для кривой. Очень маленький круг может требовать только, чтобы единственный пиксел отобразил это. Большой круг может требовать сотен маленьких долей линии, которые будут рассчитаны и отображен, чтобы создать гладкое появление.

НЕ нашли? Не то? Что вы ищете?

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

Обратитесь к этому значению, позволяет заказным примитивам настраивать их двумерные соты к энергии команды VIEWRES процент на опцию, которая установлена пользователем. Результат - то, что заказные примитивы являются мозаичными к относительно та же самая гладкость как встроенные примитивы.

deviation () функция возвращает предложенное максимальное отклонение в мировом пространстве, учитывая тип отклонения, чтобы вычислить и точку в мировом пространстве для перспективного масштабирования если требовано. Сигнатура для deviation() функция

virtual double

AcGiWorldDraw::deviation(

AcGiDeviationType devType,

const AcGePoint3d&) const = 0;

Типы отклонения

§  kAcGiMaxDevForCircle (для кругов и дуг)

§  kAcGiMaxDevForCurve

§  kAcGiMaxDevForBoundary

§  kAcGiMaxDevForIsoline

§  kAcGiMaxDevForFacet (для поверхностей; формула для вычисления этого отклонения использует значение FACETRES переменной системы)

Isolines

Isoline используется, чтобы дать визуальный ключ форме объекта. AcGiWorldDraw:: isolines () функция позволяет примитиву отображать тот же самый номер isolines в поверхность как определено пользователем. Это значение - целое число между 0 и 2047. Заданный по умолчанию номер isolines - 4. AcGiViewportDraw класс обеспечивает аналогичную функцию:

virtual Adesk::UInt32

AcGiWorldDraw::numberOfIsolines() const;

Преобразования

Графический конвейер может применять три возможных преобразования к примитиву:

§  блочные преобразования примитива

§  преобразование взгляда области просмотра

§  перспективное преобразование (если перспектива позволяется от DVIEW)

Каждое преобразование производит новый тип координат, как показано в следующем рисунке. Если не в перспективном режиме, глаз и координаты дисплея идентичен.

(фронтальное и заднее отсечение выполнено здесь если определено)

Для REGEN, HIDE, и SHADE команд, мировые координаты примитива посланы через графический конвейер, показанный в числе{*рисунке*} выше. Преобразование представления{*вида*} определяет специфическое представление{*вид*} мировых координат, аналогичных рассмотрению сцены с камерой. Камера имеет местоположение в мировом пространстве{*пробеле*} и специфической ориентации к мировой координате “сцена”.

Когда преобразование представления{*вида*} полно, мировые координаты преобразованы к координатам глаза, смотрящим вниз Z оси камеры.

Если перспектива позволяется, координаты глаза преобразованы, чтобы отобразить координаты.

Это преобразование возводит в степень раздел{*деление*} согласно тому, как далеко кое-что является от камеры, так, чтобы объекты дальше далеко от камеры казались меньшими чем объекты ближе на камеру.

Следующие разделы обсуждают эти системы координат в большей подробности.

Система координат модели

Модельные координаты - те координаты, которые еще не были преобразованы любыми блочными вставками или видами. Одна часть модельной координатной геометрии может содержаться в неограниченные числе блочных вставок. Большинство AcGi методов геометрии использует модельные координаты. Однако, имеются несколько методов геометрии, которые принимают другие системы координат.

При преобразовании модельной координатной геометрии примитива к мировым координатам, текущая сетевая блочная трансформанта используется. Например, если часть модельной координатной геометрии находится в больше чем одной блочной вставке, то результирующее влияние нахождения во вставках - сетевая блочная трансформанта.

Мировая система координат

Мировая система координат (WCS) - система координат “ссылки”.

WCS - установленная система координат; все другие системы координат определены относительно WCS. Это - система координат, в которую вся образцовая координатная геометрия была помещена согласно ее блочной вставке. Если любая из образцовой координатной геометрии не была включена в блочную вставку, то модель и мировые координаты идентичны.

Система координат Глаза

Каждая область просмотра имеет точку преимущества, наклон, цель, и поле вида относительно WCS.

Это суммировано в одной трансформанте, трансформанте взгляда области просмотра. Эта трансформанта преобразовывает геометрию мировой координаты в геометрию координаты вида, где взгляд области просмотра - вниз его Z-оси, смотрящей к большему количеству отрицательных значений Z. Координаты Глаза не содержат перспективную трансформанту.

Система координат Дисплея

Система координат Дисплея (DCS) - система координат, в которую объекты преобразованы прежде, чем они отображены. Если не в перспективном режиме, DCS эквивалентна системе координат глаза. Если перспективный режим активен, перспективная трансформанта должна быть выполнена на координатах глаза, чтобы получить координаты дисплея. Перспективная трансформанта дает эффект геометрии, получающей меньший, дальше далеко это - от камеры.

Примеры Преобразования

AcGiViewport класс обеспечивает функции, которые дают Вам, обращаются к графическому конвейеру, позволяя Вам применить каждое преобразование явно и исполняют математику самостоятельно. Если Вы управляете примитивами в графическом конвейере самостоятельно, Вы используете различные формы AcGi многоугольника и полилинии в зависимости от того, где Вы находитесь в графическом конвейере.

AcGiViewportGeometry класс обеспечивает три формы для многоугольников и полилиний, в модели, глазе, и координатах дисплея. Обычно, Вы использовали бы polyline() и polygon () функции, которые требуют модельных координат.

Используйте polylineEye () и polygonEye () если Вы собираетесь работать с координатами глаза, как показано в Примерах 1 и 2. Используйте polygonDc () и polylineDc () если Вы работаете с координатами дисплея.

Следующие разделы содержат четыре примера. Первый пример рисует тот же самый примитив, используя модель, глаз, и координаты дисплея. Его основная цель состоит в том, чтобы демонстрировать, как применить каждое преобразование в графическом конвейере. Второй пример иллюстрирует работу к координатам глаза, чтобы определить переднюю сторону и невидимые поверхности пирамиды. Третий пример иллюстрирует работу к координатам дисплея, чтобы рисовать примитив в размере относительно размера текущего окна. Четвертый пример показывает, как определить полилинию с наименьшим количеством долей, который является визуально неразличимым от один с больше доли.

Пример 1: Системы координат

Этот пример берет долю линии, определенную в модели, координирует и создает ее эквиваленты в координатах дисплея и глазе. Когда отображено, все линии наложатся.

void

AsdkCoordSamp::viewportDraw(AcGiViewportDraw* pV)

{

pV->subEntityTraits().setFillType(kAcGiFillAlways);

const int count = 3;

AcGePoint3d verts[count];

verts[0] = AcGePoint3d(0.0, 0.0, 0.0);

verts[1] = AcGePoint3d(1.0, 0.0, 0.0);

verts[2] = AcGePoint3d(1.0, 1.0, 0.0);

// Draw model space line segment.

//

pV->subEntityTraits().setColor(kBlue);

pV->geometry().polygon(count, verts);

// Compute the line’s representation in eye space.

//

AcGeMatrix3d mat;

pV->viewport().getModelToEyeTransform(mat);

for (int i = 0; i < count; i++) {

verts[i].x += 0.01;

verts[i].y += 0.01;

verts[i].z += 0.01;

verts[i].transformBy(mat);

}

// Display the eye coordinate equivalent of the

// model space polygon.

//

pV->subEntityTraits().setColor(kGreen);

pV->geometry().polygonEye(count, verts);

// Convert from eye to display coordinates.

//

for (i = 0; i < count; i++) {

verts[i].x += 0.01;

verts[i].y += 0.01;

verts[i].z += 0.01;

}

// Draw the display space equivalent of the

// model space polygon.

//

pV->subEntityTraits().setColor(kRed);

pV->geometry().polygonDc(count, verts);

}

Пример 2: Определение Невидимых линий для Объекта для Стандартного Дисплея

Этот пример отображает пирамиду, показывая передние грани в желтом и обратные грани в синем, чтобы дать Вам идею относительно видимых и скрытых граней пирамиды. Пример показывает применение{*обращение*} преобразования " модель к глазу " и затем перспективное преобразование. Это использует координаты глаза, чтобы рисовать примитив и использование показов isPerspective (), doPerspective (), getFrontandBackClipValues (), polylineDc (), polylineEye () и polyline().

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132