OpenGL转换

its*_*ing 3 c++ opengl

我有一个对象,比如x,y,z就原点而言.
我想对点应用一些变换,比如旋转和平移,并在变换点渲染对象.我正在使用glTranslatef()glRotatef()功能.它看起来像这样:

glTranslatef(x,y,z); 
glRotatef(Ang,0,1,0); // rotated around Y axis at an arbitrary angle
glTranslatef(xt,yt,zt); // further translation
<render the object>
Run Code Online (Sandbox Code Playgroud)

即使它使我免于复杂的矩阵变换操作,我也不知道最终位置相对于原点的实际坐标值.有没有一种方法可以在不经过矩阵运算的情况下检索变换点的实际位置坐标?

Vyk*_*tor 13

我先给你一些理论.OpenGL使用矩阵4x4和矢量(点坐标),长度为4(3D).

我们有一个向量X = (x,y,z,1).我希望你知道如何乘法矩阵.让我们说你要翻译你的观点 .要做到这一点,你需要建立这样的翻译矩阵:V = (vx,vy,vz)

翻译矩阵

你将乘以两个矩阵(矩阵*向量/点)Y = TX:

通过矩阵翻译

这么复杂(而不仅仅是添加X + V)这样做的原因是你可以通过用不同的值填充相同的矩阵来围绕轴旋转你的点.它被称为旋转矩阵:

旋转矩阵

最好的部分是你可以链接那些矩阵.当你需要用这些规则绘制点时:

  • 翻译 T1
  • 旋转 R1
  • 翻译 T2

您可以准备一个矩阵,它将立即完成所有工作: F = T1R1T2

然后立即应用所有这些转换:Y = FX.

请注意矩阵乘法不是可交换的,所以顺序很重要.

OpenGL在内部使用那些矩阵(比较矩阵的类型更少).您可以使用命令获取当前转换矩阵(示例来自此处):

glGetDoublev(GL_MODELVIEW_MATRIX, redTransformationMatrix);
Run Code Online (Sandbox Code Playgroud)

下面是如何正确地表示这些数据(详细信息点击这里):

在此输入图像描述

除最后一张之外的所有图像均来自wikipedia.org