Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Построение сферы полигонами.


Автор: Elfet 28.6.2007, 19:23
Как построить сферу при помощи полигонов? (получить массив полигонов, образующих сферу)
Заранее спасибо! smile

Добавлено через 11 минут и 54 секунды
Я нашёл вот это, но коечто здесь не понимаю, поясните пожалуйста! smile
Код

procedure CreateSphere(var mlist: glUint; CX, CY, CZ, Radius : glFloat; N : Integer);
var I, J : Integer;
    theta1,theta2,theta3 : glFloat;
    X, Y, Z, px, py, pz : glFloat;
begin
  mlist :=glGenLists(1);
  glNewList(mlist, GL_COMPILE);

    if Radius < 0 then Radius :=-Radius;
    if n < 0 then n := -n;
    if (n < 4) OR (Radius <= 0) then
    begin
      glBegin(GL_POINTS);
        glVertex3f(CX, CY, CZ);
      glEnd();
      exit;
    end;

    for J :=0 to N DIV 2 -1 do
    begin
      theta1 := J*2*PI/N - PI/2;
      theta2 := (J+1)*2*PI/n - PI/2;
      glBegin(GL_QUAD_STRIP);
        For I :=0 to N do
        begin
          theta3 := i*2*PI/N;
          x := cos(theta2) * cos(theta3);
          y := sin(theta2);
          z := cos(theta2) * sin(theta3);
          px := CX + Radius*x;
          py := CY + Radius*y;
          pz := CZ + Radius*z;

          glTexCoord2f(1-I/n, 2*(J+1)/n);
          glVertex3f(px,py,pz);

          X := cos(theta1) * cos(theta3);
          Y := sin(theta1);
          Z := cos(theta1) * sin(theta3);
          px := CX + Radius*X;
          py := CY + Radius*Y;
          pz := CZ + Radius*Z;

          glTexCoord2f(1-i/n, 2*j/n);
          glVertex3f(px,py,pz);
        end;
      glEnd();
    end;
  glEndList();
end;

Вот это что? smile
Цитата

N DIV 2 -1

И ещё я не использую ни OpenGL , ни DX smile 
И не очень разбираюсь в них: каким образом они работают? (что бы получить координаты треугольников?)
Цитата

          glTexCoord2f(1-I/n, 2*(J+1)/n);
          glVertex3f(px,py,pz);
.........
          glTexCoord2f(1-i/n, 2*j/n);
          glVertex3f(px,py,pz);

Автор: Elfet 29.6.2007, 10:53
Цитата(Elfet @  28.6.2007,  20:23 Найти цитируемый пост)
  mlist :=glGenLists(1);
  glNewList(mlist, GL_COMPILE);

Тоже с не понимаю smile

Автор: IAV 4.7.2007, 08:39
Код

#include <math.h>
#include <stdio.h>
#include <conio.h>
 
#define Band_Power  4  // 2^Band_Power = Total Points in a band.
#define Band_Points 16 // 16 = 2^Band_Power
#define Band_Mask (Band_Points-2)
#define Sections_In_Band ((Band_Points/2)-1)
#define Total_Points (Sections_In_Band*Band_Points) 
// remember - for each section in a band, we have a band
#define Section_Arc (6.28/Sections_In_Band)
const float R = -10; // radius of 10
 
int main(int argc, char* argv[])
{
 
  int i;
  float x_angle;
  float y_angle;
 
  for (i=0;i<Total_Points;i++)
  {  
    // using last bit to alternate,+band number (which band)
    x_angle=(float)(i&1)+(i>>Band_Power);  
    
    // (i&Band_Mask)>>1 == Local Y value in the band
    // (i>>Band_Power)*((Band_Points/2)-1) == how many bands
    //  have we processed?
    // Remember - we go "right" one value for every 2 points.
    //  i>>bandpower - tells us our band number
    y_angle=(float)((i&Band_Mask)>>1)+((i>>Band_Power)*(Sections_In_Band));
 
    x_angle*=(float)Section_Arc/2.0f; // remember - 180° x rot not 360
    y_angle*=(float)Section_Arc*-1; 
    
    printf("{%f,%f, %f },\n",
      R*sin(x_angle)*sin(y_angle),
      R*cos(x_angle),
      R*sin(x_angle)*cos(y_angle));
    
  }
  
  printf("Press any key\n");
  getch();
  return 0;
}

Автор кода - Polaris|Northern Dragons. Код из дискмага Hugi #27. Удачи  smile 

Автор: Elfet 4.7.2007, 09:37
IAV, это что? smile

Автор: Elfet 4.7.2007, 12:38
Проблема у меня с аппроксимациями smile
Остается дырка :/
user posted image

Автор: maxim1000 4.7.2007, 12:40
ну а там уже можно отдельно рассмотреть случай
например, просто использовать треугольники, у которых одна вершина - полюс

Автор: IAV 4.7.2007, 14:31
Цитата(Elfet @  4.7.2007,  09:37 Найти цитируемый пост)
IAV, это что? 
 - это небольшая программка на си, в которой не очень сложно разобраться при желании. И в ней нет проблем с апроксимациями. Рисовать в опенжл при помощи триангл-фенов, можно и обычными трианглами.
----------------------------
Просто для справки - R*sin(x_angle)*sin(y_angle), R*cos(x_angle), R*sin(x_angle)*cos(y_angle)) это соотв. x,y,z координаты каждой вершины.

Автор: Elfet 4.7.2007, 20:39
maxim1000, с другой стороны всё в порядке, а вот с этой нет :/ Тут и там QuadStep - но с этой стороны получаются где то нулевые нормали, вот и выскакивает ошибка. Не могу понять почему с другой стороны такого не произошло?

IAV, а вот как определить где начинается новая полоска? smile

Автор: Rickert 5.7.2007, 05:01
Elfet, Мой тебе совет - никогда не пользуйся чужим кодом, чтобы разобраться в проблеме. Лучше сначала сам подумай, а готовый исходник оставь на крайний случай. Возьми мат. справчоник инайди уравнение сферы, а затем сам уже сообразишь какеё строить. Это получаса делов smile А так ты несколько дней будешь возиться дурацкими исходниками, в которых, кстати, не исключены ошибки ;)

Автор: Elfet 5.7.2007, 08:31
Ок! smile

Автор: IAV 5.7.2007, 12:22
Elfet, они просто переходят одна в одну. Получается чет вроде лесенки
-------------------------
Rickert - золотые слова  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)