gpt4 book ai didi

c++ - 如何在 OpenGL 中使用鼠标在相机周围移动?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:15:19 26 4
gpt4 key购买 nike

我意识到之前在 stackoverflow 上有人问过这个问题,但我还没有找到我完全理解的答案,所以我想我会得到一些针对我的情况的帮助。

我基本上希望能够使用鼠标绕 y 轴旋转。以下是我用于实际旋转的函数(角度以度为单位)。

void CCamera::RotateY (GLfloat Angle)
{
RotatedY += Angle;

//Rotate viewdir around the up vector:
ViewDir = Normalize3dVector(ViewDir*cos(Angle*PIdiv180)
- RightVector*sin(Angle*PIdiv180));

//now compute the new RightVector (by cross product)
RightVector = CrossProduct(&ViewDir, &UpVector);
}

因为我使用的是 GLUT,所以我使用被动函数来获取光标的 x,y 坐标。然后在我的显示中我有以下内容:

void display(void) {
...
mouseDisplacement = mouseX - oldMouseX;

if (mouseDisplacement > 0) Camera.RotateY(-1.0*abs(mouseDisplacement));
else if (mouseDisplacement < 0) Camera.RotateY(1.0*abs(mouseDisplacement));

oldMouseX = mouseX;
glutWarpPointer(centerWindowX, centerWindowY); // move the cursor to center of window
...
}

现在问题很明显了,因为显示函数每秒运行 60 次,所以每当我尝试移动鼠标光标时,它就会卡在中间。如果我没有显示功能循环,旋转真的很慢。那么这样做的正确方法是什么?

再次注意,我只是希望使用鼠标让相机在右/左方向移动。虽然如果我能让它像适当的 fps 一样工作会很棒,但这并不是真正必要的。

非常感谢任何帮助。

最佳答案

您可能希望使用带有自定义回调的 glutPassiveMotionFunc 来处理鼠标位置增量:

void handlerFunc(int x, int y) 
{
/* code to handle mouse position deltas */
}

int main()
{
/* [...] */

glutPassiveMotionFunc(handlerFunc); // before glutMainLoop.

/* [...] */

return 0;
}

文档:glutPassiveMotionFunc

-

此外,我认为您的增量计算有问题。您应该计算当前光标位置与窗口中心(光标将在每一帧后设置的位置)之间的差异。

mouseDisplacement = mouseX - centerWindowX;

这是我在我的引擎中使用的一些代码来获得 FPS 相机(随意进行相应的调整):

void update(float delta)  // delta is usually 1.0/60.0
{
// Mouse.
MouseState mouse = InputDevices.get_mouse_state();

// - Movement
camera->yaw += camera->speed * mouse.dx * delta;
camera->pitch -= camera->speed * mouse.dy * delta;

// Regular FPS camera.
// TODO(Clem): Move this to a class.

// Clamp.
if (camera->pitch > math::PI_OVER_TWO) {
camera->pitch = math::PI_OVER_TWO - 0.0001f;
}
else if (camera->pitch < -math::PI_OVER_TWO) {
camera->pitch = -math::PI_OVER_TWO + 0.0001f;
}

float pitch = camera->pitch;
float yaw = camera->yaw;

// Spherical coordinates (r=1).
camera->forward.x = -sin(yaw) * cos(pitch);
camera->forward.y = -sin(pitch);
camera->forward.z = -cos(yaw) * cos(pitch);

camera->right.x = -cos(yaw);
camera->right.y = 0.0;
camera->right.z = sin(yaw);

camera->up = cross(camera->forward, camera->right);

camera->forward = normalize(camera->forward);
camera->right = normalize(camera->right);
camera->up = normalize(camera->up);
}

关于c++ - 如何在 OpenGL 中使用鼠标在相机周围移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34378214/

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