gpt4 book ai didi

c++ - 如何在 3D 环境中沿对象在 C++ 中面向的方向移动对象

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

我正试图在 C++ 的 opengl 中移动金字塔,并试图让它朝着它所面对的方向前进。但是,我似乎无法弄清楚如何做到这一点。这是我绘制金字塔的代码:

void drawTriangle()
{
//back
glBegin(GL_POLYGON);
glColor3f(1,0,0);
glVertex3f(-1,-1,-1);
glVertex3f(1,-1,-1);
glVertex3f(0,1,0);
glEnd();

//front
glBegin(GL_POLYGON);
glColor3f(0,1,0);
glVertex3f(-1,-1,1);
glVertex3f(1,-1,1);
glVertex3f(0,1,0);
glEnd();

//right
glBegin(GL_POLYGON);
glColor3f(0,0,1);
glVertex3f(1,-1,-1);
glVertex3f(1,-1,1);
glVertex3f(0,1,0);
glEnd();

//left
glBegin(GL_POLYGON);
glColor3f(1,1,0);
glVertex3f(-1,-1,-1);
glVertex3f(-1,-1,1);
glVertex3f(0,1,0);
glEnd();

//bottom
glBegin(GL_POLYGON);
glColor3f(1,0,1);
glVertex3f(-1,-1,-1);
glVertex3f(1,-1,-1);
glVertex3f(1,-1,1);
glVertex3f(-1,-1,1);
glEnd();
}

金字塔是这样绘制到屏幕上的:

glPushMatrix();
glTranslatef(Xtri,0,Ztri);
glRotatef(heading,0,1,0);
drawTriangle();
glPopMatrix();

glFlush();

这里是如何更新变量以便金字塔可以四处移动:

void processKeys()
{
if(keys[VK_LEFT])
{
heading-=1.0f;
}
if(keys[VK_RIGHT])
{
heading+=1.0f;
}
if(keys[VK_UP])
{
Vtri-=0.001f;
}
if(keys[VK_DOWN])
{
Vtri+=0.001f;
}
}
void update()
{
Xtri += Vtri*cos((90+heading)*(PI/180.0f));
Ztri += Vtri*sin((90+heading)*(PI/180.0f));
}

我试图让金字塔向前移动,以便红色或背面是我想要成为金字塔移动方向的面,但是当我使用此代码时,它根本不起作用它以一种非常有趣的方式移动。

最佳答案

这是您可以做到的一种方法。它基于 Direct3D,但我认为它对于 OpenGL 应该非常相似。

为您的金字塔设置两个 vector :一个包含其位置,另一个包含其旋转。最初都初始化为 0,0,0。还有一个方向 vector 最初面向您的对象的方向(例如 1,0,0)和速度,再次设置为 0。

按下 a 或 d 后,将旋转 vector 的 y 元素调整到所需的角度。同样,按 w 或 s 调整对象的速度。您可能希望将帧渲染时间考虑在内,以使运动 fps 独立。

然后像您一样创建一个围绕 Y 轴的旋转矩阵。使用该矩阵通过将其与初始位置 vector 相乘来创建新的归一化 vector 。然后将这个 vector 乘以速度添加到您的位置坐标,并将这些坐标用于平移矩阵。

希望这是有道理的。这是一些伪代码:

// in constructor:
x = y = z = 0.0f; // position
ry = 0.0f; // rotation
speed = 0.0f;
initVec(1,0,0); // initial direction vector

// in event handler:
// upon key press adjust speed and/or ry

// in move():
// create rotation matrix around Y axis by ry = rotationMatrix

// use it to find new direction vector
newDirectionVector = initVec * rotationMatrix;

// adjust your position
x += newDirectionVector * speed;
y += newDirectionVector * speed;
z += newDirectionVector * speed;

glTranslatef(x, y, z);

// render

关于c++ - 如何在 3D 环境中沿对象在 C++ 中面向的方向移动对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13482160/

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