|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Alex Astafiev 2:5000/228.16 25 Apr 2002 11:17:02 To : Evgeniy Jirnov Subject : Помогите pls... -------------------------------------------------------------------------------- EJ> Сабж, а то я с математикой и векторами не очень дружу: есть квадратный EJ> рисунок размером NxN, как нарисовать 3-х мерный куб(6-ти гранный), EJ> каждая сторона которого будет покрыта этим рисунком? Причем EJ> длина/высота/ширина куба - совпадает с картинкой - N. EJ> EJ> В общем-то мне надо узнать как одну сторону(повернутую на EJ> XAngle,YAngle и/или ZAngle) нарисовать с текстурой, а с остальными я EJ> уж сам как-нибудь. Подскажите как можно более проще, а то я в этом как EJ> свинья в апельсинах. читай texture mapping Тебе нужно афинное текстурирование (affine texture mapping). можешь скомпилять мой старый тестовый код opengl под windows и Glut library - текстурированый вращающийся кубик с освещением. если установлен MSCV++ то достаточно в командной строке набрать cl texcube.c думаю, в пяти функциях из одних вызовов OpenGL каждый разберется. ==== Begin of texcube.c ==== /* Lit textured cube by A.Raider Flashinc`99 */ #include <GL/glut.h> #pragma comment( lib, "opengl32.lib" ) #pragma comment( lib, "glu32.lib" ) #pragma comment( lib, "glut32.lib" ) typedef unsigned char byte; typedef struct { byte r, g, b, a; } RGBA; RGBA texture[256][256]; GLuint texName; #include "cube.h" void make_texture( void ) { int i, j; for( i = 0; i < 256; i++ ) { for( j = 0; j < 256; j++ ) { texture[i][j].r = i << 1 ^ j << 1; texture[i][j].g = i << 2 ^ j << 2; texture[i][j].b = i << 2 ^ -j << 2; texture[i][j].a = 255; } } glGenTextures( 1, texName ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ); gluBuild2DMipmaps( GL_TEXTURE_2D, 4, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, texture ); glEnable( GL_TEXTURE_2D ); } void display_function( void ) { static GLfloat spin; glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glLoadIdentity(); gluLookAt( 0, 0, 5, 0, 0, 0, 0, 1, 0 ); glRotatef( spin++, 1, 0, 1 ); glBindTexture( GL_TEXTURE_2D, texName ); cube(); glutSwapBuffers(); } void resize_function( int width, int height ) { glViewport( 0, 0, width, height ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluPerspective( 45.0, (float)width / (float)height, 0.5, 100.0 ); glMatrixMode( GL_MODELVIEW ); } void idle_function( void ) { glutPostRedisplay(); } int main( int argc, char *argv[] ) { glutInit( &argc, argv ); glutInitWindowPosition( 200, 200 ); glutInitWindowSize( 640, 480 ); glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH ); glutCreateWindow( argv[0] ); glutReshapeFunc( resize_function ); glutIdleFunc( idle_function ); glutDisplayFunc( display_function ); glEnable( GL_DEPTH_TEST ); glEnable( GL_CULL_FACE ); glEnable( GL_LIGHTING ); glEnable( GL_LIGHT0 ); make_texture(); glutMainLoop(); return 0; } ==== End of texcube.c ==== рядом должен лежать include-файл с процедурой построения кубика: можно взамен пользоваться ф-цией glutSolidCube(). ==== Begin of cube.h ==== void cube() { glBegin( GL_QUADS ); /* Front Face */ glNormal3f( 0, 0, 1 ); glTexCoord2f( 0, 0 ); glVertex3f( -1, -1, 1 ); glTexCoord2f( 1, 0 ); glVertex3f( 1, -1, 1 ); glTexCoord2f( 1, 1 ); glVertex3f( 1, 1, 1 ); glTexCoord2f( 0, 1 ); glVertex3f( -1, 1, 1 ); /* Back Face */ glNormal3f( 0, 0, -1 ); glTexCoord2f( 1, 0 ); glVertex3f( -1, -1, -1 ); glTexCoord2f( 1, 1 ); glVertex3f( -1, 1, -1 ); glTexCoord2f( 0, 1 ); glVertex3f( 1, 1, -1 ); glTexCoord2f( 0, 0 ); glVertex3f( 1, -1, -1 ); /* Top Face */ glNormal3f( 0, 1, 0 ); glTexCoord2f( 0, 1 ); glVertex3f( -1, 1, -1 ); glTexCoord2f( 0, 0 ); glVertex3f( -1, 1, 1 ); glTexCoord2f( 1, 0 ); glVertex3f( 1, 1, 1 ); glTexCoord2f( 1, 1 ); glVertex3f( 1, 1, -1 ); /* Bottom Face */ glNormal3f( 0, -1, 0 ); glTexCoord2f( 1, 1 ); glVertex3f( -1, -1, -1 ); glTexCoord2f( 0, 1 ); glVertex3f( 1, -1, -1 ); glTexCoord2f( 0, 0 ); glVertex3f( 1, -1, 1 ); glTexCoord2f( 1, 0 ); glVertex3f( -1, -1, 1 ); /* Right face */ glNormal3f( 1, 0, 0 ); glTexCoord2f( 1, 0 ); glVertex3f( 1, -1, -1 ); glTexCoord2f( 1, 1 ); glVertex3f( 1, 1, -1 ); glTexCoord2f( 0, 1 ); glVertex3f( 1, 1, 1 ); glTexCoord2f( 0, 0 ); glVertex3f( 1, -1, 1 ); /* Left Face */ glNormal3f( -1, 0, 0 ); glTexCoord2f( 0, 0 ); glVertex3f( -1, -1, -1 ); glTexCoord2f( 1, 0 ); glVertex3f( -1, -1, 1 ); glTexCoord2f( 1, 1 ); glVertex3f( -1, 1, 1 ); glTexCoord2f( 0, 1 ); glVertex3f( -1, 1, -1 ); glEnd(); } ==== End of cube.h ==== --- * Origin: Alex Raider/ Flash inc. 1992-2002 (2:5000/228.16) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/174643cc847aa.html, оценка из 5, голосов 10
|