lect_10 (Лекционный курс в ворде), страница 2
Описание файла
Файл "lect_10" внутри архива находится в папке "Лекционный курс в ворде". Документ из архива "Лекционный курс в ворде", который расположен в категории "". Всё это находится в предмете "инженерная графика" из 4 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Онлайн просмотр документа "lect_10"
Текст 2 страницы из документа "lect_10"
Можно отметить несколько моментов:
-
GlVertex3fv():
-
Умножает вершину на M
-
Возвращает точки преобразования
-
GlBegin(): определяет режим рисования
-
GL_POINTS
-
GL_LINE_LOOP
-
GL_POLYGON
-
Матрица М спрятана (текущая матрица преобразования)
М может быть определена следующим образом:
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
glTranslatef( 2.0, 1.0, 0.0);
glRotatef( -3.14/2.0, 0.0, 0.0, 1.0);
glScalef( 2.0, 2.0, 2.0)
…
M = trans(2,1,0) rot(z,-90) scale(2,2,2)…
Другой способ загрузки М
glMatrixMode (GL_MODELVIEW);
glLoadMatrixf (M) ;
-
Иерархия преобразований.
Рассмотрим модель руки с одним пальцем:
Она может быть сконструирована, используя иерархию преобразований. В рассмотренном ниже графе круги представляют собой трансформации, а прямоугольники - геометрию. Псевдокод ипользуется для рисования сцены.
f1 : trans (d_hand,0,0)
rot(z,th1)
f2: trans(d1,0,0) rot(z,th2)
f3: trans(d2,0,0) rot (z,th3)
M=M*Thand
draw hand
M=M*Tf1
draw f1
M=M*Tf2
draw f2
M=M*Tf3
draw f3
Теперь представим, что мы хотим нарисовать руку с тремя одинаковыми пальцами. Мы можем создать более комплексный граф, который использовался в рассмотренном примере. Так как все пальцы описаны в системе координат, связаннной с рукой, необходимо сохранять эту систему , перед тем как рисовать каждый палец. Это сделано с помощью вызовов функций PUSHMATRIX() и POPMATRIX().
Draw Hand
PushMatrix()
M=M*Tfla
draw_finger()
popMatrix()
pushMatrix()
M=M*Tflb
draw_finger()
popMatrix()
pushMatrix()
M=M*Tflc
draw_finger()
popMatrix()
draw_finger() {
draw f1
M=M*Tf2
draw f2
M=M*Tf3
draw f3
}
Большинство графических систем поддерживают стек для матрицы преобразования.
-
Уравнения плоскости.
Полное уравнение плоскости
A
x + By + Cz + D = F(x,y,z)
F(x,y,,z)=0 , если точка принадлежит плоскости.
Можно переписать:
F(P)=N.P+D
Параметрическое уравнение плоскости
Plane(s,t) = P0 + s(P1-P0) + t(P2-P0), обеспечивает неколлинеарность P0,P1,P2.
Plane(s,t) = P0 + s V1 + tV2, где V1,V2 базисные векторы.
Привиденное уравнение плоскости
z=-(A/C)x -(B/C)y -(D/C), если C не является нулем.
Пересечение плоскости и прямой
L(t) = Pa+t(Pb-Pa)
Подставляя в уравнение плоскости и решая относительно t, получим:
-
Отсечение.
И алгоритм Кохена-Сазерленда, и алгоритм Сазерленда-Ходжмана могут быть расширены в трехмерном пространстве. Мы можем выбрать, где мы будем делать отсечение, например в VCS,CCS или NDCS. Хотя мы объясним это кратко, но существует недостаток отсечения в NDCS.
Отсечение в VCS
Оба алгоритма использовались в тестах для полупространств. Для видимых областей рассмотренных ниже, уравнения видимости плоскостей могут быть записаны в таком виде , чтобы все нормали указывали в область видимости. Если F(P)>0, тогда P принадлежит нужной области видимости.
left: x - left = 0
right: -x + right = 0
bottom: y - bottom = 0
top: -y + top = 0
front: -z - near = 0
back: z + far = 0
Это же может быть сделано для перспективы:
left: x + left*z/near = 0
right: -x - right*z/near = 0
bottom: y + bottom *z/near = 0
top: -y - top*z/near = 0
front: -z - near = 0
back: z + far = 0
Алгоритм Кохена-Сазерленда работает в 3-х мерном пространстве так же как и в 2-х мерном. Координаты вершины проверяются на попадание или непопадание. Если нет тривиального пересечния, то линия отсекается в одной из шести видимых плоскостей и проверяется снова.
Алгоритм Сазерленда-Ходжмана отсечения многоугольников работает подобным образом. Многоугольник также может быть усечен в одной из видимых плоскостей.
Отсечение в NDCS
NDCS является потенциально замечательной системой координат для отсечения, так как уравнения плоскости легко определяются и всегда остаются без изменений. Более того, линии в VCS – линии в NDCS и поэтому, казалось бы, что правильные пересечения могут быть посчитаны, несмотря на тот факт, что пространство NDCS имееет страннное искривление из-за его пост-перспективной части.
Потенциальная проблема отсечения в NDCS заключается в том , что знак глубины информации теряется, что показано в следующем примере.
Отсечение в СCS
Мы определим область отсечения в ССS с помощью области отсечения в NDCS:
-1 <= x/w <=1
Это означает, что в CCS мы будем иметь:
-w<= x <= w
Выглядеть это будет так:
Области отсечения аналогичны для Z и Y. Это иллюсрирует следующий пример:
23