使用Raycast和Triangular函数Unity3D测量长度

问题描述 投票:1回答:1

我正在使用Unity在移动环境中开发AR。

enter image description here *顶部和底部已经改变:)

目前的程序如下:

1.测量移动设备的斜率。

float angle = Camera.main.transform.eulerAngles.x * Mathf.Deg2Rad;

2.在移动屏幕上的两个点(顶部,底部)将光线射向表面

  • 两点的x坐标是相同的
  • y坐标是顶部,较小的是底部。 Vector3 Top = hitTop.Pose.position; Vector3 Bottom = hitBottom.Pose.position;

3.测量移动设备与其表面之间的高度差(Y轴)

Vector3 CameraPoint = Camera.main.transform.position;
Vector3 SurfacePoint = new Vector3(CameraPoint.x, Bottom.y, CameraPoint.z);
float H = CameraPoint.y - SurfacePoint.y; 

4.测量水平长度以利用比例表达式。

float W = Vector3.Distance(Top, SurfacePoint); 
float w = Vector3.Distance(Top, Bottom);   

5.使用比例表达式,计算小三角形的高度。

H:W = h:w => H * w = W * h =>∴h=(H * w)/ W.

float h = ((H * w) / W);

6.有两条线(h,w)和相机的斜率,我想测量紫色线的长度。

  • 将此问题解释为坐标平面,并在“斜面”上创建表达式 x / w + y / h = 1
  • 使用直线斜率,获得直线表达式。 y = tan(90-θ)x

这两个表达式如下。

x = 1 /(1 / w + tan(90-θ)/ h)

y = tan(90-θ)/(1 / w + tan(90-θ)/ h)

7.为防止无穷大数,tanθ变为cosθ,sinθ。

* tanθ = sinθ / cosθ
* tan(90 - θ) = cosθ / sinθ

x = 1 /(1 / w +cosθ/(h *sinθ))

y =(cosθ/sinθ)/(1 / w +cosθ/(h *sinθ))

我做了一个简单的改变,因为表达太复杂了。

var x = (h * w * Mathf.Sin(angle)) / (h * Mathf.Sin(angle) + w * Mathf.Cos(angle));

var y = (h * w * Mathf.Cos(angle)) / (h * Mathf.Sin(angle) + w * Mathf.Cos(angle));

我测量了距离(0,0),(x,y)

float Object_height = Vector2.Distance(Vector2.zero, new Vector2(x, y));

目前,通过上述计算方法测量所需长度。但它不能正常工作。

我想要的是紫色的长度。

我只知道星形坐标,相机的斜率和紫色线的斜率。

紫色线的斜率与相机的斜率相同。

下图是失败的情况。

我认为红色和黄色Ray之间的差距越大,价值就越大。

哪部分错了?

告诉我如何使用三角函数来获得紫色线的长度。

unity3d math trigonometry raycasting
1个回答
1
投票

在Unity的Ray类/结构的帮助下,这可以在没有任何三角函数的情况下轻松实现,它提供了方便的GetPoint(浮点距离)方法。从相机到近距离光线投射的距离是微不足道的(.magnitude),而不是进行第二次光线投射,它足以创建光线,并查询给定距离的点。从你的例子中得到紫色线的长度只是做另一个.magnitude的问题

    startPos=transform.position;    // to be replaced with camera position
    var hitpoint1=targetA.position; // to be replaced with raycasts hit1
    var hitpoint2=targetB.position; // to be replaced with reaycast hit2
    Ray rayB=new Ray(startPos,hitpoint2-startPos);
    float dist=(hitpoint1-startPos).magnitude;
    var purpleEndPoint=rayB.GetPoint(dist);

    Debug.Log("purple line length ="+(hitpoint1-purpleEndPoint).magnitude);
© www.soinside.com 2019 - 2024. All rights reserved.