【问题标题】:Processing & OpenGL - Changing the camera position?处理和 OpenGL - 更改相机位置?
【发布时间】:2011-05-13 05:34:42
【问题描述】:

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

我有一些代码,如果用户按住 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 来偏移相机的眼睛位置,但效果不佳。)

【问题讨论】:

  • 当你说那是“相机代码”时,你的意思是那是模型视图矩阵吗?或者您是否使用“相机”类/函数来进行一些幕后计算?移动场景的最简单方法是完全忽略相机,而是移动场景本身。只需在您正在渲染的所有 X、Y、Z 点上添加一个“相机偏移”,这与您希望“相机”移动的位置相反。
  • 我的意思是我想根据鼠标拖动改变处理camera()方法中的变量。

标签: opengl camera processing


【解决方案1】:

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

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 垂直(参见this article 了解更多信息)。

我的 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
}

希望这会有所帮助 =)

【讨论】:

    【解决方案2】:

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

    http://mrfeinberg.com/peasycam/

    这个库可以让您使用鼠标访问您的相机,您可以通过各种方式进行约束,还可以使用各种 getter 来轻松访问有关相机及其当前状态的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 2016-02-16
      相关资源
      最近更新 更多