Member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: [Omsk Team]
Задача такая: нужно построить что-то вроде гриба!
Т.е. ножка (Cylinder) и шляпка(???). Я просто взял да и построил цилиндр, а над ним сферу, но теперь проблема - как отсеч пол сферы??
Я вроде бы отсек пол сферы, но как оказалось отсеклось всё что ниже нее, т.к. использовал glClipPlane (GL_CLIP_PLANE0, @eqn); .
Member
Статус: Не в сети Регистрация: 04.01.2004 Откуда: 31
VaXoID Нарисуй лучше ёлку (или снеговика) - проще.
Если нужна плусфера, придется заморочиться. Glut-ом, как мне кажется, здесь не пролезешь. Или рисовать в 3ds и экспортом или самому координаты считать (что не так уж и сложно, зная уравнение поверхности сферы)
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
Ну можно и самому рисовать. У меня была гдето процедура для рисования шара, без использования глутов и тому подобное. Ее малость переделать и будет пол шара.
Вечером если найду, выложу.
Добавлено спустя 2 минуты, 10 секунд: Кстати через gluSphere можно рисовать и пол шара тоже.
Добавлено спустя 1 минуту, 37 секунд:
Код:
{------------------------------------------------------------------} { Function to create a sphere } {------------------------------------------------------------------} procedure CreateSphere(var obj : TBlob); const R = 10; yRing =yRows*4 + 4; uTex = 3.0 / (xRows); vTex = 3.0 / (3+2*yRows); var X, Y, I, J : Integer; yLevel, Radius : glFloat; offset : Integer; begin // Top center obj.vertex[0].x := 0; obj.vertex[0].z := 0; obj.vertex[0].y := -r; offset := 1;
// Top half and center for Y :=0 to yRows do begin yLevel := -r*cos(PI2*(y+1) / yring); radius := r*sin(PI2*(y+1) / yring);
for X :=0 to xRows-1 do begin obj.vertex[offset].x := radius * sin(PI2*x / xRows); obj.vertex[offset].z := radius * cos(PI2*x / xRows); obj.vertex[offset].y := yLevel; Inc(offset); end; end;
// Bottom half for Y :=0 to yRows-1 do begin yLevel := r*sin(PI2*(y+1) / yring); radius := r*cos(PI2*(y+1) / yring);
for X :=0 to xRows-1 do begin obj.vertex[offset].x := radius * sin(PI2*x / xRows); obj.vertex[offset].z := radius * cos(PI2*x / xRows); obj.vertex[offset].y := ylevel; Inc(offset); end; end;
for J :=0 to yRows*2 -1 do begin for I :=0 to xRows-1 do begin offset := xRows+(i+j*xRows)*2; Triangle[offset].v[0] := j*xRows+1 + i; Triangle[offset].v[1] := j*xRows+1 + (i+1) MOD xRows; Triangle[offset].v[2] := j*xRows+1 + i +xRows;
for i := 0 to xRows-1 do begin offset := xRows+xRows*2*yRows*2 + i; Triangle[offset].v[0] := 2*yRows*xRows+1+i; Triangle[offset].v[1] := 2*yRows*xRows+1+ (i+1) MOD xRows; Triangle[offset].v[2] := 2*yRows*xRows+1+xRows;
type TTriangle = record V : Array[0..2] of Integer; // Vertices T : Array[0..2] of TTexCoord; // Texture coordinates end; TBlob = Record vertex : Array[0..numVertices-1] of TVertex; Triangle : Array[0..numTriangles-1] of TTriangle; end;
Member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: [Omsk Team]
Код:
//Плоскость обрезания сферы eqn: Array [0..3] of GLdouble = (0, 0, 1, 0);
procedure TForm2.FormPaint(Sender: TObject); var ps:TPaintStruct; i:Integer; begin BeginPaint(Form2.Handle,ps);
glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // установление цвета фона glLoadIdentity; glTranslatef(-1,-1,-8); glRotatef(30,1,0,0); glRotate(Angle,1,2,0);
//Шесть сторон куба with Form1 do begin //Поверхности короба glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MaterialColor); glBegin(GL_POLYGON); glNormal(0.0,0.0,-1.0); glVertex3f(L[1].XStart,L[1].YStart,L[1].ZStart); glVertex3f(L[1].XEnd,L[1].YEnd,L[1].ZEnd); glVertex3f(L[2].XEnd,L[2].YEnd,L[2].ZEnd); glVertex3f(L[3].XEnd,L[3].YEnd,L[3].ZEnd); glEnd;
//Сферу над цилиндром glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MaterialColor); glTranslate(0,0,C[3].ZCenter-C[1].ZCenter); gluSphere(Qa,C[3].Radius,100,100); //Вырезаем полусферу {А вот тут то и проблемка}
у меня прекрасно все рисует, координаты плоскости такие же как и у тебя
кстати различай типы double и int, 1 - это int, а вот 1.0 - это double(что и требуется)
показал бы как вырезать пытаешься еще...
_________________ forum.omskteam.ru- Все о керамограните
Member
Статус: Не в сети Регистрация: 02.05.2004 Откуда: Tver
красивей и универсальней сделать сечение и повернуть вокруг оси, сечение нарисовать самому на бумаге в клетку или каким ниб редактором, а поворот вокруг оси уже привели
Member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: [Omsk Team]
Dilon гм, действительно работает! Я делал почти также, только последовательность строк немного другая была:
т.е. я сначала рисовал сферу, а потом задовал плоскость:
Member
Статус: Не в сети Регистрация: 30.04.2004 Откуда: [Omsk Team]
VaXoID
Цитата:
А где имеет значение 1 vs 1.0 ???
ну например попробуй вычислить с точностью до знака значение выражения a/b при a = 1, b =3; в случае int будет 0, а вот double (a = 1.0, b = 3.0 посчитает правильно) в отношении сферы все наоборот, ведь всегда же ты сначала задешь LookAt и тому подобное, а уж затем рисуешь, можно плоскости и при инициализации OpenGL разрешать кстати...
Добавлено спустя 1 минуту, 26 секунд:
Цитата:
красивей и универсальней сделать сечение и повернуть вокруг оси, сечение нарисовать самому на бумаге в клетку или каким ниб редактором, а поворот вокруг оси уже привели
и вся эта муть только для того, чтобы отсечь полсферы, да?
_________________ forum.omskteam.ru- Все о керамограните
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения