我有一個觀點P1
(P2
這給了我一個有方向和轉彎的向量)
如何確定P1L
和P1R
?
L 始終在左側,R 始終在右側(無論如何標記線)
在下面的代碼中,我添加和減去值,但這并不能告訴我它什么時候是左右。
當我站在 P1 并看向 P2 時,我想特別指出左右的點
Vector2 vNormalized = (endP - startP).normalized;
Vector2 vPerpendicular = new Vector2(vNormalized.y, -vNormalized.x).normalized;
var P1 = startP vPerpendicular * Thickness / 2;
var P2 = startP - vPerpendicular * Thickness / 2;
var P3 = endP - vPerpendicular * Thickness / 2;
var P4 = endP vPerpendicular * Thickness / 2;
uj5u.com熱心網友回復:
您可以在 3d 中思考,這會更容易:
你在 3d 中有你的 P1-P2 向量:
Vector3 v = new Vector3( vNormalized.x, vNormalized.y, 0.0f );
和法線向量:
Vector3 normal = new Vector3( 0.0f, 0.0f, 1.0f );
然后通過使用叉積,您可以計算左右向量:
Vector3 perpendicularLeft = Vector3.Cross( v, normal ).normalized;
Vector3 perpendicularRight = Vector3.Cross( normal, v ).normalized;
然后你可以計算你的分數:
Vector3 PLeft = startP Thickness * perpendicularLeft;
Vector3 PRight = startP Thickness * perpendicularRight;
在哪里:
Vector2 left = new Vector2( PLeft.x, PLeft.y );
Vector2 right = new Vector2( PRight.x, PRight.y );
uj5u.com熱心網友回復:
你快到了。與線的方向相比,P1 和 P2 將始終為順時針/逆時針方向。
如果您希望 P1L 和 P1R 相對于查看器位于左側/右側,您可以簡單地比較 X 坐標并切換它們的順序。或者您可以切換線方向的符號:
if(vPerpendicular.X < 0){
vPerpendicular = -vPerpendicular;
}
這應該確保 P1 和 P2 具有一致的左/右順序。但是您可能需要vPerpendicular.X > 0
根據所需的順序將支票更改為。這可能取決于您使用的坐標系。
此外,應該不需要標準化兩次。一次就足夠了。
uj5u.com熱心網友回復:
求從 P1 到 P2 的旋轉角度:
Vector2 diff = P2 - P1;
float angle = Mathf.Atan2(diff.y, diff.x);
將角度添加 90 度以獲得 P1L 的角度。請注意,Mathf.Atan2
將以弧度回傳角度:
float P1L_angle = angle 0.5*Mathf.PI;
現在選擇一些長度p1l_length
并使用正弦和余弦來獲得 x/y 值:
float P1L_length = 0.5f;
Vector2 P1L = P1L_length*(new Vector2(Mathf.Cos(P1L_angle), Mathf.Sin(P1L_angle)));
如果不抵消P1
,則 P1R 正好相反P1L
Vector2 P1R = -P1L;
然后你添加P1
兩者以獲得最終答案:
P1L = P1;
P1R = P1;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/461610.html
下一篇:返回列表