如何在OpenGL中实现图形的原地旋转和旋转状态下的移动?

如何在OpenGL中实现图形的原地旋转和旋转状态下的移动?,opengl,rotation,move,translate,coordinate-transformation,Opengl,Rotation,Move,Translate,Coordinate Transformation,如何实现形状的原地旋转和旋转状态下的移动? 我想将旋转的形状移向我看到的屏幕的x轴和y轴 按下该键时,我已使形状沿x轴和y轴方向移动。 但我不能按我想的方式移动。真奇怪。 如何设置代码以按我想要的方式移动? 我现在就把密码挂起来 glTranslatef(2.5 + puzX1, 2 + puzY1, 0); glRotatef(100, 0.0, 0.0, 1.0); glRotatef(puzang1, 0.0, 0.0, 1.0); glTranslatef(-2.5+puzX1, -2+

如何实现形状的原地旋转和旋转状态下的移动? 我想将旋转的形状移向我看到的屏幕的x轴和y轴

按下该键时,我已使形状沿x轴和y轴方向移动。 但我不能按我想的方式移动。真奇怪。 如何设置代码以按我想要的方式移动? 我现在就把密码挂起来

glTranslatef(2.5 + puzX1, 2 + puzY1, 0);
glRotatef(100, 0.0, 0.0, 1.0);
glRotatef(puzang1, 0.0, 0.0, 1.0);
glTranslatef(-2.5+puzX1, -2+puzY1, 0); 
我写代码是为了让它旋转到位

代码顶部和底部的代码是移动到形状中心然后将其返回到其位置的代码

我应该补充什么? 应该修改哪个部分

我不擅长英语。 我很抱歉
你能帮我吗?

注意,由
glBegin
/
glEnd
序列绘制的固定函数管道矩阵堆栈几十年来一直被弃用。 阅读并查看和,了解最先进的渲染方式


如何在适当的位置实现形状的旋转

如果阴影应在其局部轴上旋转,则必须在平移之前进行旋转。在代码中,这意味着旋转指令必须在平移指令之后:

glTranslatef(2.5 + puzX1, 2 + puzY1, 0);
glRotatef(puzang1, 0.0, 0.0, 1.0);
glRotatef(100, 0.0, 0.0, 1.0);
另见


说明:

翻译:见以下文件:

glTranslate
通过
x y z
生成翻译。当前矩阵(请参见
glMatrixMode
)乘以此转换矩阵,乘积替换当前矩阵

轮换:见以下文件:

glRotate
围绕向量
x y z
产生角度旋转。当前矩阵(请参见
glMatrixMode
)乘以旋转矩阵,用乘积替换当前矩阵


转换矩阵如下所示:

Matrix4x4 translate;

translate[0] : ( 1,  0,  0,  0 )
translate[1] : ( 0,  1,  0,  0 )
translate[2] : ( 0,  0,  1,  0 )
translate[3] : ( tx, ty, tz, 1 )
Matrix4x4  rotate;
float      angle;

rotate[0] : ( cos(angle),  sin(angle), 0, 0 )
rotate[1] : ( -sin(angle), cos(angle), 0, 0 )
rotate[2] : ( 0,           0,          1, 0 )
rotate[3] : ( 0,           0,          0, 1 )   
绕Z轴的旋转矩阵如下所示:

Matrix4x4 translate;

translate[0] : ( 1,  0,  0,  0 )
translate[1] : ( 0,  1,  0,  0 )
translate[2] : ( 0,  0,  1,  0 )
translate[3] : ( tx, ty, tz, 1 )
Matrix4x4  rotate;
float      angle;

rotate[0] : ( cos(angle),  sin(angle), 0, 0 )
rotate[1] : ( -sin(angle), cos(angle), 0, 0 )
rotate[2] : ( 0,           0,          1, 0 )
rotate[3] : ( 0,           0,          0, 1 )   

translate*rotate
的结果如下:

glTranslate( ..... );
glRotate( ..... );


rotate*translate
的结果是:

glRotate( ..... );
glTranslate( ..... );


注意,由
glBegin
/
glEnd
序列绘制的固定功能管道矩阵堆栈几十年来一直被弃用。 阅读并查看和,了解最先进的渲染方式


如何在适当的位置实现形状的旋转

如果阴影应在其局部轴上旋转,则必须在平移之前进行旋转。在代码中,这意味着旋转指令必须在平移指令之后:

glTranslatef(2.5 + puzX1, 2 + puzY1, 0);
glRotatef(puzang1, 0.0, 0.0, 1.0);
glRotatef(100, 0.0, 0.0, 1.0);
另见


说明:

翻译:见以下文件:

glTranslate
通过
x y z
生成翻译。当前矩阵(请参见
glMatrixMode
)乘以此转换矩阵,乘积替换当前矩阵

轮换:见以下文件:

glRotate
围绕向量
x y z
产生角度旋转。当前矩阵(请参见
glMatrixMode
)乘以旋转矩阵,用乘积替换当前矩阵


转换矩阵如下所示:

Matrix4x4 translate;

translate[0] : ( 1,  0,  0,  0 )
translate[1] : ( 0,  1,  0,  0 )
translate[2] : ( 0,  0,  1,  0 )
translate[3] : ( tx, ty, tz, 1 )
Matrix4x4  rotate;
float      angle;

rotate[0] : ( cos(angle),  sin(angle), 0, 0 )
rotate[1] : ( -sin(angle), cos(angle), 0, 0 )
rotate[2] : ( 0,           0,          1, 0 )
rotate[3] : ( 0,           0,          0, 1 )   
绕Z轴的旋转矩阵如下所示:

Matrix4x4 translate;

translate[0] : ( 1,  0,  0,  0 )
translate[1] : ( 0,  1,  0,  0 )
translate[2] : ( 0,  0,  1,  0 )
translate[3] : ( tx, ty, tz, 1 )
Matrix4x4  rotate;
float      angle;

rotate[0] : ( cos(angle),  sin(angle), 0, 0 )
rotate[1] : ( -sin(angle), cos(angle), 0, 0 )
rotate[2] : ( 0,           0,          1, 0 )
rotate[3] : ( 0,           0,          0, 1 )   

translate*rotate
的结果如下:

glTranslate( ..... );
glRotate( ..... );


rotate*translate
的结果是:

glRotate( ..... );
glTranslate( ..... );