1

第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?

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

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

第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

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

4

1 回答 1

1

第1部分:

不是一个直接的答案,但如果唯一的问题是转换后面的数量似乎越来越少并且您想保持简单,只需在转换之前使所有网格边缘可见。可编辑网格的结构与可编辑多边形的结构完全不同,在 eMesh 中,您将迭代面,每个面都有三个顶点和三个边,其中没有一个与另一个面共享,这使得这些事情变得不必要地复杂。在 ePoly 中,结构是由边缘定义的,这使得循环和环形选择以及查找面之间共享的边缘(实际上是多边形)变得更加容易。

第2部分:

您需要一些额外的数据来实现这一点,例如面的中心(取决于几何体的扭曲程度,选择 getFaceCenter 或 getSafeFaceCenter 方法)。当你有了这些点,剩下的就很容易了,如果一个面的中心在另一个面的平面之上,它是较小的角度,你不要改变它,如果它是相反的,它是实施例(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 
)
于 2012-04-07T23:31:03.753 回答