Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 14 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: [Omsk Team]
Задача такая: нужно построить что-то вроде гриба!
Т.е. ножка (Cylinder) и шляпка(???). Я просто взял да и построил цилиндр, а над ним сферу, но теперь проблема - как отсеч пол сферы??

Я вроде бы отсек пол сферы, но как оказалось отсеклось всё что ниже нее, т.к. использовал glClipPlane (GL_CLIP_PLANE0, @eqn); .

Может нужен совсем другой способ построения???



Партнер
 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Нарисовать пол сферы или использовать конус, правда на гриб не очень будет похоже с конусом :)


 

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;

  // Bottom center
  obj.vertex[offset].x := 0;
  obj.vertex[offset].z := 0;
  obj.vertex[offset].y := r;

  with Obj do
  begin
    for i :=0 to xRows-1 do
    begin
      Triangle[i].v[0] := 0;
      Triangle[i].v[1] := (i+1) MOD xRows +1;
      Triangle[i].v[2] := (i+1);

      Triangle[i].T[0].u := 0.5;
      Triangle[i].T[0].v := 0.0;
      Triangle[i].T[1].u := (i+1)*uTex;
      Triangle[i].T[1].v := vTex;
      Triangle[i].T[2].u := i*uTex;
      Triangle[i].T[2].v := vTex;
    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;

        Triangle[offset].T[0].u := i*uTex;
        Triangle[offset].T[0].v := (1+j) * vTex;
        Triangle[offset].T[1].u := (1+i) * uTex;
        Triangle[offset].T[1].v := (1+j) * vTex;
        Triangle[offset].T[2].u := i     * uTex;
        Triangle[offset].T[2].v := (2+j) * vTex;

        offset := xRows+(i+j*xRows)*2 + 1;
        Triangle[offset].v[0] := j*xRows+1+ (i+1) MOD xRows;
        Triangle[offset].v[1] := j*xRows+1+ (i+1) MOD xRows + xRows;
        Triangle[offset].v[2] := j*xRows+1+   i+xRows;

        Triangle[offset].T[0].u := (i+1) * uTex;
        Triangle[offset].T[0].v := (1+j) * vTex;
        Triangle[offset].T[1].u := (i+1) * uTex;
        Triangle[offset].T[1].v := (2+j) * vTex;
        Triangle[offset].T[2].u := i     * uTex;
        Triangle[offset].T[2].v := (2+j) * vTex;
      end;

      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;

        Triangle[offset].T[0].u := i           * uTex;
        Triangle[offset].T[0].v := (yRows*2+1) * vTex;
        Triangle[offset].T[1].u := (i+1)       * uTex;
        Triangle[offset].T[1].v := (yRows*2+1) * vTex;
        Triangle[offset].T[2].u := 0.5;
        Triangle[offset].T[2].v := 1.0;
      end;
    end;
  end;
end;



Добавлено спустя 24 секунды:
Код:
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
Статус: Не в сети
Регистрация: 30.04.2004
Откуда: [Omsk Team]
VaXoID правильно ли заданы координаты отсекающей плоскости, вот в чем вопрос ;)

_________________
forum.omskteam.ru- Все о керамограните


 

Member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: [Omsk Team]
Dilon а как они еще могут быть заданы, если отсекающая плоскость перпендикулярна цилиндру?
Ray Adams а как с помощью gluSphere??? Не нашел такого!


 

Member
Статус: Не в сети
Регистрация: 30.04.2004
Откуда: [Omsk Team]
VaXoID покажи весь рисовательный код

