我从事游戏引擎开发已有一段时间了。我从仅使用 SDL 的 2D 图形开始,但我已经通过使用 OpenGL 慢慢转向 3D 功能。我看到的大多数关于“如何完成工作”的文档都使用了 GLUT,但我没有使用它。
问题是我如何在 OpenGL 中创建一个可以在 3D 环境中移动并正确显示 3D 模型和 Sprite (例如,具有固定位置和旋转的 Sprite )的“相机”。为了在 OpenGL 相机中设置相机,我应该关注哪些函数以及它们应该以什么顺序调用?
以下是一些背景信息,说明了我为什么想要一台真正的相机。
为了绘制一个简单的 Sprite ,我从 SDL 表面创建了一个 GL 纹理,然后将其绘制到坐标为 (SpriteX-CameraX) 和 (SpriteY-CameraY) 的屏幕上。这工作正常,但当转向实际的 3D 模型时,它工作得不太好。相机位置是一个自定义 vector 类(即不使用标准库),具有 X、Y、Z 整数分量。
我有一个由三角形组成的 3D 立方体,我可以单独绘制它并旋转它,实际上我可以通过在绘制模型时传入相机位置来四处移动立方体(尽管以一种笨拙的方式)使用位置 vector 的分量来计算模型位置。但是,当我去旋转模型时,这种方法的问题变得很明显。模型的起源不是模型本身,而是屏幕的起源。一些谷歌搜索告诉我我需要保存模型的位置,围绕原点旋转它,然后将模型恢复到其原始位置。
与其传递我的相机的位置并通过计算新顶点来计算应该在视口(viewport)中绘制的位置,我想我会创建一个 OpenGL“相机”来为我做这件事,所以我需要做的一切将我的相机对象的坐标传递到 OpenGL 相机中,它会自动转换 View 。如果您使用 GLUT,此任务似乎非常容易,但我不确定如何仅使用 OpenGL 设置相机。
编辑 #1(经过一些评论): 根据一些建议,这是在我的程序中调用的更新方法。它已更新以创建透视和 View 矩阵。所有绘图都发生在这被调用之前。并且在 OpenGL 执行时会执行一组类似的方法(减去缓冲区交换)。 x,y,z 坐标直接是 Camera 的一个实例及其位置 vector 。如果相机位于 (256, 32, 0),则 256、32 和 0 将被传递到 Update 方法中。目前,z 设置为 0,因为目前无法更改该值。正在绘制的 3D 模型是一组顶点/三角形 + 位置 X=320、Y=240、Z=-128 的法线。当程序运行时,这就是FILL中绘制的内容模式,然后在 LINE模式和另一个在 FILL after movement ,当我将相机向右移动一点时。看起来法线可能是原因,但我认为这与我遗漏了一些极其重要的东西或没有完全理解 glFrustum 的 NEAR 和 FAR 参数实际作用有关。
在我实现这些更改之前,我使用的是 glOrtho 并且立方体渲染正确。现在,如果我切换回 glOrtho,一张脸呈现(绿色)并且旋转非常奇怪 - 可能是由于平移。立方体有 6 种不同的颜色,每边一种。红色、蓝色、绿色、青色、白色和紫色。
int VideoWindow::Update(double x, double y, double z)
{
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glFrustum(0.0f, GetWidth(), GetHeight(), 0.0f, 32.0f, 192.0f);
glMatrixMode( GL_MODELVIEW );
SDL_GL_SwapBuffers();
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glRotatef(0, 1.0f, 0.0f, 0.0f);
glRotatef(0, 0.0f, 1.0f, 0.0f);
glRotatef(0, 0.0f, 0.0f, 1.0f);
glTranslated(-x, -y, 0);
return 0;
}
编辑决赛: 问题原来是 glFrustum 的 Near 和 Far 参数以及 glTranslated 的 Z 值的问题。虽然更改值已修复它,但我可能需要更多地了解这两个函数之间的关系。
最佳答案
您需要一个 View 矩阵和一个投影矩阵。您可以选择以下两种方式之一:
在使用自己的库计算矩阵后,使用 glMatrixMode() 和 glLoadMatrixf() 自行加载矩阵。
使用 glMatrixMode(GL_MODELVIEW) 和 glTranslate()/glRotate() 的组合来创建您的 View 矩阵,并且 glMatrixMode(GL_PROJECTION) 和 glFrustum() 来创建您的投影矩阵。请记住 - 您的 View 矩阵是相机位置的负平移(因为它是您应该将 world 移动到相对于相机原点的位置),以及应用的任何旋转(俯仰/偏航)。
希望这对您有所帮助,如果我有更多时间,我会给您写一个合适的示例!
关于c++ - 在 OpenGL 中设置相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1672926/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
路由有如下代码:resources:orders,only:[:create],defaults:{format:'json'}resources:users,only:[:create,:update],defaults:{format:'json'}resources:delivery_types,only:[:index],defaults:{format:'json'}resources:time_corrections,only:[:index],defaults:{format:'json'}是否可以使用1个字符串为所有资源设置默认格式,每行不带“默认值”散列?谢谢。
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=
出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t
最近我安装了Paperclipgem,我正在努力让默认图像在我的系统上工作,我将图像文件放在assets/images/pic.png中。这是我的模型User中的代码:has_attached_file:pic,:styles=>{:medium=>"300x300>",:thumb=>"100x100>"},:default_url=>'missing_:avatar.png'#:default_url=>'assets/images/avatar.png'has_attached_file:attach这是我的AddPicPaperClip迁移中的代码:defself.upadd_