algorithm - 点看点

标签 algorithm vector 3d quaternions google-project-tango

所以我在 3D 空间中有一个点,并且我有相机在 3D 空间中的位置和旋转。

所以基本上对象上有 Vector3。 相机 Vector3Quaternion

我需要了解如何看待这一点。

我想告诉用户如何移动到那个点。 用户应该将相机向左、向右还是向后?

最佳答案

执行此操作的一种方法是计算相机当前面向的方向作为偏航角(如罗盘航向),并计算它需要面向的方向才能注视该点。

从另一个中减去一个并调整结果,使其在 -180 到 180 度(或 -pi 到 pi 弧度)的范围内,然后根据标志告诉用户向左转或向右转。如果绝对值超过 120 度(或某个可配置的值),则告诉他们它在他们身后。

要找到相机的当前航向,将向量 (0, 0, 1) 通过四元数变换以获得前向向量,然后使用 atan2(forward.z, forward.x).

要计算观察该点所需的航向,从该点减去当前相机位置以获得所需的前向向量,然后传递给 atan:

Vector3 desired_forward = point - camera_pos;
float desired_heading = atan2(desired_forward.z, desired_forward.x);

然后找到需要的旋转:

float rotation_needed = desired_heading - heading;
if(rotation_needed > Math.PI)
    rotation_needed -= 2 * Math.PI;
if(rotation_needed < -Math.PI)
    rotation_needed += 2 * Math.PI;

现在告诉用户根据所需旋转的符号向左或向右旋转。

如果你想向上/向下看,你可以通过先计算前向矢量在XZ平面中的长度然后再次使用atan2来计算俯仰角:

float xzLength = sqrt(forward.x * forward.x + forward.z * forward.z);
float pitch_angle = atan2(forward.y, xzLength);

对所需的正向矢量执行相同的操作,并从所需的电流中减去电流。检查标志以告诉用户是向上看还是向下看。

有一些可能的并发症。例如,根据相机四元数是否指定从世界空间到相机空间的变换,反之亦然,您可能需要否定计算出的相机航向。

关于algorithm - 点看点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42592198/

相关文章:

java - 检查字符串是否等价的查询

algorithm - 推理引擎与决策树

STL - STL count_if 的标准谓词

opengl - 给定一个 4x4 齐次矩阵,我如何获得 3D 世界坐标?

javascript - 场景中的静态对象 - Three.js

python - 使用分而治之法找到最大总和子列表和总和

python - 文本中关键字的精确命中集

vector - 将具有多个参数的函数应用于 Julia 中的向量

c++ - C++ Eclipse (Linux-Mint12) 中的转换问题

algorithm - 检测 3D 模型中的平面