簡體   English   中英

Rect3D /平面的3D線/矢量交點

[英]3D Line/Vector intersection point of Rect3D/Plane

我在Rect3D BoundingBox中有一個Point3D和一個Vector3D方向。 我想擴展Point,使其“點擊” Rect3D ,然后獲得將vector擴展50的點 有人可以幫我找到計算方法嗎?

就像是:

public Point3D CalculatePoint(Point3D innerPoint, Rect3D rect, double extendOutside)

在此處輸入圖片說明

如果給定一個框並根據其8個頂點AH對其進行定義,並定義其6個面,例如:

ABC
ADE
FBC
FGH
DGH
ABE

以及由方向向量<vx,vy,vz>和點(x0,y0,z0)定義的一條直線(x0,y0,z0)您只需遍歷它們中的每一個,即可獲得直線相交的2個不同點。 因此,給定一個點,方向向量和該盒子的3個頂點...

//p0 is point on line
//direction is direction vector of line
//A,B,C are points on plane
Vector3 lpIntersect(Vector3 p0, Vector3 direction, Vector3 A, Vector3 B, Vector3 C){
    Vector3 n = (B - C).cross(C - A);
    Vector3 num = (p0-A)*n;
    Vector3 denom = direction*n;
    if((num.x==0 && num.y==0 && num.z==0) ||
       (denom.x==0 && denom.y==0 && denom.z==0))
        return Vector3(0,0,0);
    return num/denom;
}

一旦獲得2個點(Ax,Ay,Az)它們稱為(Ax,Ay,Az)(Bx,By,Bz)並用直線的方程式

x = x0 + vx*t
y = y0 + vy*t
z = z0 + vz*t

您可以插入上述各點並求解t以獲取例如(x-x0)/vx值,以查看哪個點朝着您給出的方向前進,如果t>=0則該點朝着該方向前進您還給了另一點:

if (((Ax-x0)/vx)>=0){
    x = Ax + vx*50;
    y = Ay + vy*50;
    z = Az + vz*50;
}
else{
    x = Bx + vx*50;
    y = By + vy*50;
    z = Bz + vz*50;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM