Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Наложение текстурЫ на сферу


Автор: Elfet 26.11.2004, 13:50
Код
//как?
GLUquadricObj *gsea;
gsea = gluNewQuadric();
glColor3f(0.2, 0.2, 1.0);
gluQuadricDrawStyle(gsea, GLU_FILL);
gluSphere(gsea, 100, 100, 100);

Вот, как наложить тексуру на эту сферу?
smile
Заранее благодарен! smile

Автор: DENNN 26.11.2004, 14:06
Код

gluQuadricTexture(gsea,GL_TRUE);
gluQuadricDrawStyle(gsea, GLU_FILL);
glColor3f(0.2, 0.2, 1.0);

gluSphere(gsea, 100, 100, 100);

 gluDeleteQuadric(gsea);
  auxSwapBuffers();

Автор: Elfet 26.11.2004, 15:12
Код

gluQuadricTexture(gsea,GL_TRUE);

только вот это вставить? smile что то я не понял как наложить текстуру! smile

Автор: chipset 26.11.2004, 15:15
Ну ты же сначала пробиндишь её glBindTexture ;)

Автор: Elfet 26.11.2004, 15:21
Код
GLUquadricObj *gsea;
gsea = gluNewQuadric();
glColor3f(0.2, 0.2, 1.0);
gluQuadricDrawStyle(gsea, GLU_FILL);
gluQuadricTexture(gsea,GL_TRUE);
glBindTexture(GL_TEXTURE_2D, texture[0]);
gluSphere(gsea, 100, 100, 100);

smile не работает, забыл я как это делается!

Автор: chipset 26.11.2004, 15:44
Elfet
Пробиндь текстуру перед gluQuadricTexture(gsea,GL_TRUE);, может заработает..

Автор: DENNN 26.11.2004, 15:52
Текстуру сначала надо загрузить smile
Что-то типа этого
Код

mytex=auxDIBImageLoad("lya-lya.bmp");
glGenTextures(1,&mytexcode);
glBindTexture(GL_TEXTURE_2D,mytexcode);
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexImage2D(GL_TEXTURE_2D,0,3,mytex->sizeX,mytex->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,mytex->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);


Примерно так, могу где-то ошибиться - я обычно фигурами из глюта не пользуюсь.

Автор: chipset 26.11.2004, 16:00
Код

int mytexcode;
AUX_RGBImageRec image  = auxDIBImageLoad("lya-lya.bmp");
glGenTextures(1,&mytexcode);
glBindTexture(GL_TEXTURE_2D,mytexcode);
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexImage2D(GL_TEXTURE_2D,0,3,mytex->sizeX,mytex->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,mytex->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);

Вроде бы так..

Автор: Elfet 26.11.2004, 16:24
smile
да я вроде загружаю
Код
GLuint texture[3];
GLvoid LoadGLTextures()
{
// Загрузка картинки
AUX_RGBImageRec *texture1;
   texture1 = auxDIBImageLoad("data/textures/sphere.bmp");
// Создание текстуры
glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture1->data);

}

может сюды чего-нибудь? :
Код
GLUquadricObj *gsea;
gsea = gluNewQuadric();
glColor3f(0.2, 0.2, 1.0);
gluQuadricDrawStyle(gsea, GLU_FILL);
gluQuadricTexture(gsea,GL_TRUE);
glBindTexture(GL_TEXTURE_2D, texture[0]);
gluSphere(gsea, 100, 100, 100);


Автор: [ss]3L33T@ 27.11.2004, 05:57
Не о том вы гутаете!
Сферу надо делать самому, мат. методом, потом указывать для каждого полигона UV координаты и натягивать текстуру.
ИМХО

Автор: Elfet 27.11.2004, 11:29
[ss]3L33T@, можешь код сферы дать?

Автор: [ss]3L33T@ 27.11.2004, 12:24
Код

void BornASurface(unsigned int w, unsigned int l, float scalex, float scalez)
{
unsigned int i, j, k;
k = 0;
for(i = 0; i < unsigned int(w * scalez); i++)
 for (j = 0; j < unsigned int(l * scalex); j++)
 {
  polygon[k].vertex[0][0]=j/scalex;
  polygon[k].vertex[0][1]=0;
  polygon[k].vertex[0][2]=i/scalez;

  polygon[k].vertex[1][0]=j/scalex+1/scalex;
  polygon[k].vertex[1][1]=0;
  polygon[k].vertex[1][2]=i/scalez;

  polygon[k].vertex[2][0]=j/scalex+1/scalex;
  polygon[k].vertex[2][1]=0;
  polygon[k].vertex[2][2]=i/scalez+1/scalez;

  polygon[k].vertex[3][0]=j/scalex;
  polygon[k].vertex[3][1]=0;
  polygon[k].vertex[3][2]=i/scalez+1/scalez;
  k++;
 }
}

