2015-08-19 2 views
0

EDIT: Изменение уровня подразделения, кажется, сглаживает поверхность. Тем не менее, моя поверхность теперь, кажется, уменьшилась ... Я не могу вернуть ее к нормальному размеру. Почему это происходит и как я могу исправить эффект?Пользовательская геометрия Mesh - как триангуляция для того, чтобы выглядеть гладкой

Я надеюсь нарисовать сотни гладких плоскостей последовательно в 3D-пространстве для моделирования данных. Эти плоскости будут выглядеть несколько иначе, но для каждого из них я получаю только 4 угла плоскости - плюс произвольная точка в середине плоскости, чтобы придать поверхности небольшую кривизну для эстетической привлекательности.

Благодаря помощи этого сайта, я немного сгладил поверхность, но это похоже на пирамиду. Вот то, что я до сих пор:

var vertices = [SCNVector3(x: -5, y: 5, z: 0), 
        SCNVector3(x: 0, y: 5, z: -5), 
        SCNVector3(x: 5, y: 5, z: 0), 

        SCNVector3(x: 0, y: 5, z: 5), 
        SCNVector3(x: 0, y: 7, z: 0)] 

    var indices : [CInt] = [4,0,1, 
          4,1,2, 
          4,2,3, 
          4,3,0] 

    var normals = [SCNVector3]() 
    var normalMap = [Int : SCNVector3]() 
    for (var i = 0; i < vertices.count; i++) { 
     var origVec = SCNVector3(x: 0.0, y: 0.0, z: 0.0) 
     normalMap.updateValue(origVec, forKey: i) 
    } 


    //CALCULATE FACE NORMALS --> 
    for (var i = 0; i < vertices.count - 2; i++) { 
     var p1 = vertices[i] //B 
     var p2 = vertices[i + 1] //A 
     var p3 = vertices[vertices.count - 1] //C 

     var vector1 = SCNVector3(x: 0, y: 0, z: 0) 
     var vector2 = SCNVector3(x: 0, y: 0, z: 0) 

     vector1.x = p1.x - p2.x 
     vector1.y = p1.y - p2.y 
     vector1.z = p1.z - p2.z 

     vector2.x = p3.x - p2.x 
     vector2.y = p3.y - p2.y 
     vector2.z = p3.z - p2.z 

     var faceNormal = crossProduct(vector1, v2: vector2) 
     ((normalMap[i]!).x) += faceNormal.x 
     ((normalMap[i]!).y) += faceNormal.y 
     ((normalMap[i]!).z) += faceNormal.z 
     ((normalMap[i + 1]!).x) += faceNormal.x 
     ((normalMap[i + 1]!).y) += faceNormal.y 
     ((normalMap[i + 1]!).z) += faceNormal.z 
     ((normalMap[vertices.count - 1]!).x) += faceNormal.x 
     ((normalMap[vertices.count - 1]!).y) += faceNormal.y 
     ((normalMap[vertices.count - 1]!).z) += faceNormal.z 
    } 

    for (var i = 0; i < vertices.count; i++) { 
      normals.append(normalize(normalMap[i]!)) 
    } 



    //VERTEX SOURCE --> 
    var vertexSource = SCNGeometrySource(vertices: vertices, count: 5) 

    //NORMAL SOURCE --> 
    var normalSource = SCNGeometrySource(normals: normals, count: 5) 

    //INDICES AS DATA --> 
    var data = NSData(bytes: indices, length: countElements(indices) * sizeof(Int)) 

    //GEOMETRY ELEMENT --> 
    var geometryElement = SCNGeometryElement(data: data, primitiveType: .Triangles, primitiveCount: 4, bytesPerIndex: sizeof(CInt)) 

    //GEOMETRY --> 
    var geometry = SCNGeometry(sources: [vertexSource, normalSource], elements: [geometryElement]) 

    geometry.firstMaterial?.doubleSided = true 
    let node = SCNNode(geometry: geometry) 
    self.rootNode.addChildNode(node) 

Так как я хотел бы для этой пирамиды иш форму, чтобы выглядеть гладкой, мне просто нужно еще много проводных треугольников? Если да, то что такое «магическое число»?

Или, есть ли способ автоматизировать этот процесс триангуляции?

Или, возможно, я лаяю неправильное дерево и просто хочу посмотреть, как улучшить внешний вид модели с помощью освещения или затенения или чего-то подобного. Изменит ли подсчет подразделения какую-либо помощь?

Спасибо за любую помощь; Раньше я никогда не строил пользовательские геометрии.

+1

Если вы можете показать мне, что вы пытаетесь сделать, и то, что у вас есть, с помощью скриншотов, я, вероятно, скажу вам, что/почему/как бороться с подразделением, чтобы сохранить фигуры, получая гладкость. Но ... Я визуальный мыслитель (дизайнер), поэтому для меня ваши слова противоположны прозрачности. – Confused

+0

Не думайте, что у меня есть разрешение на обмен изображениями, @Confused, извините. Возможно, я могу объяснить текущую проблему в более визуальных терминах. Я достиг гладкой, трехмерной поверхности - представляю себе черепаховую оболочку внутри конуса мороженого. Нынешняя проблема заключается в том, что края оболочки черепахи не касаются стенок конуса мороженого из-за увеличения количества подразделений. – Harrison

+0

Подразделение тянет вещи внутрь от конечностей. Чтобы предотвратить это, вам нужно создать еще одно кольцо из полигонов/вершин прямо около края, которое вы не хотите слишком сильно искажать при разделении. Можете ли вы сделать это и по-прежнему получить гладкий контур вашей черепахи? – Confused

ответ

1

Обычный способ достижения гладких результатов без разбиения состоит в том, чтобы усреднить нормали вершин, прикасающихся к смежным плоскостям. Т.е. получить среднее значение всех нормалей в одном месте. Неясно, является ли это приемлемым решением или необходимо четко различать каждый самолет.

Вот ссылка, описывающая процесс (смотрите внизу): http://www.lighthouse3d.com/opengl/terrain/index.php3?normals

В заключение, каждая вершина должна иметь средний нормальный вектор окружающих полигонов.

+0

Спасибо, @reden. Я суммировал и усреднял нормализованные векторы лица, окружающие каждую вершину. Но моя форма по-прежнему выглядит довольно угловатой - каждое индивидуальное лицо все еще видно. – Harrison

+0

Увеличивает ли количество треугольных поверхностей более гладкую поверхность? @reden – Harrison

+0

Усреднение нормалей правильно должно дать вам гладкую сетку. Контур сетки все равно покажет полигоны. Просто чтобы быть ясным: вы усредняете нормали вокруг каждого угла? Не через все полигоны, соседствующие друг с другом? Итак, в конце концов, не все углы многоугольника имеют одинаковые нормали. – reden

Смежные вопросы