首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将SDL窗口调整为从Wavefront OBJ文件生成的OpenGL对象。

将SDL窗口调整为从Wavefront OBJ文件生成的OpenGL对象。
EN

Stack Overflow用户
提问于 2016-05-13 10:18:28
回答 1查看 355关注 0票数 3

我对OpenGL,SDL和OBJ-文件都很陌生,并且已经和一个问题斗争了很多天了。

  1. 设置SDL窗口(我已经删除了基本的SDL东西) sdl_window = SDL_CreateWindow( "Viewer",SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,1024,768,SDL_WINDOW_OPENGL欧元/ SDL_WINDOW_RESIZABLE );if( sdl_window == NULL ) printf("SDL_CreateWindow failed:%s\n",SDL_GetError());SDL_GLContext glContext = SDL_GL_CreateContext( sdl_window );if( glContext == NULL ) printf("SDL_GL_CreateContext failed:%s\n",SDL_GetError( );SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER,1);
  2. 启动OpenGL功能(其中" OBJ“是我解析OBJ和加载纹理的类) my_object;objloader;glClearColor( 0.5f,0.5f,0.5f,1.0f );glViewport( 0,0,1024,768 );glMatrixMode( GL_PROJECTION );glLoadIdentity();gluPerspective( 45,1024.0/768.0,1.0,500.0 );//glOrtho( 0,512,384,0,-1,1 );glMatrixMode( GL_MODELVIEW );glEnable( GL_DEPTH_TEST );my_object = obj.load( "D:\myfile.obj“);glEnable( GL_LIGHTING );glEnable( GL_LIGHT0 );浮子col[] = {1.0,1.0,1.0,1.0};glLightfv( GL_LIGHT0,GL_DIFFUSE,GL_LIGHT0 );
  3. 看一下OBJ档案.(其中没有vn -法线) mtllib ./test.mtl usemtl Haufwerk v -0.388155 5.580893 2.490415 v -0.336669 5.566026 2.507601 v -0.408834 2.533414 v -0.403397 5.444500 2.540850 v -0.482161 5.577362 2.447329。。V -0.533898 5.328258 1.909646 v -0.439773 5.344517 1.849366 vt 0.710938 0.273924 vt 0.711743 0.270957 0.277021 vt 0.713371 0.278851 vt 0.711261 0.303822。。0.687021 vt 0.841930 0.687169 f 5616/687 5617/688 4642/686 f 5617/691 5618/692 4642/690 f 5616/687 4642/686 5618/689 f 5617/688 5616/687 5618/689 f 12657/633 12659/634 13191/637。。。
  4. 纹理以BMP文件的形式提供,分辨率为1024x1024。

OBJ纹理图像:

  1. 运行显示循环 同时(运行){ start = SDL_GetTicks();while( SDL_PollEvent(&event) ){ switch(event.type) { case SDL_QUIT: running = false;break;} glClear( GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT );glLoadIdentity();浮动pos[] = {- 1.0,1.0,-2.0,1.0};glLightfv( GL_LIGHT0,GL_POSITION,pos );//glScalef( 1.f,1.f,1.f );glTranslatef(0.0,-30.0,-20.0);//glTranslatef( 10.0,10.0,-50.0 );//glTranslatef( 0.0,1.0,-19.5 );glCallList( myobject );//并显示它为SDL_GL_SwapWindow( sdl_window );if( 1000/30 > (SDL_GetTicks() - start) ) SDL_Delay( 1000/30 - (SDL_GetTicks() - start) );}
  2. ...comes对此结果:

结果:OpenGL-SDL中的对象-窗口:

以下图片是将一条显示代码行更改为:

代码语言:javascript
运行
复制
    glTranslatef( 0.0, 1.0, -19.5 );

我的目标是“适合”"OpenGL“(它叫.)。模特?Framebuffer?对象?)进入SDL窗口的边界。或者可能“调整”SDL窗口到OpenGL对象的大小。为什么?因为在下一个步骤中,我将把整个SDL窗口“导出”到一个位图中,该位图将被用作地理信息系统软件中的数字化背景,用于地理参照。

我是否必须更改视图设置,还是有可能“抓取”OpenGL对象的大小以适应SDL主窗口?

例如,如果我将显示代码中的一行更改为:

代码语言:javascript
运行
复制
    glTranslatef( 0.0, 1.0, -19.5 );

OBJ文件中顶点"v“的”坐标“到底是什么?他们拥有哪一个“测量单位”?这是当地的土狼吗?

什么是纹理OpenGL对象“像素大小”(因为纹理模板的像素大小是1024x1024)?

我从在线教程中学到的许多代码,但我不确定它们对我的屏幕有什么影响。我对所有改变观点的可能性太困惑了。

所以任何帮助都是非常感谢的。这让我睡眠不好..。

EN

回答 1

Stack Overflow用户

发布于 2016-05-13 16:16:30

可以这样做的一种方法是,找到对象尺寸(遍历所有像素并确定每个轴上的最小值和最大值),在该深度找到对象相对于摄像机视点和视点的深度。最后,您可以找到应用于对象的最佳比例,以便它覆盖整个屏幕。

但这很复杂。它将更容易利用一个正交投影,然后“玩”与你的对象的规模。您仍然可以找到我前面提到的对象维度,这样可以直接做到这一点。使用这些:

代码语言:javascript
运行
复制
glOrtho( -512, 512, -384, 384, -16, 16 );

// Remove the translations you were applying to your object
glScalef( 100.0f, 100.0f, 1.0f );

这应该允许您看到您的对象与一个正交投影。从这里开始,你应该能够调整标度值,直到你得到你想要的。

你能解释一下"Z“值吗?

首先这是我的错。它不完全是Z值,而是深度值。

默认情况下,当您在OpenGL中指定一个视图卷时,无论是使用正投影还是透视投影,“照相机”都会朝负Z轴的方向看。您可以使用lookAt函数更改方向,但在您的示例中没有更改,因此得到了默认的视图方向。由于这个原因,你经常会看到Z深度被使用。

正投影定义了立方体/棱镜的观看量,其效果是所有物体,无论离观看者有多远,都会以相同的比例出现。glOrtho函数的最后2个参数是nearfar值,定义了查看卷的深度。在我提出的评论中,我使用:

代码语言:javascript
运行
复制
glOrtho( -512, 512, -384, 384, -16, 16 )

由于默认情况下,相机是朝负Z方向看,以0为中心,我们可以看到体积内的物体的相对深度为-16,16。也就是说:

|-16 * (0,0,-1)| = 16的接近值和|16 * (0,0,-1)| = -16的远值处。

OBJ文件中顶点"v“的”坐标“到底是什么?

很可能它们位于对象坐标(对象空间)中,它定义了每个顶点相对于对象本身的位置,其原点为0,0,0。是的,物体的局部坐标系。当您将转换应用到对象(即翻译)时,结果值将位于世界坐标(world space)中。

我是否必须更改视图设置,还是有可能“抓取”OpenGL对象的大小以适应SDL主窗口?

这得由你来决定。但它可能更有意义的缩放你的对象,以适应窗口,而不是相反。我给你演示了一种缩放物体的方法。

什么是纹理OpenGL对象“像素大小”(因为纹理模板的像素大小是1024x1024)?

当提到纹理像素时,我们称之为纹理像素。但我不明白你在问什么。

(它叫.?模特?Framebuffer?对象?)

我猜你指的是用纹理绘制的3D对象/模型。请参见默认帧缓冲区帧缓冲区以确保。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37207415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档