Вопросы будут - задавай.

Автор: Elfet 28.11.2004, 21:14
smile огромное спасибо!

Автор: DENNN 29.11.2004, 13:02
Это, я так понимаю, генерация апроксимирующего полигона для точки сферы?

http://astronomy.swin.edu.au/~pbourke/opengl/sphere/

Автор: decembrist 3.12.2004, 12:49
Elfet ты на чем программируешь?
Я над строчками
Цитата
GLUquadricObj *gsea;
gsea = gluNewQuadric();

уже не один день парюсь. Первая строчка проходит, а на второй виснет, зараза. Компилятор вааще игнорирует ее. smile

Автор: Elfet 3.12.2004, 15:28
а ты подключил #pragma comment(lib, "Opengl32.lib"); #pragma comment(lib, "GLU32.lib"); pragma comment(lib, "GLaux.lib");
но как я теперь понял что с помощью квадрика не програмят =)

и у меня с
Цитата(DENNN @ 29.11.2004, 14:02)
Вот генерация сферы с текстурными координатами.

проблема: smile

Код

/*
  Create a sphere centered at c, with radius r, and precision n
  Draw a point for zero radius spheres
  Use CCW facet ordering
  "method" is 0 for quads, 1 for triangles
     (quads look nicer in wireframe mode)
  Partial spheres can be created using theta1->theta2, phi1->phi2
  in radians 0 < theta < 2pi, -pi/2 < phi < pi/2
*/
void CreateSphere(XYZ c,double r,int n,int method,
  double theta1,double theta2,double phi1,double phi2)
{
  int i,j;
  double t1,t2,t3;
  XYZ e,p;

  /* Handle special cases */
  if (r < 0)
     r = -r;
  if (n < 0)
     n = -n;
  if (n < 4 || r <= 0) {
     glBegin(GL_POINTS);
     glVertex3f(c.x,c.y,c.z);
     glEnd();
     return;
  }

  for (j=0;j<n/2;j++) {
     t1 = phi1 + j * (phi2 - phi1) / (n/2);
     t2 = phi1 + (j + 1) * (phi2 - phi1) / (n/2);

     if (method == 0)
        glBegin(GL_QUAD_STRIP);
     else
        glBegin(GL_TRIANGLE_STRIP);

     for (i=0;i<=n;i++) {
        t3 = theta1 + i * (theta2 - theta1) / n;

        e.x = cos(t1) * cos(t3);
        e.y = sin(t1);
        e.z = cos(t1) * sin(t3);
        p.x = c.x + r * e.x;
        p.y = c.y + r * e.y;
        p.z = c.z + r * e.z;
        glNormal3f(e.x,e.y,e.z);
        glTexCoord2f(i/(double)n,2*j/(double)n);
        glVertex3f(p.x,p.y,p.z);

        e.x = cos(t2) * cos(t3);
        e.y = sin(t2);
        e.z = cos(t2) * sin(t3);
        p.x = c.x + r * e.x;
        p.y = c.y + r * e.y;
        p.z = c.z + r * e.z;
        glNormal3f(e.x,e.y,e.z);
        glTexCoord2f(i/(double)n,2*(j+1)/(double)n);
        glVertex3f(p.x,p.y,p.z);

     }
     glEnd();
  }
}



что за double theta1,double theta2,double phi1,double phi2 ? smile

Автор: DENNN 3.12.2004, 17:44
Там же написоанно, что используется, если необходимопостроить только часть сферы.
phi - широта (если мы говорим о земном шаре)
theta - долгота.
Соответственно ты задаешь диапазоны в угловой форме в радианах: от-до.

Автор: Elfet 6.12.2004, 15:24
да, но зачем их по две? 1-2

Автор: DENNN 6.12.2004, 17:31
Цитата
да, но зачем их по две? 1-2

от-до

Автор: Elfet 6.12.2004, 22:58
ну я и дебил конечьно! smile

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