![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() хелп, никто не знает как это можно сделать?
|
#2
|
||||
|
||||
![]() Текстурные координаты расставить.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
||||
|
||||
![]() не ну сфера круглая там куча точек как я тебе по всем натяну)
|
#4
|
||||
|
||||
![]() каждую точку сферы ты находишь в двойном цикле.
то-есть во внутреннем, вокруг одной оси строишь полу окружность, а потом поворачивая эту окружность вокруг другой оси получаешь сферу. например: (чисто формально) 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
|
||||
|
||||
![]() хм интересно, попробую
|
#6
|
||||
|
||||
![]() Код:
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
|
||||
|
||||
![]() А не слишком радиус здоровый. Вроде нигде нет масштабирования...
попробуй хотя бы 1 поставить |
#8
|
||||
|
||||
![]() попробовал все равно пусто
|
#9
|
||||
|
||||
![]() В CreateSphere попробуй glGenLists(1) на glGenLists(0) поменять
|
#10
|
||||
|
||||
![]() спасибо! а в чем ошибка то там?
|
#11
|
||||
|
||||
![]() После того как ты создаешь список объектов с помощью команд:
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; |