gpt4 book ai didi

c++ - 子弹算法在 X 轴上旋转有问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:34:49 24 4
gpt4 key购买 nike

这是我正在尝试做的。我正在尝试从屏幕中央发出一颗子弹。我有一个 x 和 y 旋转角度。问题是 Y(通过 x 上的旋转修改)确实没有按预期工作。这是我的。

 float yrotrad, xrotrad;

yrotrad = (Camera.roty / 180.0f * 3.141592654f);
xrotrad = (Camera.rotx / 180.0f * 3.141592654f);
Vertex3f Pos;

// get camera position
pls.x = Camera.x;
pls.y = Camera.y;
pls.z = Camera.z;


for(float i = 0; i < 60; i++)
{


//add the rotation vector

pls.x += float(sin(yrotrad)) ;
pls.z -= float(cos(yrotrad)) ;
pls.y += float(sin(twopi - xrotrad));

//translate camera coords to cube coords
Pos.x = ceil(pls.x / 3);
Pos.y = ceil((pls.y) / 3);
Pos.z = ceil(pls.z / 3);

if(!CubeIsEmpty(Pos.x,Pos.y,Pos.z)) //remove first cube that made contact
{
delete GetCube(Pos.x,Pos.y,Pos.z);
SetCube(0,Pos.x,Pos.y,Pos.z);
return;
}
}

这与我移动玩家的方式几乎相同,我将方向 vector 添加到摄像机,然后找到玩家所在的立方体。如果我删除 pls.y += float(sin(twopi - xrotrad));然后我清楚地看到在 X 和 Z 上,一切都指向它应该的方向。当我添加 pls.y += float(sin(twopi - xrotrad)); 然后它几乎可以工作,但不完全是,我从渲染轨迹球体中观察到的是进一步向上或我往下看,它变得越偏移,而不是与相机的中心对齐。我做错了什么?

谢谢

基本上发生的事情很难解释,我希望时间为 0 的子弹始终位于屏幕中央,但它的行为很奇怪。如果我直视地平线向上 +- 20 度,那很好,但它开始不再跟随了。

我这样设置我的矩阵:

void CCubeGame::SetCameraMatrix()
{

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glRotatef(Camera.rotx,1,0,0);
glRotatef(Camera.roty,0,1,0);
glRotatef(Camera.rotz,0,0,1);

glTranslatef(-Camera.x , -Camera.y,-Camera.z );
}

然后像这样改变角度:

void CCubeGame::MouseMove(int x, int y)
{
if(!isTrapped)
return;

int diffx = x-lastMouse.x;
int diffy = y-lastMouse.y;

lastMouse.x = x;
lastMouse.y = y;
Camera.rotx += (float) diffy * 0.2;
Camera.roty += (float) diffx * 0.2;
if(Camera.rotx > 90)
{
Camera.rotx = 90;
}

if(Camera.rotx < -90)
{
Camera.rotx = -90;
}

if(isTrapped)
if (fabs(ScreenDimensions.x/2 - x) > 1 || fabs(ScreenDimensions.y/2 - y) > 1) {
resetPointer();
}

}

最佳答案

您需要通过 cos(xradrot) 缩放 X 和 Z。 (换句话说,乘以 cos(xradrot))。

想象一下,您正指向 Z 轴下方,但向上看。您根本不希望子弹沿 Z 轴向下射击,这就是您需要对其进行缩放的原因。 (这基本上与您在 X 和 Z 之间所做的相同,但现在是在 XZ vector 和 Y 上进行。)

pls.x += float(sin(yrotrad)*cos(xrotrad)) ;
pls.z -= float(cos(yrotrad)*cos(xrotrad)) ;
pls.y += float(sin(twopi - xrotrad));

关于c++ - 子弹算法在 X 轴上旋转有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3673165/

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