我想让我的相机跟随移动实体的第一人称视角。我不相信trackedEntity
适用于此用例,因为我不想在 实体上查找,但我想从中查找 out 。我还希望用户能够使用鼠标相对于移动实体来转动相机(例如,查看移动平面的左窗口)。
在传统的游戏引擎中,我会通过将相机附加到实体来完成此操作,因此它会随之移动,但相对于实体保留其自身的局部变换,以便它可以相对于实体自由移动实体。
我现在能想到的唯一方法是分别跟踪“用户控制”变换,并在每个时钟周期将其与实体变换相乘。还有更好的方法吗?
答案 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的存储库中的代码组合。