【问题标题】:Angle of camera to intersect with object vector与对象矢量相交的相机角度
【发布时间】:2019-08-26 01:30:17
【问题描述】:

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

抱歉,以我的知识无法直接解释,请查看附图:相机可能没有直视物体(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);

【问题讨论】:

  • adjacent 不指向 obj 远离,除非你这样做 (obj.transform.position - new Vector3(obj.transform.position.x, obj.transform.position.y, Camera.main.transform.position.z)).normalized; ?
  • 如果您解释了为什么需要角度可能会有所帮助 - 是否需要签名?如果是这样,负角表示什么?根据您对角度的意图,您甚至可能根本不需要计算角度。
  • 当你用已知的 90° 角绘制它时,你不能简单地做180f - 90f - Vector3.Angle(camera.forward, (obj.position - camera.position).normalized)
  • 嗨@ruzihm 很抱歉耽搁了,当时正在旅行,无法测试。您提出的解决方案有效,但我的对象高度不同,因此我的图表不准确导致不一致。最后,我对摄像机前的物体进行了光线投射,作为一个足够好的解决方案——物体足够大。非常感谢您的帮助:)

标签: c# unity3d angle


【解决方案1】:

找到v1v2 之间的角度会得到这个角度,它与您在图表中标记的不匹配:

相反,求解 v1 和垂直于 v2 的平面之间的角度:

我们可以通过使用Vector3.ProjectOnPlane 将 v1 投影到垂直于 v2 的平面上,然后使用 Vector3.Angle 找到该投影与 v1 之间的角度来统一执行此操作:

Vector3 projection = Vector3.ProjectOnPlane(hypoth, adjacent); 
float angle = Vector3.Angle(projection, hypoth);

【讨论】:

    【解决方案2】:

    我有类似的情况,我想将地形单元的对撞机设置在玩家 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;
    }
    

    我希望它与您正在寻找的东西有些相似。

    编辑:

    如果你应用了这个脚本,而不是 collider 你放了一个盒子,你会看到盒子的位置总是在天空上的相机和地面上的物体之间,不管相机或地面上的物体在移动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多