猿问

相机与物体向量相交的角度

我试图确定相机前向矢量与对象矢量相交的角度。

抱歉,无法直接以我的知识进行解释,请参阅附图:相机可能不会直接看着物体(OBJ),我想知道相机的前向矢量的角度(图中的?) (红色的 V1)与对象的矢量(红色的 V2)相交(如果相交),例如点 A、B、C 等,具体取决于相机的 x 旋转。

我尝试计算红线 v1 和 v2 的归一化向量。然后计算两个向量之间的角度https://onlinemschool.com/math/library/vector/angl/ 但测试时结果与预期值不符。

//v1

Vector3 hypoth = Camera.main.transform.forward.normalized;

//v2

Vector3 adjacent = (new Vector3(obj.transform.position.x, obj.transform.position.y, Camera.main.transform.position.z) 

                        -obj.transform.position).normalized;


float dotProd = Vector3.Dot(adjacent, hypoth);

float cosOfAngle = dotProd / (Vector3.Magnitude(adjacent) * Vector3.Magnitude(hypoth));

double radAngle = Math.Acos(cosOfAngle);

float angle = (float)((180 / Math.PI) * radAngle);


慕勒3428872
浏览 86回答 2
2回答

jeck猫

v1找到和之间的角度v2会得到这个角度,它与您在图表中标记的角度不匹配:相反,求解 v1 和垂直于 v2 的平面之间的角度:我们可以通过使用Vector3.ProjectOnPlane将 v1 投影到与 v2 垂直的平面,然后使用Vector3.Angle找到该投影与 v1 之间的角度来统一完成此操作:Vector3 projection = Vector3.ProjectOnPlane(hypoth, adjacent);  float angle = Vector3.Angle(projection, hypoth);

ITMISS

我有一个类似的情况,我想将地形单位的碰撞器设置在玩家Jet的同一高度,同时它必须在相机的视线上,否则当你拍摄地形单位时,子弹看起来就像穿过地面上的敌方单位,这仅在您使用预期相机时才有效,在正交上,您可能根本不需要这样做,只需将对象设置在与相机和所有东西相同的高度即可将被对齐。这是我的代码 void SetColliderLocation(){    // Object on the ground    A = TerrainUnit.transform.position;    // Camera location    B = cam.transform.position;    // Enemy jet height     height = mainPlayerTransform.position.y;    // Unit Vector normalized between A and B    AB_Normalized = (A - B).normalized;    // The unit vector required to move the collider to maintain its hieght and line of sight with the camera    unitVector = (height - A.y) / AB_Normalized.y;    // Setting the location of the collidar .    collidarGameObject.transform.position = (AB_Normalized * unitVector) + A;}我希望它与您正在寻找的东西有多么相似。编辑:如果您应用此脚本并且放置一个盒子而不是碰撞器,您将看到盒子的位置将始终位于天空上的相机和地面上的物体之间,但是相机或地面上的物体正在移动。
随时随地看视频慕课网APP
我要回答