![](/img/trans.png)
[英]How to calculate the angle between two points and rotate the third point baste on that?
[英]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.