12、请列举出3种以上的三维模型常见的表示格式,已知一个立方体环境映射对应的六个面上的图片,分别假定为X_POSITVIE_PIC, X_NEGATIVE_PIC, Y_POSITIVE_PIC,Y_NEGATIVE_PIC,Z_POSITIVE_PIC,Z_NEGATIVE_PIC,请用OBJ格式表示一个长度为1的立方体,并把每个面分别贴上给定的六个图片。
答:三种常见格式:.obj .x .3ds .off # vertices
v 0.0 0.0 1.0 v 1.0 0.0 1.0 v 1.0 1.0 1.0 v 0.0 1.0 1.0 v 1.0 0.0 0.0 v 1.0 1.0 0.0 v 0.0 1.0 0.0 v 0.0 0.0 0.0
#normals
vn 0.0 0.0 1.0 vn 0.0 0.0 -1.0 vn 0.0 1.0 0.0 vn 0.0 -1.0 0.0 vn 1.0 0.0 0.0 vn -1.0 0.0 0.0
vt 0.0 0.0 vt 1.0 0.0 vt 1.0 1.0 vt 0.0 1.0
#前面1-2-3-4
g posz_map usemtl posz_map
f 1/1/1 2/2/1 3/3/6 4/4/1
#后面5-6-7-8
g negz_map usemtl negz_map
f 5/1/2 6/2/2 7/3/2 8/4/2
#上面4-3-6-7
g posy_map usemtl posz_map
f 4/1/3 3/2/3 6/3/3 7/4/3
#下面2-1-8-5
g negy_map usemtl negy_map
f 2/1/4 1/2/4 8/3/4 5/4/4
#右面2-5-6-3
g posx_map usemtl posx_map
f 2/1/5 5/2/5 6/3/5 3/4/5
#左面8-1-4-7 g negx_map
usemtl negx_map f 8/1/6 1/2/6 4/3/6 7/4/6 a.mtl
newmtl posx_map
Ka 0.968600 0.968600 0.968600 Kd 0.968600 0.968600 0.968600 Ks 0.900000 0.900000 0.900000 map_Kd X_POSITVIE_PIC.jpg
newmtl negx_map
Ka 0.968600 0.968600 0.968600 Kd 0.968600 0.968600 0.968600 Ks 0.900000 0.900000 0.900000 map_Kd X_NEGATIVE_PIC.jpg
newmtl posy_map
Ka 0.968600 0.968600 0.968600 Kd 0.968600 0.968600 0.968600 Ks 0.900000 0.900000 0.900000 map_Kd Y_POSITIVE_PIC.jpg
newmtl negy_map
Ka 0.968600 0.968600 0.968600 Kd 0.968600 0.968600 0.968600 Ks 0.900000 0.900000 0.900000 map_Kd Y_NEGATIVE_PIC.jpg
newmtl posz_map
Ka 0.968600 0.968600 0.968600 Kd 0.968600 0.968600 0.968600 Ks 0.900000 0.900000 0.900000
map_Kd Z_POSITIVE_PIC.jpg
newmtl negz_map
Ka 0.968600 0.968600 0.968600 Kd 0.968600 0.968600 0.968600 Ks 0.900000 0.900000 0.900000 map_Kd Z_NEGATIVE_PIC.jpg 12、在一个坐标系W中,设模型为一个以(5.0, 0.0, 0.0), (0.0, 5.0, 0.0), (0.0, 0.0, 5.0)为三个点的三角形,现在把照相机按照下列方式设置:
照相机位置设为:(0.0, 0.0, 100.0),看向的目标点为 (0.0, 0.0, 0.0) ,照相机的up方向为(0.0, 1.0, 0.0)
投影为透视投影,竖直张角为60度
取景范围为沿照相机的朝向距离从0.1 到300
现需要把照相机看到的图片放在一个400x300像素分辨率的窗口的右上部分,该部分起始点为 (100, 100), 宽度为200,高度为200 (1)请写出用OpenGL函数表示的照相机设置。 (2)写出视区(viewport)的设置函数。 (3)写出投影变换的设置函数。
(4)求出从坐标系W到照相机坐标系(视点坐标系)的4x4的变换矩阵。 答:
1. gluLookAt(0.0,0.0, 100.0,0.0,0.0,0.0,0.0,1.0,0.0); 2. glViewport (100, 100, 200, 200);
3. gluPerspective(60.0f,1.0f,0.1f,300.0f); 4. 变换矩阵为:
[ 1 0 0 0 0 1 0 0 0 0 1 -100 0 0 0 1 ]
void reshape () {
glViewport (100, 100,200, 200);
glMatrixMode (GL_PROJECTION); glLoadIdentity ();
gluPerspective(60.0, 1.0, 0.1, 300.0);
glMatrixMode(GL_MODELVIEW); glLoadIdentity();
gluLookAt (0.0, 0.0, 100.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); }
13、分析下面的程序并计算在下面的例子中,计算对应○1○2○3○4四个顶点所对应的四边形上的一个点(-1.0, 0.5, 0.0)对应的纹理坐标是多少?按照最近邻域滤波方法,该点对应的颜色是什么? /* Create checkerboard texture */ #define checkImageWidth 64 #define checkImageHeight 64
static GLubyte checkImage[checkImageHeight][checkImageWidth][4];
#ifdef GL_VERSION_1_1 static GLuint texName; #endif
void makeCheckImage(void) {
int i, j, c;
for (i = 0; i < checkImageHeight; i++) { for (j = 0; j < checkImageWidth; j++) {
c = ((((i&0x8)==0)^((j&0x8))==0))*255; checkImage[i][j][0] = (GLubyte) c; checkImage[i][j][1] = (GLubyte) c; checkImage[i][j][2] = (GLubyte) c; checkImage[i][j][3] = (GLubyte) 255; } } }
void init(void) {
glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); glEnable(GL_DEPTH_TEST);
makeCheckImage();
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
#ifdef GL_VERSION_1_1
glGenTextures(1, &texName);
glBindTexture(GL_TEXTURE_2D, texName); #endif
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
#ifdef GL_VERSION_1_1
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight,
0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage); #else
glTexImage2D(GL_TEXTURE_2D, 0, 4, checkImageWidth, checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage); #endif }
void display(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); #ifdef GL_VERSION_1_1
glBindTexture(GL_TEXTURE_2D, texName); #endif
glBegin(GL_QUADS);
○1glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0); ○2glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0); ○3glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0); ○4glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0);
glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0); glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(2.41421, 1.0, -1.41421); glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421); glEnd(); glFlush();
glDisable(GL_TEXTURE_2D); }
void reshape(int w, int h) {
glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity();
gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 30.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();
glTranslatef(0.0, 0.0, -3.6); }
void keyboard (unsigned char key, int x, int y) {
switch (key) { case 27: exit(0); break; default: break; } }
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(250, 250); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); init();
glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; } 答:
(0.5,0.75)*64=(32,48)
c = ((((32&0x8)==0)^((48&0x8))==0))*255 =( (0= =0)^(0= =0))*255 =0
颜色为(0,0,0,255)黑色