![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Видимые/невидимые линии [D6, Win95/98, WinME, NT4, Win2k, WinXP]
Racer © (2003-01-27 23:14:00)Проблемка у меня. Как нарисовать фигуру с использованием OpenGL (или без него) т.о., чтобы она была прозрачной, видимые ребра были сплошными, а невидимые - пунктирными. При этом фигура должна вращаться. Если можно - мыльте. Буду крайне благодарен за примеры и/или ссылки, где их можно взять. Прога должна пахать под любой Win32.
Racer (2003-02-10 22:22:00) [1]Буду крайне признателен, если вышлешь. По секрету - это мой диплом. Т.е. прога, которая показывает различные фигуры, но так, чтобы их можно было покрутить, посмотреть в варианте, когда видны только грани и когда видна сплошная фигура + сечения + разверстка.
Мыль mad.racer@mail.ru
i-C3H7OH (2003-02-10 17:09:00) [2]не понимаю. что значит якобы прозрачный? либо прозрачный, либо нет.
скажу по секрету я уже накодил нечто подобное. просто интересно было. скажу вот что. так как исплоьзуем пунктир, каждое ребро должно рисоваться только 1 раз, иначе пунктир будет накладываться и смазываться. т.е. сделать 1 GL_LINE_LOOP все это проблематично.( по этой же причине не проходит ГЛЮТ)
поэтому я делал так (ч-з задницу, понимаю). каждое ребро рисуется 1 раз пунктиром либо сплошной. для этого создаем таблицу этих ребер. каждая грань тестируется видна она или нет. если да, то ребра ее окаймляющие назначаются сплошными.
потом по таблице рисуем ребра.
примерно так. сложно, но работает без проблем. могу выслать исходник
Racer (2003-02-09 23:40:00) [3]i-C3H7OH,
как сделать так, чтобы при рисовании отображались только передние (видимые) грани, т.е., например, при использовании примитива GL_LINE_LOOP фигура была якобынепрозрачной. Именно якобы, т.к. нужно внутри нарисовать еще фигуру, и она должна быть видна.
Ketmar (2003-02-05 20:46:00) [4]>Racer (02.02.03 23:17)
GLUT.
Satanas Nobiscum! 05-Feb-XXXVIII A.S.
i-C3H7OH (2003-02-04 12:26:00) [5]ну как, смотрим на треугольник, если вершины чередуются скажем против часовой стрелки - видим перед, иначе - зад:)
поэкспериментируй с режимом GL_CULL_FACE, чтобы окончательно разобраться.
Racer (2003-02-04 02:05:00) [6]Если не секрет, то как именно порядок вершин влияет на определение грани (перед./зад.)? Например, в кубе?
i-C3H7OH (2003-02-03 16:40:00) [7]насчет многоугольников не знаю
всякие модели можно найти напр. на 3dcafe.com
я когда тоже рисовал такое всегда сам задавал вершины, но это изврат.
к тому же вершины граней должны чередоваться в таком порядке, чтобы нормаль, вычисляемая ОпенГЛ (или самим), была направлена наружу.
приходилось тестировать каждую грань поочереди..
кстати насчет штриховки можно попробовать такой прием
glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);
DrawFigure;
glCullFace(GL_BACK);
glEnable(GL_LINE_STIPPLE);
glLineStipple(2, $0F0F);
DrawFigure;
glDisable(GL_LINE_STIPPLE);
glDisable(GL_CULL_FACE);
при включенни GL_CULL_FACE задняя и передняя стороны определяются порядком вершин
Racer (2003-02-02 23:17:00) [8]Спасибо, i-C3H7OH.
А ты случаем не знаешь, где найти готовые геом. фигуры (типа различных произвольных конусов и т.д.). Сильно в лом самому нормали считать...
i-C3H7OH (2003-02-02 04:03:00) [9]
штриховка
glEnable(GL_LINE_STIPPLE);
glLineStipple(2, $0F0F);
......
glDisable(GL_LINE_STIPPLE);
Racer (2003-02-01 14:16:00) [10]При рисовании указываешь тип примитива не GL_POLYGON, а GL_LINE_LOOP. Пример:
Procedure DrawCube; {КУБ}
const
CubeP1: array[0..5,0..2] of glFloat = (( 0.7, 0.7, 0.7),
( 0.7, 0.7,-0.7),
(-0.7, 0.7, 0.7),
( 0.7, 0.7, 0.7),
(-0.7, 0.7, -0.7),
(-0.7, -0.7, -0.7));
CubeP2: array[0..5,0..2] of glFloat = ((-0.7, 0.7, 0.7),
(0.7, -0.7, -0.7),
(-0.7, 0.7, -0.7),
(0.7, -0.7, 0.7),
(-0.7, 0.7, 0.7),
(0.7, -0.7, -0.7));
CubeP3: array[0..5,0..2] of glFloat = ((-0.7, -0.7, 0.7),
(-0.7, -0.7, -0.7),
(-0.7, -0.7, -0.7),
(0.7, -0.7, -0.7),
(0.7, 0.7, 0.7),
(0.7, -0.7, 0.7));
CubeP4: array[0..5,0..2] of glFloat = ((0.7, -0.7, 0.7),
(-0.7, 0.7, -0.7),
(-0.7, -0.7, 0.7),
(0.7, 0.7, -0.7),
(0.7, 0.7, -0.7),
(-0.7, -0.7, 0.7));
CubeNL: array[0..5,0..2] of glFloat = ((0.0, 0.0, 1.0),
(0.0, 0.0, -1.0),
(-1.0, 0.0, 0.0),
(1.0, 0.0, 0.0),
(0.0, 1.0, 0.0),
(0.0, -1.0, 0.0));
var
i: integer;
begin
// glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, @glfMaterialColor2);
glTranslatef(0.0 , 0.0, 0.0);
case fill of
0 : for i:=0 to 5 do
glBegin(GL_POLYGON);
glNormal3f(CubeNL[i,0],CubeNL[i,1],CubeNL[i,2]);
glVertex3f(CubeP1[i,0],CubeP1[i,1],CubeP1[i,2]);
glVertex3f(CubeP2[i,0],CubeP2[i,1],CubeP2[i,2]);
glVertex3f(CubeP3[i,0],CubeP3[i,1],CubeP3[i,2]);
glVertex3f(CubeP4[i,0],CubeP4[i,1],CubeP4[i,2]);
glEnd;
end;
1 : begin for i:=0 to 5 do
glBegin(GL_LINE_LOOP);
glNormal3f(CubeNL[-i,0],CubeNL[-i,1],CubeNL[-i,2]);
glVertex3f(CubeP1[i,0],CubeP1[i,1],CubeP1[i,2]);
glVertex3f(CubeP2[i,0],CubeP2[i,1],CubeP2[i,2]);
glVertex3f(CubeP3[i,0],CubeP3[i,1],CubeP3[i,2]);
glVertex3f(CubeP4[i,0],CubeP4[i,1],CubeP4[i,2]);
glEnd;
end;
end;
end;
Это просто вырезка из моей проги, так что не обращай внимания на левые переменные типа fill...
pasha676 (2003-01-31 10:54:00) [11]
> Насчет самой проекции - проблем нет, вся закавыка именно
> в пунктире
Раскажи как.
Racer (2003-01-30 23:01:00) [12]to pasha676
Насчет самой проекции - проблем нет, вся закавыка именно в пунктире
---------------
to i-C3H7OH
Идея неплохая. Только подскажи, как рисовать пунктиром, этого я не знаю.
pasha676 (2003-01-30 16:19:00) [13]Мне кажется в ОпеньГЛ можно сделать проекцию. Вроде даже просто в свойствах камеры что-то такое было. Но вот линии пунктиром. Это наверное нельзя.
i-C3H7OH (2003-01-30 15:25:00) [14]стадартных способов я не вижу
можно для каждой грани вычислять внешнюю нормаль
если нормаль направлена от экрана, то ребра, ее окружающие, рисуем пунктиром...
pasha676 (2003-01-29 10:41:00) [15]Как делать проекции я не знаю. Но с удовольствием почитаю, как это надо делать :).
Racer (2003-01-28 22:23:00) [16]to Pasha676:
Мне нужна не полупрозрачность, а рисунок типа геометрической проекции (как в школе на доске).
----------------------
to i-C3H7OH
Выпуклая. В частности: куб, тетраэдр, конус, etc.
i-C3H7OH (2003-01-28 15:46:00) [17]фигура-то выпуклая? (в классическом понимании)
pasha676 (2003-01-28 10:03:00) [18]Насчет линий не знаю - а полупрозрачность можно достич или текстурами или заданием для цветов альфа канала.