Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Построение сферы полигонами. 
V
    Опции темы
Elfet
Дата 28.6.2007, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Как построить сферу при помощи полигонов? (получить массив полигонов, образующих сферу)
Заранее спасибо! 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);



--------------------
PM MAIL WWW Skype   Вверх
Elfet
Дата 29.6.2007, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



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

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


--------------------
PM MAIL WWW Skype   Вверх
IAV
Дата 4.7.2007, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 4.7.2005

Репутация: нет
Всего: 3



Код

#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 
PM MAIL   Вверх
Elfet
Дата 4.7.2007, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



IAV, это что? smile



--------------------
PM MAIL WWW Skype   Вверх
Elfet
Дата 4.7.2007, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Проблема у меня с аппроксимациями smile
Остается дырка :/
user posted image


--------------------
PM MAIL WWW Skype   Вверх
maxim1000
Дата 4.7.2007, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



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


--------------------
qqq
PM WWW   Вверх
IAV
Дата 4.7.2007, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 4.7.2005

Репутация: нет
Всего: 3



Цитата(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 координаты каждой вершины.


Это сообщение отредактировал(а) IAV - 4.7.2007, 14:34
PM MAIL   Вверх
Elfet
Дата 4.7.2007, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



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

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


--------------------
PM MAIL WWW Skype   Вверх
Rickert
Дата 5.7.2007, 05:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 1
Всего: 52



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


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Elfet
Дата 5.7.2007, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Ок! smile


--------------------
PM MAIL WWW Skype   Вверх
IAV
Дата 5.7.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 4.7.2005

Репутация: нет
Всего: 3



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

Это сообщение отредактировал(а) IAV - 5.7.2007, 12:26
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0651 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.