我需要一些关于OpenGL中旋转任务的最佳方法的指针.我知道如何使用四元数在3D空间中旋转对象,我可以翻译它们,一切都很好.
但我想知道将不同对象的集合视为单个实体以进行旋转的最佳方法.例如,假设您有一个桌子上有对象.每个都有自己的平移和旋转,但现在我想旋转整个桌子及其上的所有东西,同时保持房间里的其他物体.这意味着桌子外边缘上的物体将会旋转并且也会围绕桌子的中心进行平移,而中心处的物体可能只是旋转但是保持在原位,或者根本不会转换到它们的距离.旋转轴.
似乎这样做的一种相当不优雅的方法是单独旋转和翻译桌面上的每个对象,以及桌子本身,知道旋转轴的位置.也许这是唯一的好方法,但有没有一种技术可以为此目的"分组"不同的对象?
这不是一个主要的vs列主要问题.这是基于矩阵乘法的关联属性的与性能相关的计算问题的顺序:A(BC)=(AB)C
如果我有两个矩阵,A和B一个向量v,我想以一定的顺序将它们相乘,例如ABv,我可以做(AB)v或A(Bv).
我以编程方式向我发现,如果我使用第二种方法并且总是将矩阵与向量相乘,那么从更少的计算中我可以获得更好的性能.
例如,如果我们处理4x4矩阵:
AB 结果是16个单独的计算,一个新的矩阵,每个结果来自一个点积
Matrix*vector 得到4个计算,每个计算来自一个点积
因此:
(AB)v 是16 + 4点积计算= 20
A(Bv) 是两个矩阵向量积,或4 + 4点积计算= 8
我在想什么?这表明,如果我每次都使用向量,那么执行许多这样的矢量矩阵表达式会显着提高性能吗?
因此,构造一个基于向量*矩阵从左到右计算顺序执行的矩阵库是有意义的(即使你选择用列主格式标记从右到左),因为向量与矩阵乘积相乘是在图形中很常见.
我需要一些帮助来理解视锥体转换的基础知识.主要是,深度如何运作.
以下使用768x1024的视口.使用正交投影和768x768的正方形(z默认为0),没有平移或缩放,并且glViewport(0, 0, 768, 1024)此正方形的视口可以轻松填充框架的宽度:

现在,当我将项目更改为平截头体并混淆z平移时,由于透视变化,正方形会适当缩放.
在这样的环境中,这是同一个方块:

我可以使用这个z平移,以及平截头体矩阵的近和远参数,并相应地使方形变化明显在屏幕尺寸上.精细.
但我无法弄清楚它的屏幕尺寸和这些深度参数之间的明显关系.
例如,假设我想使用平截头体但是正方形填充框架宽度,如上面的第一个示例图像中所示.怎么做到这一点?
我认为如果z平移与near平面相匹配,那么你基本上就会有一个"正好在镜头前",填充框架.但我无法想办法实现这一目标.如果我的近距离1和我的z平移是-1,那么正方形应该坐在近平面本身(右边?!),填充框架的宽度(截锥体的左右平面与正交投影相同) .
我可以在这里粘贴一堆代码来展示我正在做的事情,但我认为这里的概念很清楚.我只想弄清楚近处飞机的实际位置,如何在其上放置一些东西,因为这将有助于我理解截头体是如何工作的.
好的,这是我正在使用的相关代码,在哪里width=768和height=1024.
我的顶点着色器很简单 gl_Position=Projection*Modelview*Position;
我的投影矩阵(视锥体)因此是:
Frustum(-width/2, width/2, -height/2, height/2, 1,10);
这个功能是:
static Matrix4<T> Frustum(T left, T right, T bottom, T top, T near, T far)
{
T a = 2 * near / (right - left);
T b = 2 * near / (top - bottom);
T c = (right + left) / (right …Run Code Online (Sandbox Code Playgroud)