_________________
forum.omskteam.ru- Все о керамограните


 

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,@MaterialColor2);
                glBegin(GL_POLYGON);
                 glNormal(0,0,1);
                 glVertex3f(L[5].XEnd,L[5].YEnd,L[5].ZEnd);
                 glVertex3f(L[6].XEnd,L[6].YEnd,L[6].ZEnd);
                 glVertex3f(L[7].XEnd,L[7].YEnd,L[7].ZEnd);
                 glVertex3f(L[8].XEnd,L[8].YEnd,L[8].ZEnd);
                glEnd;
                //Бокавушка короба №1
                glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MaterialColor3);
                glBegin(GL_POLYGON);
                 glNormal(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[6].XEnd,L[6].YEnd,L[6].ZEnd);
                 glVertex3f(L[6].XStart,L[6].YStart,L[6].ZStart);
                glEnd;
                //Бокавушка короба №2
                glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MaterialColor3);
                glBegin(GL_POLYGON);
                 glNormal(1,0,0);
                 glVertex3f(L[10].XStart,L[10].YStart,L[10].ZStart);
                 glVertex3f(L[10].XEnd,L[10].YEnd,L[10].ZEnd);
                 glVertex3f(L[11].XEnd,L[11].YEnd,L[11].ZEnd);
                 glVertex3f(L[11].XStart,L[11].YStart,L[11].ZStart);
                glEnd;
                //Бокавушка короба №3
                glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MaterialColor3);
                glBegin(GL_POLYGON);
                 glNormal(0,1,0);
                 glVertex3f(L[11].XStart,L[11].YStart,L[11].ZStart);
                 glVertex3f(L[11].XEnd,L[11].YEnd,L[11].ZEnd);
                 glVertex3f(L[12].XEnd,L[12].YEnd,L[12].ZEnd);
                 glVertex3f(L[12].XStart,L[12].YStart,L[12].ZStart);
                glEnd;
                //Бокавушка короба №4
                glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MaterialColor3);
                glBegin(GL_POLYGON);
                 glNormal(-1,0,0);
                 glVertex3f(L[12].XStart,L[12].YStart,L[12].ZStart);
                 glVertex3f(L[12].XEnd,L[12].YEnd,L[12].ZEnd);
                 glVertex3f(L[5].XEnd,L[5].YEnd,L[5].ZEnd);
                 glVertex3f(L[5].XStart,L[5].YStart,L[5].ZStart);
                glEnd;
               
                //Цилиндр
                glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MaterialColor4);
                glTranslate(C[1].XCenter,C[1].YCenter,C[1].ZCenter);
                Qa:= gluNewQuadric;
                gluCylinder(Qa,C[1].Radius,C[2].Radius,C[2].ZCenter-C[1].ZCenter,100,100);

                //Сферу над цилиндром
                glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MaterialColor);
                glTranslate(0,0,C[3].ZCenter-C[1].ZCenter);
                gluSphere(Qa,C[3].Radius,100,100);
                //Вырезаем полусферу
                {А вот тут то и проблемка}                 


                gluDeleteQuadric(Qa);
        end;//With Form1

SwapBuffers(DC);
EndPaint(Form2.Handle,ps);
end;


 

Member
Статус: Не в сети
Регистрация: 30.04.2004
Откуда: [Omsk Team]
Код:
   glEnable(GL_CLIP_PLANE0);
      glClipPlane(GL_CLIP_PLANE0,plane);
      gluSphere(obj,100,40,40);
   glDisable(GL_CLIP_PLANE0);

у меня прекрасно все рисует, координаты плоскости такие же как и у тебя
кстати различай типы double и int, 1 - это int, а вот 1.0 - это double(что и требуется)
показал бы как вырезать пытаешься еще...

_________________
forum.omskteam.ru- Все о керамограните


 

Member
Статус: Не в сети
Регистрация: 02.05.2004
Откуда: Tver
красивей и универсальней сделать сечение и повернуть вокруг оси, сечение нарисовать самому на бумаге в клетку или каким ниб редактором, а поворот вокруг оси уже привели

Код:
     obj.vertex[offset].x := radius * sin(PI2*x / xRows);
      obj.vertex[offset].z := radius * cos(PI2*x / xRows);
      obj.vertex[offset].y := yLevel;
 


 

Member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: [Omsk Team]
Dilon гм, действительно работает! Я делал почти также, только последовательность строк немного другая была:
т.е. я сначала рисовал сферу, а потом задовал плоскость:
Код:
gluSphere(obj,100,40,40);
  glEnable(GL_CLIP_PLANE0);
   glClipPlane(GL_CLIP_PLANE0,@plane); 
  glDisable(GL_CLIP_PLANE0);

Вот так он при включении рисовал а при Disable всё обратно возвращал(сейчас это кажется логичго:-)!!!


А где имеет значение 1 vs 1.0 ???


 

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- Все о керамограните


 

Member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: [Omsk Team]
Dilon согласен
Цитата:
и вся эта муть только для того, чтобы отсечь полсферы, да?

а надо было-то местоположение одной строки поменять!!!


 

Member
Статус: Не в сети
Регистрация: 02.05.2004
Откуда: Tver
Флейм удален. vor


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 14 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan