开发者

find angle between faces from face normals

开发者 https://www.devze.com 2023-02-18 05:12 出处:网络
I have some face normals and I need to calculate the angle between the faces they belong to. The problem I\'m having is with finding angles between faces when the angle is greater than 180 - I can\'t

I have some face normals and I need to calculate the angle between the faces they belong to. The problem I'm having is with finding angles between faces when the angle is greater than 180 - I can't figure out how to tell the difference between an angle of 45 and an angle of 315.

开发者_开发问答

edit2: I have access to the obj file defining the model, what information would i need to differentiate between 45' and 315'? Also, I am building the (low-poly) models used, so I can guarantee no intersecting faces, etc.

edit:

ang = math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))

ang = math.degrees(ang)

ang = 360 - (ang + 180)


Ensure that your normals are unit length (divide by their length if necessary). Then find the dot product.

dp = n1.x*n2.x + n1.y*n2.y + n1.z*n2.z

This will give a value in [-1 to 1].
If dp is negative, the angle is greater than 90 degrees.

To find the angle, use arc-cosine.

θ = acos(dp);

That will give you the value in radians. To convert to degrees, multiply by 180/pi.


Edit: Assume the faces are defined as polygons. If the faces are not co-planar, there must exist one point in each face's polygon definition that is not co-planar with the other polygon. Consider two triangles: if one edge is connected, they share two vertices but each have one un-shared vertex. I'll call these v1 and v2 associated respectively with normals n1 and n2. Find the vector from v1 to v2:

m = v2-v1

If the angle between m and n1 is greater than 90 [dotP(m,n1)<0] then the polygons face away from each other. If the angle is less than 90, the polygons are facing toward each other. If the angle is 90 degrees, then I think that the polygons are co-planar (or one of your chosen points is on the line of planar intersection or I've missed a case in my thinking).

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号