Cesium:将相机置于实体的第一人称视图中

时间:2016-01-28 16:19:17

标签: camera cesium

我想让我的相机跟随移动实体的第一人称视角。我不相信trackedEntity适用于此用例,因为我不想在 实体上查找,但我想从中查找 out 。我还希望用户能够使用鼠标相对于移动实体来转动相机(例如,查看移动平面的左窗口)。

在传统的游戏引擎中,我会通过将相机附加到实体来完成此操作,因此它会随之移动,但相对于实体保留其自身的局部变换,以便它可以相对于实体自由移动实体。

我现在能想到的唯一方法是分别跟踪“用户控制”变换,并在每个时钟周期将其与实体变换相乘。还有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

也必须自己弄清楚这一点。

Camera.setView和自定义的实用程序函数是您的朋友。 例如。这是旋转的幼稚实现(当摄像机的俯仰角太像“鸟瞰”时,效果不佳):

Cesium.Camera.prototype.rotateView = function(rotation) {
    let { heading, pitch, roll } = rotation;
    heading = this.heading + (heading || 0);
    pitch = this.pitch + (pitch || 0);
    roll = this.roll + (roll || 0);
    const destination = this.position;
    this.setView({
        destination,
        orientation: {
            heading,
            pitch,
            roll
    }
  });
};

类似地,您可以通过提供destination用实体的位置来更新位置。

答案 1 :(得分:0)

看看铯的Cardboard sandcastle example。在这里,您坐在热气球上,从那里感知世界。滚动出来后,您可以用鼠标平移查看。由于计算非常复杂,因此我无法提供任何细节,但摄像机视图似乎与实体的移动方向对齐。该脚本的主要部分是:

// Set initial camera position and orientation to be when in the model's reference frame.
var camera = viewer.camera;
camera.position = new Cesium.Cartesian3(0.25, 0.0, 0.0);
camera.direction = new Cesium.Cartesian3(1.0, 0.0, 0.0);
camera.up = new Cesium.Cartesian3(0.0, 0.0, 1.0);
camera.right = new Cesium.Cartesian3(0.0, -1.0, 0.0);

viewer.scene.postUpdate.addEventListener(function (scene, time) {
  var position = entity.position.getValue(time);
  if (!Cesium.defined(position)) {
    return;
  }

  var transform;
  if (!Cesium.defined(entity.orientation)) {
    transform = Cesium.Transforms.eastNorthUpToFixedFrame(position);
  } else {
    var orientation = entity.orientation.getValue(time);
    if (!Cesium.defined(orientation)) {
      return;
    }

    transform = Cesium.Matrix4.fromRotationTranslation(
      Cesium.Matrix3.fromQuaternion(orientation),
      position
    );
  }

  // Save camera state
  var offset = Cesium.Cartesian3.clone(camera.position);
  var direction = Cesium.Cartesian3.clone(camera.direction);
  var up = Cesium.Cartesian3.clone(camera.up);

  // Set camera to be in model's reference frame.
  camera.lookAtTransform(transform);

  // Reset the camera state to the saved state so it appears fixed in the model's frame.
  Cesium.Cartesian3.clone(offset, camera.position);
  Cesium.Cartesian3.clone(direction, camera.direction);
  Cesium.Cartesian3.clone(up, camera.up);
  Cesium.Cartesian3.cross(direction, up, camera.right);
});

也许您可以尝试修改相机矢量,或将变换与另一个旋转矩阵相乘,以模拟在初始视角下的头部旋转(向左/向右/向后看)。例如,您可以尝试将上面的示例与来自Cesium First Person Camera Controller的存储库中的代码组合。