gpt4 book ai didi

algorithm - 点看点

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:57:52 26 4
gpt4 key购买 nike

所以我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com