如何从polyop更改为meshop&物体内部或外部的两个面之间的角度是?

时间:2012-04-07 00:54:36

标签: maxscript

第1部分:

如何

for i = 1 To polyop.getNumEdges $ do
(
  append faces ((polyop.getfacesusingedge $ #{i}) as array)
  if faces[i][2] != undefined then
  (
    f1 = polyop.getfacenormal $ faces[i][1];
    f2 = polyop.getfacenormal $ faces[i][2];  
  )
)

看看使用meshop?

此代码从可编辑多边形中读取所有边,将边连接的面附加到,以便于访问并获取法线。

问题是以前该对象是一个可编辑的网格。转换为e.p.由于某种原因,面部的数量减少了。我需要整个对象只由三角形组成,所以我不能使用这种方法,因为转换似乎将一些三角形组合成多边形。

第2部分:

我有一个功能

fn getAnglebetweentwoFaces face1 face2 =
(
    --theAngle = acos(dot face1 face2)
    theAngle = acos(dot (normalize face1) (normalize face2))
    return theAngle
) 

工作“很好”。它告诉我两个面之间的角度,但我需要知道它是一个物体内部的角度,这两个面是一个部分还是外部。我该怎么做?

提前致谢。

编辑:我添加了

if face2Coord < 0 then
(
  normAngle = 360 - normAngle
)
normAngle = 180 - normAngle
return normAngle

到你的函数,现在我得到内角的负值和外角的值

1 个答案:

答案 0 :(得分:1)

第1部分:

不是直接的答案,但如果唯一的问题是转换后看起来越来越低的面数,并且您希望保持简单,只需在转换前使所有网格边可见。可编辑网格的结构与可编辑网格的结构完全不同,在eMesh中,你在面上迭代,每个面都有三个顶点 - 和三个边,其中没有一个与另一个面共享,这使得这些东西变得不必要地复杂化。在ePoly中,结构由边缘定义,使得诸如循环和环选择之类的东西更容易在面部(实际上是多边形)之间共享边缘。

第2部分:

您需要一些额外的数据才能实现这一目标,例如面部的中心(取决于几何体的扭曲程度,选择getFaceCenter或getSafeFaceCenter方法)。当你有这些点时,剩下的很容易,如果一个面的中心位于另一个面的平面之上,它是较小的角度而你不改变它,如果是相反的,那就是explement(360度角) )。

fn getAngleBetweenFaces normal1 normal2 center1 center2 =
(
    local face1Matrix = translate (matrixFromNormal normal1) center1
    local face2Coord = (center2 * (inverse face1Matrix)).z
    local normAngle = acos(dot (normalize normal1) (normalize normal2))
    if face2Coord < 0 do normAngle = 360 - normAngle
    normAngle 
)