加工& OpenGL - 改变相机位置?

发布于 2024-10-03 17:36:20 字数 324 浏览 5 评论 0原文

我正在做一个小项目,将数据集绘制到一个世界上。我已经完成了策划。现在我想实现相机移动。

我有一些代码,如果用户按住 c 并拖动鼠标,相机位置就会改变。问题是,我不确定如何根据鼠标移动来计算相机移动。

这是默认位置的相机代码:camera(width/2.0, height/2.0, (height/2.0) / tan(PI*60.0 / 360.0), width/2.0, height/2.0, 0, 0, 1, 0 );

如何更改与鼠标拖动相关的相机位置? (我尝试过使用 mouseX 和 mouseY 来偏移相机眼睛位置,但效果不佳。)

I'm doing a small project where I plot data sets onto a world. I've got the plotting done. Now I want to implement camera movement.

I have some code where if a user holds down c and drags the mouse, the camera position is changed. The thing is, I'm not sure how to calculate the camera movement from the mouse movement.

This is the camera code for the default position: camera(width/2.0, height/2.0, (height/2.0) / tan(PI*60.0 / 360.0), width/2.0, height/2.0, 0, 0, 1, 0);

How can I change the camera position in relation to the mouse dragging? (I've tried using mouseX and mouseY to offset the camera eye position, but it doesn't work well.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一桥轻雨一伞开 2024-10-10 17:36:20

如果你有方向向量,你可以设置你的相机的位置如下(抽象代码):

pos += speed * normalize( direction );

这是为了前进。如果你想向后移动 - 只需将你的归一化方向向量乘以 -1 即可。对于向左和向右扫射,请使用以下内容:

pos += speed * normalize( cross_product( direction, upvector ) ); // strafing right
pos += speed * normalize( cross_product( upvector, direction ) ); // strafing left

以下是有关向量运算的一些注释(来自我的“HelloWorld”应用程序之一 =) ):

  • normalize( vec ); 返回 vec,其长度等于 1 ;这个将 vec “切割”到所需的长度
  • cross_product( vec_a, vec_b ); 返回 vec_c,它垂直于 vec_a 和 vec_b (参见 本文了解更多信息)。

我的 cross_product() 版本如下所示:

Vector Vector::CrossProduct(const Vector &v)
{
    double k1 = (y * v.z) - (z * v.y);
    double k2 = (z * v.x) - (x * v.z);
    double k3 = (x * v.y) - (y * v.x);

    return Vector(NumBounds(k1), NumBounds(k2), NumBounds(k3)); 
    // NumBounds(v) returns 0 when v is less than 10 ^ -8
}

希望这会有所帮助 =)

If you have got direction vector, you can set position of your camera as follow (abstract code):

pos += speed * normalize( direction );

That's for moving forward. If you wanna move backward - just multiply your normalized direction vertor by -1. For strafing left and right, use something this:

pos += speed * normalize( cross_product( direction, upvector ) ); // strafing right
pos += speed * normalize( cross_product( upvector, direction ) ); // strafing left

Here are some notes on vector operations (from one of my "HelloWorld" applications =) ):

  • normalize( vec ); returns vec, which length equals to 1; this one "cuts" vec to needed length
  • cross_product( vec_a, vec_b ); returns vec_c, which is directed perpendicullary to vec_a and vec_b (see this article for more).

My version of cross_product() looks like this:

Vector Vector::CrossProduct(const Vector &v)
{
    double k1 = (y * v.z) - (z * v.y);
    double k2 = (z * v.x) - (x * v.z);
    double k3 = (x * v.y) - (y * v.x);

    return Vector(NumBounds(k1), NumBounds(k2), NumBounds(k3)); 
    // NumBounds(v) returns 0 when v is less than 10 ^ -8
}

Hope this will help =)

Oo萌小芽oO 2024-10-10 17:36:20

我认为到目前为止最简单的事情是使用 peasycam 库

http://mrfeinberg.com/peasycam/

该库将允许您使用鼠标访问相机,您可以通过各种方式以及各种 getter 来限制鼠标,从而可以轻松访问有关相机及其当前状态的信息。

I think by far the easiest thing to do would be to use the peasycam library

http://mrfeinberg.com/peasycam/

this library will give you access to your camera using a mouse which you can constrain in various ways as well various getters that make it easy to access information about the camera and its current state.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文