首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL中的左手计算

OpenGL中的左手计算
EN

Stack Overflow用户
提问于 2011-08-26 09:58:56
回答 2查看 995关注 0票数 0

在中断两年后,我又回到了世界游戏编程领域。不幸的是,我关于3D数学的大部分知识都相当生疏。所以请耐心听我说。

我的引擎和游戏最初是为DirectX设计的,这是一个使用行主矩阵结构的左手系统。我的数学代码完全是自制的,在这个系统的范围内工作得很好。我想给我的游戏一个OpenGL渲染器。由于我所有的数学运算都使用左撇子、行为主的矩阵系统(例如,创建投影矩阵),那么将我的数学移植到OpenGL的左撇子、列主系统会有多难?

这是转置矩阵并将值粘贴到以列为主的结构中吗?或者我是不是太过简单化了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-26 10:15:45

那得看情况。我们谈论的是基于着色器的OpenGL还是固定函数(FF)?

在FF领域,您需要做的是使用gluPerspective (或glFrustum)生成透视矩阵,使用与D3D下的代码类似的参数。然后,您需要转置将为D3D计算的矩阵(省略计算的投影部分),以使列为主,这是glLoad/MultMatrix想要的方式。

然后,您需要生成一个矩阵来翻转场景,并将其放在GL_MODELVIEW堆栈的最底部。要弄清楚要做什么,最简单的方法就是渲染所有内容,然后看看世界是如何反转的。然后在那里粘贴一个矩阵,它沿着一个轴进行求反;如果修复了它,你就完成了。

在伪代码中,您要做的是:

代码语言:javascript
复制
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(/*Projection parameters here*/);

glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(/*Your flip matrix here*/);
glPushMatrix();

//Render your stuff here.
//When rendering an object:
Matrix mat = ComputeD3DModelToCameraMatrixForObject();
mat = Transpose(mat);
glPushMatrix();
glMultMatrixf(GetMatrixAsFloatArray(mat));
//Draw the object.
glPopMatrix();

//When finished rendering stuff:
glPopMatrix();

在着色器中,事情更简单。这里假设您使用自己的制服将矩阵传递给GLSL。

实际上,您所需要做的就是查看OpenGL使用的剪辑空间和D3D使用的剪辑空间之间的差异。Clip-space是从顶点着色器输出的顶点位置的空间。您可以像往常一样将矩阵传递给GLSL,因为glUniformMatrix函数有一个参数,允许您指定矩阵是否被转置(行较大)。像计算D3D一样计算D3D剪辑空间位置后,只需根据OpenGL的预期修改结果即可。

我不记得当时有什么不同,但是OpenGL规范2.13节(在3.3版本中,对于其他版本可能是不同的部分)非常明确地详细描述了预期的坐标系,以及后续到窗口空间的转换。

票数 1
EN

Stack Overflow用户

发布于 2011-08-26 16:26:31

您可以查看以下内容:

http://www.opengl.org/wiki/Viewing_and_Transformations#Can_I_make_OpenGL_use_a_left-handed_coordinate_space.3F

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

https://stackoverflow.com/questions/7199291

复制
相关文章

相似问题

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