gpt4 book ai didi

c++ - 如何在其中心旋转二维对象

转载 作者:行者123 更新时间:2023-11-30 04:23:27 25 4
gpt4 key购买 nike

float carX   = 0.0;
float carY = 0.0;
float carSpeed = 1.0;
float direction = 0.0;
bool exhaust;



void reshape(void)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 10.0, 0, 10.0, 0.0, 10.0);
glMatrixMode(GL_MODELVIEW);
}

void keys(int key, int x, int y){


if(key == GLUT_KEY_UP){
carY = carY + carSpeed;
direction = 0.0;
glutPostRedisplay();
}
if(key == GLUT_KEY_DOWN){
carY = carY - carSpeed;
direction = 90.0;
glutPostRedisplay();

}

if(key == GLUT_KEY_LEFT){
carX = carX - carSpeed;
direction = -90.0;
glutPostRedisplay();
}

if(key == GLUT_KEY_RIGHT){
carX = carX + carSpeed;
direction = 180.0;
glutPostRedisplay();
}}

void renderScene(void){
glClear (GL_COLOR_BUFFER_BIT);
glLoadIdentity();
drawPlayground();
glPushMatrix();
glRotatef(direction, 0.0, 0.0, 1.0);
glTranslatef(carX, carY,0.0);
drawcar();
glPopMatrix();
glFlush();}

int main(int argc, char** argv){
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (400, 400);
glutInitWindowPosition (100, 100);
glutCreateWindow("courseWork_2DGame");
reshape();
glutDisplayFunc(renderScene);
glutSpecialFunc(keys);
glutMainLoop();
return 0;}

这是我的 openGL 代码,我绘制了汽车移动的 Playground 。汽车将移动但箭头,并且当它移动时,方向是汽车根据按下的箭头键旋转。然而,当按下按键时,汽车平移正常但旋转不正确,我认为是因为它不是在其中心旋转而是在不同的点上旋转。

最佳答案

我记得有一篇文章对此进行了非常详细的解释 here .这个人在解释整个矩阵层次结构方面做得非常出色。


如果要围绕其中心旋转对象,首先必须将其平移到原点,然后旋转并将其平移回来。由于变换矩阵从右到左影响您的 vector ,因此您必须以相反的顺序编写这些步骤。

这里是一些伪代码,因为我不太了解 OpenGL 例程:

PushMatrix();
LoadIdentity(); // Start with a fresh matrix
Translate(); // Move your object to its final destination
Rotate(); // Apply rotations
Draw(); // Draw your object using coordinates relative to the object center
PopMatrix();

应用这些矩阵:

v_t = (I * T * R) * v = (I * (T * (R * v)))

所以顺序是:旋转,平移。

编辑:对上述等式的解释。

变换旋转、缩放和平移影响模型- View -矩阵。模型的每个 3D 点( vector )都与该矩阵相乘以获得其在 3D 空间中的最终点,然后与投影矩阵相乘以接收 2D 点(在 2D 屏幕上)。

忽略投影的东西,模型- View -矩阵转换的点是:

v_t = MV * v

意思是原始点v,乘以model-view-matrix MV。

在上面的代码中,我们通过单位矩阵 I、平移 T 和旋转 R 构造了 MV:

MV = I * T * R

将所有内容放在一起,您会看到您的点 v 首先受到旋转 R 的影响,然后是平移 T,因此您的点在平移之前先旋转,就像我们希望的那样:

v_t = MV * v = (I * T * R) * v = T * (R * v)

在 Translate() 之前调用 Rotate() 会导致:

v_t = (I * R * T) * v = R * (T * v)

这会很糟糕:转换为 3D 中的某个点,然后围绕原点旋转,导致模型出现一些奇怪的扭曲。

关于c++ - 如何在其中心旋转二维对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13372867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com