簡體   English   中英

獲取兩點之間的角度並用該角度圍繞另一個點旋轉一個點 - C++

[英]get an angle between 2 points and rotate a point about an other point with this angle - C++

我基本上是在嘗試根據貝塞爾曲線的點創建二維線。 貝塞爾曲線的所有點都放置得很好,一切看起來都井井有條。 從這些點開始,我在 z 軸上創建了另外 2 個點,它們將成為直線的邊界:

    glm::vec3    p1 = pos[i];
    p1.z = p1.z + (size / 2);

    glm::vec3    p2 = pos[i];
    p2.z = p2.z - (size / 2);

然后我通過圍繞主要點旋轉它們來更改這些點的位置:

pm 是圍繞固定點 pf 旋轉的移動點

    glm::vec3   rotP = glm::vec3(0.0f, 0.5f, 0.0f);

    float   co = cos(angle);
    float   si = sin(angle);

    // CLOCKWISE
    rotP.x = (pf.x - pm.x) * co + (pf.z - pm.z) * si + pm.x;
    rotP.z = -(pf.x - pm.x) * si + (pf.z - pm.z) * co + pm.z;

angle 是貝塞爾曲線上后向點和前向點之間的角度:

depForward 是 x, glm::vec3(1.0f, 0.0f, 0.0f)

    glm::vec3 normForwardUnit = normalize(p2 - p1);
    float angle = (acos(dot(depForward, normForwardUnit)));

我得到的問題是輪換是錯誤的。 我的一些線條是正確的,但這似乎取決於線條的方向。

不正確的例子正確的例子

我認為問題出在旋轉的格式上,但我仍然無法理解。 我試圖將角度歸一化到不同的范圍:

//0 to 2PI
    if (angle < 0) { angle += 2 * PI; }
//-PI to PI
    if (angle > PI)        { angle -= 2 * PI; }
    else if (angle <= -PI) { angle += 2 * PI; }

其他計算角度的方法:

    float angle = atan2(p2.z - p1.z, p2.x - p1.x);

逆時針旋轉點:

//COUNTER CLOCKWISE
    rotP.x = (pf.x - pm.x) * co - (pf.z - pm.z) * si + pm.x;
    rotP.z = (pf.x - pm.x) * si + (pf.z - pm.z) * co + pm.z;

如果有人需要它,這里是 paddy 方法的實現。 您可以使用 backP 和 nextP 之間的點而不是 midPoint 來放置新點。

backP 和 nextP 是 b 曲線之前和之后的點

  // VEC FORWARD VECTOR
  glm::vec3 forwardVec = normalize(backP - nextP);

  //PERPENDICULAR VEC
  glm::vec3 perpVec = cross(forwardVec, glm::vec3(0.0f, 1.0f, 0.0f));
  perpVec = normalize(perpVec);

  //MID POINT
  glm::vec3 midP = midPoint(backP, nextP);

  // GEN POINTS
  glm::vec3 p1 = midP + (width * perpVec);
  glm::vec3 p2 = midP - (width * perpVec);

我認為你一定要看看這個:

如果你堅持自己的方式,你不需要使用任何角度或旋轉......

您有從多項式曲線中采樣的線p0,p1 ,因此:

tangent = p1-p0

但是,更好地近似切線會更好,因此要么通過曲線的一階推導得到它,要么使用 2 條后續線(p0,p1), (p1,p2)然后點p1處的切線為:

tangent = p2-p1

有關詳細信息,請參閱:

現在采用bitangent (可以從相機矩陣中提取的相機的 z 軸)並使用叉積來獲得normal

normal = normalize(cross(tangent,binormal))

現在你只需按正常方式替換p1即可:

p1'  = p1 + 0.5*curve_thickness*normal
p1'' = p1 - 0.5*curve_thickness*normal

對曲線的所有點執行相同的操作...之后您只需使用p'p''點渲染四邊形...

但是,使用這種方法您可能會遇到需要進一步調整的問題,請參閱:

暫無
暫無

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

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