Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.01.2011, 20:59
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию текстуру натянуть на сферу

хелп, никто не знает как это можно сделать?
Ответить с цитированием
  #2  
Старый 19.01.2011, 21:24
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Текстурные координаты расставить.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 19.01.2011, 21:38
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

не ну сфера круглая там куча точек как я тебе по всем натяну)
Ответить с цитированием
  #4  
Старый 19.01.2011, 22:02
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

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

например: (чисто формально)

for i=1 to 10
for j=1 to 10
begin
x(i,j)=cos(i)*cos(j)
y(i,j)=sin(i)
z(i,j)=cos(i)*sin(j)
end

по сути дела нахождение координат происходит по двум переменным
i,j. имеем двухмерный случай, что собственно нам и нужно, ибо текстура двухмерна)) Теперь, к каждой точке нашей текстуры (а точнее к ее сетке) можно привязать определенную координату.

Последний раз редактировалось Pilot_Red, 19.01.2011 в 22:16.
Ответить с цитированием
  #5  
Старый 19.01.2011, 22:48
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

хм интересно, попробую
Ответить с цитированием
  #6  
Старый 20.01.2011, 14:29
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Draw;
end;

procedure TForm1.Draw;
      var
        quadObj :GLUquadricObj;
      begin
       glEnable(Gl_TEXTURE_2d);
        glClear(GL_DEPTH_BUFFER_BIT xor GL_COLOR_BUFFER_BIT);
        quadObj:=gluNewQuadric;
        gluQuadricDrawStyle(quadObj, GLU_FILL);
        CreateSphere(0, 0, 0, 10, 48);
        gluDeleteQuadric(quadObj);
        SwapBuffers(ghDC);
        glPushMatrix;
end;


procedure TForm1.CreateSphere(CX, CY, CZ, Radius : glFloat; N : Integer);  // N = precision
var I, J : Integer;
    theta1,theta2,theta3 : glFloat;
    X, Y, Z, px, py, pz : glFloat;
begin
  SphereDL :=glGenLists(1);
  glNewList(SphereDL, GL_COMPILE);
 LoadTexture('images/earth.jpg', DayTex, FALSE);
    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;

  //        glNormal3f(X, Y, 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;

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


вот попробовал но черный экран кто скажет почему не работает?
Ответить с цитированием
  #7  
Старый 20.01.2011, 22:02
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

А не слишком радиус здоровый. Вроде нигде нет масштабирования...
попробуй хотя бы 1 поставить
Ответить с цитированием
  #8  
Старый 20.01.2011, 23:08
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

попробовал все равно пусто
Ответить с цитированием
  #9  
Старый 20.01.2011, 23:28
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

В CreateSphere попробуй glGenLists(1) на glGenLists(0) поменять
Ответить с цитированием
  #10  
Старый 20.01.2011, 23:52
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

спасибо! а в чем ошибка то там?
Ответить с цитированием
  #11  
Старый 21.01.2011, 00:28
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

После того как ты создаешь список объектов с помощью команд:
SphereDL :=glGenLists(1);
glNewList(SphereDL, GL_COMPILE);
там помоему нужно вызывать потом glCallList(SphereDL) из процедуры Draw

но тогда нужно обратно 0 на 1 поменять в glGenLists(1).

вообще список создается всего один раз. поэтому процедуру CreateSphere можно вызвать ..например при создании формы. а потом уже в Draw вызывать glCallList(SphereDL)

и будет выглядеть примерно так:

Код:
procedure TForm1.Draw;
      begin
        glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
         glCallList(SphereDL) ;
        SwapBuffers(ghDC);
        glPushMatrix;
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:34.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025