c++OpenGL的旋转和计算
c++ OpenGL rotations and calculations
在OpenGL项目中,我有一个旋转模型的函数:
glRotatef(M_PI/4, 0, 0, 1);
//旋转PI/4弧度,即45度
现在,当我画点(0, 1)
相对于旋转。我将在点(1/sqrt(2),1/sqrt),这只是单位圆几何。但是,这些点将使用可变坐标x1, x2, y1, y2
绘制。此外,我希望在我的近似值足够接近后停止绘制。
问题是,我的停止标准仍然是全局坐标,而不是旋转。例如,考虑y2=y1,其中方程考虑变换。因此,在全局坐标中,这将只是y2=y1*sin(pi/4),因此y2将更低并且在y1的右边。然而,y2的值只是被设置为y1,这在我的停止标准y2-y1中产生了一个问题,然后它将为零。
如何从OpenGL获得y2的旋转值
如果使用OpenGL中的glRotatef
,请不要忘记旋转角度是以度为单位,而不是以弧度为单位!!!
对于转换和混淆部分,user1118321是绝对正确的。
我认为就你的目的而言,你只需要应用GL_MODELVIEW_MATRIX
若需要模型空间中的坐标,必须将逆modelview矩阵乘以全局坐标向量。
若需要全局空间中的坐标,则必须将模型视图矩阵乘以模型坐标向量。
顶点发送的坐标在模型空间中使用gl函数glGetFlotav/glGetDoublev
可以获得实际的模型视图矩阵
double m[16];
glGetDoublev(GL_MODELVIEW_MATRIX,m);
OpenGL中不存在逆矩阵和矩阵x矢量乘法,因此您必须自己编写代码或使用一些库。不要忘记OpenGL中的矩阵是面向列的,而不是面向行的,并且坐标向量是均匀的,因此x,y,z,w
中的w=1
适用于您的目的。这是我用于OpenGL子计算的代码,所有向量都是double[4]
,矩阵是double[16]
void matrix_mul_vector(double *c,double *a,double *b)
{
double q[3];
q[0]=(a[ 0]*b[0])+(a[ 4]*b[1])+(a[ 8]*b[2])+(a[12]);
q[1]=(a[ 1]*b[0])+(a[ 5]*b[1])+(a[ 9]*b[2])+(a[13]);
q[2]=(a[ 2]*b[0])+(a[ 6]*b[1])+(a[10]*b[2])+(a[14]);
for(int i=0;i<3;i++) c[i]=q[i];
}
void matrix_subdet (double *c,double *a)
{
double q[16];
int i,j;
for (i=0;i<4;i++)
for (j=0;j<4;j++)
q[j+(i<<2)]=matrix_subdet(a,i,j);
for (i=0;i<16;i++) c[i]=q[i];
}
double matrix_subdet ( double *a,int r,int s)
{
double c,q[9];
int i,j,k;
k=0; // q = sub matrix
for (j=0;j<4;j++)
if (j!=s)
for (i=0;i<4;i++)
if (i!=r)
{
q[k]=a[i+(j<<2)];
k++;
}
c=0;
c+=q[0]*q[4]*q[8];
c+=q[1]*q[5]*q[6];
c+=q[2]*q[3]*q[7];
c-=q[0]*q[5]*q[7];
c-=q[1]*q[3]*q[8];
c-=q[2]*q[4]*q[6];
if (int((r+s)&1)) c=-c; // add signum
return c;
}
double matrix_det ( double *a)
{
double c=0;
c+=a[ 0]*matrix_subdet(a,0,0);
c+=a[ 4]*matrix_subdet(a,0,1);
c+=a[ 8]*matrix_subdet(a,0,2);
c+=a[12]*matrix_subdet(a,0,3);
return c;
}
double matrix_det ( double *a,double *b)
{
double c=0;
c+=a[ 0]*b[ 0];
c+=a[ 4]*b[ 1];
c+=a[ 8]*b[ 2];
c+=a[12]*b[ 3];
return c;
}
void matrix_inv (double *c,double *a)
{
double d[16],D;
matrix_subdet(d,a);
D=matrix_det(a,d);
if (D) D=1.0/D;
for (int i=0;i<16;i++) c[i]=d[i]*D;
}
有关更多信息,请参阅:
- 理解4x4齐次变换矩阵
您的问题有点令人困惑,因为我不明白您所说的停止标准是什么意思。但是,如果你想获得点的变换值,那么你可以简单地通过适当的变换矩阵将它们传递到你想要的空间中。例如,如果要在眼睛空间中显示值,请通过模型视图矩阵传递顶点坐标。请参阅此处了解其工作原理的详细信息。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- 如何有效地计算将单位立方体映射到自身的反射和旋转?
- 如何使用增强::几何计算多边形的旋转固体体积?
- 给定方向和位置如何使用 GLM 计算旋转矩阵
- 快速计算变换/旋转马里克斯4x4
- 在Qt5的OpenGL绘图中通过鼠标移动计算对象旋转角度
- 如何从OpenCV rvecs计算旋转角度
- OpenCV 计算相机位置和旋转
- c++:旋转锁或互斥对象比较(简单计算)
- 对象旋转/平移后重新计算AABB正确
- 从盒子计算 AABB(中心、半大小、旋转)
- 如何使用OpenCV计算两帧之间的旋转平移矩阵
- 如何在三维空间中计算旋转碰撞
- obb旋转计算
- c++OpenGL的旋转和计算
- 我们如何计算旋转和平移两个立体相机在opencv StereoRectify(r,t自变量)中使用
- 如何计算基于方向向量的旋转矩阵
- 计算旋转直线的反弹角度
- 如何在平移/旋转后重新计算轴对齐的边界框